操作系统课程之“读者—写者”问题教学探讨
- 格式:doc
- 大小:32.00 KB
- 文档页数:6
操作系统课程设计课题:读者写者问题姓名:赫前进班级:1020552学号102055211指导教师:叶瑶提交时间:2012/12/30(一)实验目的1.进一步理解“临界资源”的概念;2.把握在多个进程并发执行过程中对临界资源访问时的必要约束条件;3.理解操作系统原理中“互斥”和“同步”的涵义。
(二)实验内容利用程序设计语言编程,模拟并发执行进程的同步与互斥(要求:进程数目不少于3 个)。
(三)、程序分析读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;(3)如果一个写进程正在进行操作,禁止任何读进程度文件。
实验要求用信号量来实现读者写者问题的调度算法。
实验提供了signal类,该类通过P( )、V( )两个方法实现了P、V原语的功能。
实验的任务是修改Creat_Writer()添加写者进程,Creat_Reader()创建读者进程。
Reader_goon()读者进程运行函数。
读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。
读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
在Windows 7 环境下,创建一个控制台进程,此进程包含n 个线程。
用这n 个线程来表示n 个读者或写者。
每个线程按相应测试数据文件(格式见下)的要求进行读写操作。
学号:课程设计课程名称操作系统学院计算机科学与技术学院专业软件工程班级姓名指导教师2014——2015学年第1学期1《操作系统原理》课程设计指导书课程编号:课程名称:操作系统/Operating System周数/学分:1周/1学分先修课程:高级语言程序设计、汇编语言、数据结构、计算机组成原理适用专业:计算机科学与技术、软件工程开课学院、系或教研室:计算机科学与技术学院一、课程设计的目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。
二、课程设计的内容和要求1.系统调用学习在Linux中产生一个系统调用以及怎样通过往Linux内核中增加一个新函数从而在该内核空间中实现对用户空间的读写。
这个函数的功能是返回当前的系统时间。
实验条件要求:每人一台Linux主机且有超级用户权限。
2.内核定时器通过研究内核的时间管理算法学习内核源代码。
然后应用这些知识并且使用“信号”建立一种用户空间机制来测量一个多线程程序的执行时间。
实验条件要求:每人一台Linux主机且有超级用户权限。
3.实现生产者消费者(Bounded – Buffer Problem)问题通过研究Linux的线程机制和信号量实现生产者消费者(Bounded Buffer)问题的并发控制。
实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。
4.实现读者写者(Reader-Writer Problem)问题通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。
实验条件要求:每人一台与Linux主机联网的Windows主机,普通用户权限。
三、课程设计进度安排四、课程设计说明书与图纸要求应包含如下内容:1.设计题目与要求2.总的设计思想及系统平台、语言、工具等。
3.数据结构与模块说明(功能与流程图)4.源程序5.运行结果与运行情况6.调试记录7.自我评析和总结五、课程设计评分标准注:优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格。
《计算机操作系统》实验报告题目读者写者问题学院(部)信息学院专业计算机科学与技术班级、学生姓名学号指导教师(签字)一、《二、问题描述一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。
允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。
但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。
所谓“读者——写着问题(Reader—Writer Problem)”是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题三、解决问题为实现Reader与Writer进程间在读或写是的互斥而设置了一个互斥的信号量Wmutex。
另外,在设置一个整型变量Readcount表示正在读的进程数目。
由于只要有一个Reader进程在读,便不允许Writer去写。
因此,仅当Readercount=0时,表示尚无Reader进程在读时,Reader进程才需要进行Wait(wmutex)操作。
若Wait(Wmutex)操作成功,Reader 进程便可去读,相应地,做Readcount+1操作。
同理,仅当Reader进程在执行了Readercount-1操作后其值为0时,才执行Signal(Wmutex)操作,以便让Writer进程写。
又因为Readercount是一个可被多个Reader 进程访问的临界资源,因此也应该为它设置一个互斥信号量rmutex。
四、代码实现1、读者优先#include<iostream>#include<>using namespace std;CRITICAL_SECTION rmutex,wmutex;int wr;$int readernum;DWORD WINAPI reader(LPVOID IpParamter){cout<<"读者申请\n";wr++;EnterCriticalSection(&rmutex);if(readernum==0)EnterCriticalSection(&wmutex);readernum++;cout<<"读者进入成功正在读取\n";LeaveCriticalSection(&rmutex);Sleep(2000);—EnterCriticalSection(&rmutex);readernum--;cout<<"读者退出\n";wr--;if(readernum==0)LeaveCriticalSection(&wmutex);LeaveCriticalSection(&rmutex);return 0;}DWORD WINAPI writer(LPVOID PM){cout<<"写者申请\n";&while(wr!=0){}EnterCriticalSection(&wmutex);cout<<"写者已进入正在写入\n";Sleep(500);cout<<"写者退出\n";LeaveCriticalSection(&wmutex);return 0;}int main(){readernum=0;#wr=0;InitializeCriticalSection(&rmutex);InitializeCriticalSection(&wmutex);HANDLE hr[5];//定义读者线程HANDLE hw[5];//定义写者线程//int thnum;int drn=0; //输入的读者个数int dwn=0; //输入的写者个数cout<<"输入读者写者线程 1代表读者 2代表写者 0代表结束"<<endl;int th[10];int num=0;^cin>>th[num];while(th[num]){if(th[num]==1){drn++;}if(th[num]==2){dwn++;}num++;cin>>th[num];}&int hr1=0,hw1=0;for(int j=0;j!=num;j++){if(th[j]==1){hr[hr1]=CreateThread(NULL,0,reader,NULL,0,NULL);hr1++;}if(th[j]==2){hw[hw1]=CreateThread(NULL,0,writer,NULL,0,NULL);hw1++;}}>WaitForMultipleObjects(drn, hr, TRUE, INFINITE);WaitForMultipleObjects(dwn, hw, TRUE, INFINITE);for(int i=0;i!=drn;i++){CloseHandle(hr[i]);}for(int i=0;i!=dwn;i++){CloseHandle(hw[i]);}DeleteCriticalSection(&rmutex);DeleteCriticalSection(&wmutex);return 0;(}2、写者优先#include<iostream>#include<>using namespace std;CRITICAL_SECTION rmutex,wmutex;int ww;int readernum;DWORD WINAPI reader(LPVOID IpParamter){cout<<"读者申请\n";!while(ww!=0){}EnterCriticalSection(&rmutex);if(readernum==0){EnterCriticalSection(&wmutex);}cout<<"读者进入成功正在读取\n";readernum++;LeaveCriticalSection(&rmutex);Sleep(2000);EnterCriticalSection(&rmutex);-readernum--;if(readernum==0)LeaveCriticalSection(&wmutex);cout<<"读者退出\n";LeaveCriticalSection(&rmutex);return 0;}DWORD WINAPI writer(LPVOID PM){ww++;cout<<"写者申请\n";EnterCriticalSection(&wmutex);{cout<<"写者已进入正在写入\n";Sleep(1000);cout<<"写者退出\n";ww--;LeaveCriticalSection(&wmutex);return 0;}int main(){readernum=0;ww=0;InitializeCriticalSection(&rmutex);|InitializeCriticalSection(&wmutex);HANDLE hr[5];//定义读者线程HANDLE hw[5];//定义写者线程int drn=0; //输入的读者个数int dwn=0; //输入的写者个数cout<<"输入读者写者线程 1代表读者 2代表写者 0代表结束"<<endl;int th[10];int num=0;cin>>th[num];while(th[num]){if(th[num]==1){、drn++;}if(th[num]==2){dwn++;}num++;cin>>th[num];}int hr1=0,hw1=0;for(int j=0;j!=num;j++){if(th[j]==1){》hr[hr1]=CreateThread(NULL,0,reader,NULL,0,NULL);Sleep(10);hr1++;}if(th[j]==2){hw[hw1]=CreateThread(NULL,0,writer,NULL,0,NULL);Sleep(10);hw1++;}}WaitForMultipleObjects(drn, hr, TRUE, INFINITE);*WaitForMultipleObjects(dwn, hw, TRUE, INFINITE);for(int i=0;i!=drn;i++){CloseHandle(hr[i]);}for(int i=0;i!=dwn;i++){CloseHandle(hw[i]);}DeleteCriticalSection(&rmutex);DeleteCriticalSection(&wmutex);return 0;}3、执行结果读者优先在读者优先中先两个读者申请,再一个写者申请,再有两个读者申请。
2.读者—写者问题读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。
计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。
就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。
对于读者优先,应满足下列条件:如果新读者到:①无读者、写者,新读者可以读;②有写者等待,但有其它读者正在读,则新读者也可以读;③有写者写,新读者等待。
如果新写者到:①无读者,新写者可以写;②有读者,新写者等待;③有其它写者,新写者等待。
单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数;rc_mutex 是用于对计数器rc 操作的互斥信号量;write表示是否允许写的信号量;于是读者优先的程序设计如下:int rc=0; //用于记录当前的读者数量semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量semaphore write=1; //用于保证读者和写者互斥地访问的信号量void reader() /*读者进程*/do{P(rc_mutex); //开始对rc共享变量进行互斥访问rc ++; //来了一个读进程,读进程数加1if (rc==1) P(write);//如是第一个读进程,判断是否有写进程在临界区,//若有,读进程等待,若无,阻塞写进程V(rc_mutex); //结束对rc共享变量的互斥访问读文件;P(rc_mutex); //开始对rc共享变量的互斥访问r c--; //一个读进程读完,读进程数减1if (rc == 0) V(write);//最后一个离开临界区的读进程需要判断是否有写进程//需要进入临界区,若有,唤醒一个写进程进临界区V(rc_mutex); //结束对rc共享变量的互斥访问} while(1)void writer() /*写者进程*/do{P(write); //无读进程,进入写进程;若有读进程,写进程等待写文件;V(write); //写进程完成;判断是否有读进程需要进入临界区,//若有,唤醒一个读进程进临界区} while(1)读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。
课程设计读者写者问题一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握读者写者问题的基本概念和相关原理;技能目标要求学生能够运用所学知识解决实际问题,如设计并发控制算法;情感态度价值观目标要求学生培养团队合作意识,提高解决复杂问题的信心。
教学目标的具体、可衡量性体现在:学生能够准确地描述读者写者问题的定义和特点;能够运用基本的并发控制算法解决读者写者问题;在团队项目中,能够有效地协作,共同完成任务。
二、教学内容根据课程目标,本课程的教学内容主要包括读者写者问题的基本概念、并发控制算法及其应用。
教学大纲按照以下顺序安排:1.读者写者问题的定义、特点及分类;2.基本并发控制算法:锁、信号量、管程等;3.读者写者问题的解决方案及评价;4.实际应用案例分析。
教材选用《计算机操作系统》一书,章节安排与教学大纲相对应。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。
主要包括:1.讲授法:讲解基本概念、原理和算法;2.讨论法:分组讨论解决方案,促进学生思考;3.案例分析法:分析实际应用案例,提高学生解决实际问题的能力;4.实验法:动手实现并发控制算法,培养实际操作能力。
四、教学资源教学资源包括教材、参考书、多媒体资料和实验设备。
教材《计算机操作系统》提供理论知识;参考书补充拓展相关内容;多媒体资料生动展示原理和算法;实验设备支持学生动手实践。
教学资源的选择和准备旨在支持教学内容和教学方法的实施,丰富学生的学习体验,提高学习效果。
五、教学评估本课程的评估方式包括平时表现、作业、考试等,以全面反映学生的学习成果。
平时表现主要评估学生在课堂讨论、提问等方面的参与度;作业分为课后练习和实验报告,评估学生对知识的掌握和实际操作能力;考试则评估学生对课程知识的全面理解。
评估方式力求客观、公正,确保学生在各个方面的努力和进步都能得到合理的评价。
评估结果将作为学生课程成绩的重要组成部分,以激发学生的学习积极性。
操作系统课程设计报告一、操作系统课程设计任务书读者-写者问题实现1设计目的通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。
2 设计要求在Windows 2000/XP环境下,使用多线程和信号量机制实现经典的读者写者问题,每个线程代表一个读者或一个写者。
每个线程按相应测试数据文件的要求,进行读写操作。
请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:(1)写-写互斥,即不能有两个写者同时进行写操作(2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写(3)读-读允许,即可以有二个以上的读者同时读读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。
3 测试数据文件格式测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。
每行测试数据包括四个字段,各字段间用空格分隔。
第一字段为一个正整数,表示线程序号。
第二字段表示相应线程角色,R 表示读者是,W 表示写者。
第三字段为一个正数,表示读写操作的开始时间。
线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。
第四字段为一个正数,表示读写操作的持续时间。
当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。
下面是一个测试数据文件的例子:1 r 3 52 w 4 53 r 5 24 r 6 55 w 5.1 34 相关API函数CreateThread()在调用进程的地址空间上创建一个线程ExitThread()用于结束当前线程Sleep()可在指定的时间内挂起当前线程CreateMutex()创建一个互斥对象,返回对象句柄OpenMutex()打开并返回一个已存在的互斥对象句柄,用于后续访问ReleaseMutex()释放对互斥对象的占用,使之成为可用WaitForSingleObject()可在指定的时间内等待指定对象为可用状态InitializeCriticalSection()初始化临界区对象EnterCriticalSection()等待指定临界区对象的所有权LeaveCriticalSection()释放指定临界区对象的所有权文件系统的设计通过对文件系统的设计,加深理解文件系统的内部功能及内部实现。
读者于写者问题课程设计一、教学目标本课程的教学目标是帮助学生理解并掌握“读者于写者问题”的相关概念和理论,培养学生对于文本的深入解读和批判性思维能力。
具体分为以下三个部分:知识目标:学生能够准确地掌握读者反应理论和作者意图理论的基本概念,了解不同读者和写者对于文本的影响和作用。
技能目标:学生能够运用所学的理论知识,对于给定的文本进行深入解读和分析,并能够就文本内容进行批判性的思考和讨论。
情感态度价值观目标:通过对于不同读者和写者问题的探讨,培养学生尊重多元观点和包容差异的态度,增强对于文本的理解和欣赏能力。
二、教学内容本课程的教学内容主要包括读者反应理论和作者意图理论两个部分。
具体内容包括:1.读者反应理论:介绍读者反应理论的基本概念和主要观点,分析读者的阅读过程和文本理解的影响因素。
2.作者意图理论:讲解作者意图理论的基本原理和应用方法,探讨作者的意图和文本的意义之间的关系。
3.读者与写者的互动:讨论读者和写者之间的相互作用和平衡,分析读者对于文本的影响和写者的创作意图的实现。
三、教学方法为了达到本课程的教学目标,将采用多种教学方法进行教学,包括:1.讲授法:通过教师的讲解和阐述,系统地传授读者反应理论和作者意图理论的相关知识。
2.讨论法:学生进行小组讨论和全班讨论,鼓励学生提出自己的观点和思考,培养学生的批判性思维能力。
3.案例分析法:通过分析具体的案例和文本,让学生亲身体验和理解读者反应理论和作者意图理论的应用和意义。
四、教学资源为了支持和丰富本课程的教学内容和方法,将利用多种教学资源,包括:1.教材:选用合适的教材,提供全面系统的读者反应理论和作者意图理论的知识框架。
2.参考书:推荐相关的参考书籍,供学生进一步深入学习和研究。
3.多媒体资料:利用多媒体资料,如视频、音频、图片等,增加教学的趣味性和形象性。
4.实验设备:根据需要,安排适当的实验设备,让学生进行实证研究和实践操作。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面客观地评价学生的学习成果。
课程设计采用“写优先”策略的“读者-写者”问题学号:************名:***专业:计算机科学与技术指导教师:爱新觉罗日期:2013年3月22 日一、设计目的与内容课程设计的目的:操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
※进一步巩固和复习操作系统的基础知识。
※培养学生结构化程序、模块化程序设计的方法和能力。
※提高学生调试程序的技巧和软件设计的能力。
※提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。
设计内容:用高级语言编写和调试一个采用“写优先”策略的“读者-写者”问题的模拟程序。
设计要求:1. 读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入2. 读者与写者均有二个以上,可在程序运行期间动态增加读者与写者3. 可读取样例数据(要求存放在外部文件中),进行读者/写者、进入内存时间、读写时间的初始化4. 要求将运行过程用可视化界面动态显示,可随时暂停,查看阅览室中读者/写者数目、读者等待队列、写者等待队列、读写时间、等待时间5. 读写策略为:读写互斥、写写互斥、写优先(只要写者到达,就阻塞后续的所有读者,一旦阅览室无人,写者能最快进入阅览室;在写者未出阅读室之前,又有新的读者与写者到达,仍然是写者排在前面)二、算法的基本思想设计思想分别用三个队列来存放输入的数据的PRO1队列和就绪的读者进程写者进程的队列PRO2和和正在运行的读者写者队列PRO3。
只有当互斥信号量W MUTEX=1表示无资源占用CPU,写者进入PRO3进行写。
当互斥信号量若W MUTEX=0表示有资源占用CPU,若READCOUNT>0说明有读者再读,由于读写互斥,写者不操作,等待。
若当前读者数READCOUNT=0时,有写者,因为写写互斥,写者不进入,等待。
涉及到的数据结构struct ThreadInfo{int nSerialNo; // 线程序号char cType; // 线程类别(判断是读者还是写者线程)int dDelayTime; // 线程开始时间int dOpeTime; // 线程操作时间int runtime; //线程运行时间struct ThreadInfo *next;};基本功能模块主函数模块1)函数原形:void main();2)功能:初始化链表,调用menu()函数显示主界面就绪模块1)函数原形:void ready(int i)2)功能:把pro1中就绪的读者写者信息移到队列pro2尾部3)变量及类型:ThreadInfo *p,*q,*j,*k;:定义指针变量,使队列变量int flag=0;标记,为0时,未开辟空间,为1时,,开辟空间,需释放显示模块1) 函数原形:void print1()void print2()2) 功能:print1()函数,显示文件中读者写者的信息,print2()函数显示写优先的读者写者进程运行情况。
2.读者—写者问题读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。
计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。
就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。
对于读者优先,应满足下列条件:如果新读者到:①无读者、写者,新读者可以读;②有写者等待,但有其它读者正在读,则新读者也可以读;③有写者写,新读者等待。
如果新写者到:①无读者,新写者可以写;②有读者,新写者等待;③有其它写者,新写者等待。
单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数;rc_mutex 是用于对计数器rc 操作的互斥信号量;write表示是否允许写的信号量;于是读者优先的程序设计如下:int rc=0; //用于记录当前的读者数量semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量semaphore write=1; //用于保证读者和写者互斥地访问的信号量void reader() /*读者进程*/do{P(rc_mutex); //开始对rc共享变量进行互斥访问rc ++; //来了一个读进程,读进程数加1if (rc==1) P(write);//如是第一个读进程,判断是否有写进程在临界区,//若有,读进程等待,若无,阻塞写进程V(rc_mutex); //结束对rc共享变量的互斥访问读文件;P(rc_mutex); //开始对rc共享变量的互斥访问r c--; //一个读进程读完,读进程数减1if (rc == 0) V(write);//最后一个离开临界区的读进程需要判断是否有写进程//需要进入临界区,若有,唤醒一个写进程进临界区V(rc_mutex); //结束对rc共享变量的互斥访问} while(1)void writer() /*写者进程*/do{P(write); //无读进程,进入写进程;若有读进程,写进程等待写文件;V(write); //写进程完成;判断是否有读进程需要进入临界区,//若有,唤醒一个读进程进临界区} while(1)读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。
“读者-写者”算法的讨论和改进作者:宋锦华李伟来源:《中小企业管理与科技·上旬刊》2011年第05期摘要:读者与写者问题是操作系统中的经典进程同步问题之一,文章利用操作系统中的信号量及信号量上的P、V操作,按照教学的方法和思路对传统的读者-写者算法进行了探讨,并将算法加以改进,实现了写者优先功能,同时保证多个并发进程在执行过程中的正确性。
关键词:读者与写者操作系统信号量1 相关概念1.1 利用信号量解决进程间的制约关系多道程序设计环境下,系统中同时执行多个作业进程,这些进程同时共享和竞争系统中的资源,因此必然存在一定的制约关系。
进程间的这些制约关系可分为互斥与同步两种。
互斥即:一个进程对系统中的共享变量或临界资源进行操作时,为了保证它和系统中其它进程的正确执行,不允许其它进程同时对这些共享变量和临界资源进行操作。
同步指:一个进程运行到了某一点时,需要等待其它进程完成某种操作或发来信息,才能继续运行。
那么,如何来控制进程间的互斥和同步,使它们正确运行呢?利用信号量以及信号量上的P、V操作能够很好的解决进程间的互斥与同步关系,从而保证进程的正确执行。
对于互斥来说,假定设置信号量为S,那么,将S的初值设为1,在临界区之前安排P(S)操作,临界区之后安排V(S)操作即可。
对于同步来说,信号量S的初值设为0,在请求同步点安排P(S)操作,在准备同步条件点安排V(S)操作即可。
本文讨论的是操作系统中很经典的进程同步问题之一——读者写者问题。
1.2 传统的读者写者问题一批数据被多个并发进程共享使用。
其中一些进程只要求读数据,因此称为“读者”,一些进程会对数据进行修改,称为“写者”。
多个读者共同工作时,访问不会有问题,但是读者和写者共同访问或者写者和写者共同修改数据时,就有可能会出错,导致错误的访问结果。
因此,关于读者和写者的读写限制,可以分为这样三条:①写-写互斥,即不能有两个写者同时对数据进行写操作。
操作系统课程设计读者写者问题Last updated on the afternoon of January 3, 2021计算机与信息学院操作系统课程设计报告一、开题报告(一)该项课程设计的意义;1.更加深入的了解读者写者问题的算法;2.加深对线程,进程的理解;3.加深对“线程同步”概念的理解,理解并应用“信号量机制”;4.熟悉计算机对处理机的管理,了解临界资源的访问方式;5.了解C++中线程的实现方式,研读API。
(二)课程设计的任务多进程/线程编程:读者-写者问题。
●设置两类进程/线程,一类为读者,一类为写者;●随机启动读者或写者;●显示读者或写者执行状态;●随着进程/线程的执行,更新显示;(三)相关原理及算法描述;整体概况:该程序从大体上来分只有两个模块,即“读者优先”和“写者优先”模块.读者优先:如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount 记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时.每个读者准备读.等待互斥信号,保证对readcount的访问,修改互斥.即readcount++.而当读者线程进行读操作时,则读者数目减少(readcount--).当readcout=0时,说明所有的读者都已经读完,离开临界区唤醒写者(LeaveCriticalSection(&RP_Write);),释放互斥信号(ReleaseMutex(h_Mutex)).还需要一个互斥对象mutex来实现对全局变量Read_count修改时的互斥.另外,为了实现写-写互斥,需要增加一个临界区对象Write。
当写者发出写请求时,必须申请临界区对象的所有权。
通过这种方法,可以实现读-写互斥,当Read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权写者优先:写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。
2.读者—写者问题读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。
计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。
就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。
对于读者优先,应满足下列条件:如果新读者到:①无读者、写者,新读者可以读;②有写者等待,但有其它读者正在读,则新读者也可以读;③有写者写,新读者等待。
如果新写者到:①无读者,新写者可以写;②有读者,新写者等待;③有其它写者,新写者等待。
单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数;rc_mutex 是用于对计数器rc 操作的互斥信号量;write表示是否允许写的信号量;于是读者优先的程序设计如下:int rc=0; //用于记录当前的读者数量semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量semaphore write=1; //用于保证读者和写者互斥地访问的信号量void reader() /*读者进程*/do{P(rc_mutex); //开始对rc共享变量进行互斥访问rc ++; //来了一个读进程,读进程数加1if (rc==1) P(write);//如是第一个读进程,判断是否有写进程在临界区,//若有,读进程等待,若无,阻塞写进程V(rc_mutex); //结束对rc共享变量的互斥访问读文件;P(rc_mutex); //开始对rc共享变量的互斥访问r c--; //一个读进程读完,读进程数减1if (rc == 0) V(write);//最后一个离开临界区的读进程需要判断是否有写进程//需要进入临界区,若有,唤醒一个写进程进临界区V(rc_mutex); //结束对rc共享变量的互斥访问} while(1)void writer() /*写者进程*/do{P(write); //无读进程,进入写进程;若有读进程,写进程等待写文件;V(write); //写进程完成;判断是否有读进程需要进入临界区,//若有,唤醒一个读进程进临界区} while(1)读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。
操作系统读者写者问题报告一、引言操作系统中的读者写者问题是一个经典的同步问题,它涉及多个进程对共享资源的访问,需要保证数据的正确性和一致性。
本报告将介绍读者写者问题的背景、定义、解决方法以及实现过程。
二、背景读者写者问题最早由Dijkstra在1965年提出,它是一个典型的并发控制问题。
在多进程环境下,当多个进程同时访问共享资源时,容易发生冲突和竞争条件。
读者写者问题就是其中比较常见和重要的一种。
三、定义读者写者问题是指有多个进程同时访问一个共享资源,其中有些进程只是读取该资源,而另一些进程则需要修改该资源。
为了保证数据的正确性和一致性,必须采取某种机制来控制这些进程对共享资源的访问。
四、解决方法1. 互斥锁:使用互斥锁来保证同一时间只有一个进程可以访问共享资源。
这种方法简单易行,但可能会导致饥饿现象。
2. 信号量:使用信号量来实现对共享资源的访问控制。
其中包括两个信号量:一个用于记录正在访问该资源的读者数量,另一个用于记录正在访问该资源的写者数量。
这种方法可以避免饥饿现象,但可能会导致死锁。
3. 读写锁:使用读写锁来实现对共享资源的访问控制。
读写锁包括两种类型:读锁和写锁。
多个进程可以同时获得读锁,但只有一个进程可以获得写锁。
这种方法可以提高并发性能,但实现较为复杂。
五、实现过程下面以信号量为例介绍如何实现读者写者问题:1. 定义两个全局变量readcount和writecount,分别表示正在访问该资源的读者数量和写者数量。
2. 定义两个信号量mutex和wrt,初始化为1。
3. 读者进程:a. P(mutex);b. readcount++;c. 如果readcount==1,则P(wrt);d. V(mutex);e. 读取共享资源;f. P(mutex);g. readcount--;h. 如果readcount==0,则V(wrt);i. V(mutex)。
4. 写者进程:a. P(wrt);b. 写入共享资源;c.V(wrt)。
第22期 计算机教育2011年11月25日 Computer Education No.22 Nov.25,201156文章编号:1672-5913(2011)22-0056-03 中图分类号:G642 文献标识码:A操作系统课程之“读者—写者”问题教学探讨邱剑锋1,谢 娟2,李龙澍1,汪继文1,李 炜1(1.安徽大学 计算机科学与技术学院,安徽 合肥 230039;2.安徽建筑工业学院 数理系,安徽 合肥 230601)摘 要:针对操作系统教学中概念多而繁杂、容易混淆,初学者存在畏难情绪等问题,文章提出采取类比、逐层解剖、层层深入、循序渐进的教学方法,并以操作系统中的进程同步互斥问题中“读者-写者”问题为例,对其概念、算法进行形象启发、分层解剖的阐述,并结合多种教学方法,说明使学生能更深刻地理解进程同步互斥问题的方法。
教学实践表明其效果良好。
关键词:操作系统;分层解剖;读者-写者问题;PV 原语;教学实践操作系统是计算机专业的一门核心课程(图1),其在计算机系统中的特殊地位,使得该课程的学习在整个计算机学科教育中显得尤为重要。
作为一门理论性和实践性并重的课程,它具有概念多、算法较抽象的特点,同时又涉及了程序设计语言、软件工程思想、算法设计、计算机系统结构、网络等相关知识。
枯燥的理论讲述往往使学生感到抽象、难懂,进而产生厌学的思想。
尽管近年来一些高校在加强理论教学的同时,引入对操作系统内核的分析,如Linux 操作系统,在教学实践方面取得了一点的成效,但是对于初学者和教师而言,在一个学期内课时数不变的情况下,完成教与学的工作显得有点心有余而力不足。
图1 操作系统是多门计算机专业课程的基础为了在有限的教学时间内,提高教学效率,既让学生深入理解理论知识,又能借助PV 操作原语来验证操作系统的算法思想,笔者根据以往教学经验,结合初学者学习的实际情况,以进程同步中“读者-写者”为例,探讨如何由浅入深、循序渐进地开展教学工作。
目录一、课程设计目的及要求 (1)二、相关知识 (1)三、题目分析 (2)四、概要设计 (4)五、代码及流程 (5)六、运行结果 (11)七、设计心得 (12)八、参考文献 (12)一、课程设计目的及要求读者与写者问题(进程同步问题)用n 个线程来表示n个读者或写者。
每个线程按相应测试数据文件的要求,进行读写操作。
请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:1)写-写互斥;2)读-写互斥;3)读-读允许;写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
二、相关知识Windows API:在本实验中涉及的API 有:1线程控制:CreateThread 完成线程创建,在调用进程的地址空间上创建一个线程,以执行指定的函数;它的返回值为所创建线程的句柄。
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, // SDDWORD dwStackSize, // initial stack sizeLPTHREAD_START_ROUTINE lpStartAddress, // threadfunctionLPVOID lpParameter, // thread argumentDWORD dwCreationFlags, // creation optionLPDWORD lpThreadId // thread identifier);2 ExitThread 用于结束当前线程。
VOID ExitThread(DWORD dwExitCode // exit code for this thread);3Sleep 可在指定的时间内挂起当前线程。
VOID Sleep(DWORD dwMilliseconds // sleep time);4信号量控制:WaitForSingleObject可在指定的时间内等待指定对象为可用状态;DWORD WaitForSingleObject(HANDLE hHandle, // handle to objectDWORD dwMilliseconds // time-out interval);hHandle为等待的对象,也就是实现同步或者互斥的对象。
操作系统——读者写者问题⼀、问题描述要求:1、允许多个读者可以同时对⽂件执⾏读操作。
2、只允许⼀个写者往⽂件中写信息。
3、任⼀写者在完成写操作之前不允许其他读者或写者⼯作。
4、写者执⾏写操作前,应让已有的读者和写者全部退出。
⼆、问题分析读者写者问题最核⼼的问题是如何处理多个读者可以同时对⽂件的读操作。
三、如何实现semaphore rw = 1; //实现对⽂件的互斥访问int count = 0;semaphore mutex = 1;//实现对count变量的互斥访问int i = 0;writer(){while(1){P(rw); //写之前“加锁”写⽂件V(rw); //写之后“解锁”}}reader (){while(1){P(mutex); //各读进程互斥访问countif(count==0) //第⼀个读进程负责“加锁”{P(rw);}count++; //访问⽂件的进程数+1V(mutex);读⽂件P(mutex); //各读进程互斥访问countcount--; //访问⽂件的进程数-1if(count==0) //最后⼀个读进程负责“解锁”{V(rw);}V(mutex);}}只要有源源不断的读进程存在,写进程就要⼀直阻塞等待,可能会造成“饿死”,在上述的算法中,读进程是优先的,那么应该怎么样来改造呢?新加⼊⼀个锁变量w,⽤于实现“写优先”!这⾥我们来分析⼀下读者1->写者1->读者2这种情况。
第⼀个读者1在进⾏到读⽂件操作的时候,有⼀个写者1操作,由于第⼀个读者1执⾏了V(w),所以写者1不会阻塞在P(w),但由于第⼀个读者1执⾏了P(rw)但没有执⾏V(rw),写者1将会被阻塞在P(rw)上,这时候再有⼀个读者2,由于前⾯的写者1进程执⾏了P(w)但没有执⾏V(w),所以读者2将会被阻塞在P(w)上,这样写者1和读者2都将阻塞,只有当读者1结束时执⾏V(rw),此时写者1才能够继续执⾏直到执⾏V(w),读者2也将能够执⾏下去。
操作系统课程之“读者—写者”问题教学探讨摘要:针对操作系统教学中概念多而繁杂、容易混淆,初学者存在畏难情绪等问题,文章提出采取类比、逐层解剖、层层深入、循序渐进的教学方法,并以操作系统中的进程同步互斥问题中“读者-写者”问题为例,对其概念、算法进行形象启发、分层解剖的阐述,并结合多种教学方法,说明使学生能更深刻地理解进程同步互斥问题的方法。
教学实践表明其效果良好。
关键词:操作系统;分层解剖;读者-写者问题;PV原语;教学实践操作系统是计算机专业的一门核心课程(图1),其在计算机系统中的特殊地位,使得该课程的学习在整个计算机学科教育中显得尤为重要。
作为一门理论性和实践性并重的课程,它具有概念多、算法较抽象的特点,同时又涉及了程序设计语言、软件工程思想、算法设计、计算机系统结构、网络等相关知识。
枯燥的理论讲述往往使学生感到抽象、难懂,进而产生厌学的思想。
尽管近年来一些高校在加强理论教学的同时,引入对操作系统内核的分析,如Linux操作系统,在教学实践方面取得了一点的成效,但是对于初学者和教师而言,在一个学期内课时数不变的情况下,完成教与学的工作显得有点心有余而力不足。
为了在有限的教学时间内,提高教学效率,既让学生深入理解理论知识,又能借助PV操作原语来验证操作系统的算法思想,笔者根据以往教学经验,结合初学者学习的实际情况,以进程同步中“读者-写者”为例,探讨如何由浅入深、循序渐进地开展教学工作。
1 问题描述“读者—写者”问题是现代操作系统中经典的进程同步互斥问题,在以C/S模式为代表的多进(线)程通信系统都可以作为该模型的不同表现形式,有着广泛的应用[1]。
该问题描述如下:一个数据文件或记录可被多个进程所共享,我们将其中只要求读该文件的进程称为读者,即“Reader进程”,其他进程称为写者,即“Writer进程”。
多个Reader 进程和多个Writer进程在某个时间段内对该文件资源进行异步操作,也就是说允许多个进程同时读一个共享对象,但绝不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象,因此,所谓“读者—写者问题”就是指必须保证一个Writer进程和其他进程(Writer进程和Reader进程)互斥地访问共享对象的同步问题[2]。
两者的读写操作限制如下[3]:1) 写—写互斥,即不允许多个写者同时对文件进行写操作;2) 读—写互斥,即不允许读者和写者同时对文件分别进行读写操作;3) 读—读允许,即允许多个读者同时对文件进行读操作。
基金项目:2009年国家级质量工程安徽大学计算机应用技术创新实验区项目(2009027042);安徽省教育厅教改项目(2008jyxm274);安徽省高等学校优秀青年人才基金项目资助(2011SQRL018);安徽大学青年科学研究基金(KJQN1015)。
2 分层解剖,降低难度PV操作及同步互斥的实现是操作系统中重点难点内容之一,其中读者写者问题又是PV操作中经典的案例,为了使学生更好地理解这个知识点,在教学实践中,笔者采用分层解剖、化解难点、由浅到深的教学方法,取得了较好的教学效果。
“读者—写者”问题是一个有代表性的进程同步问题,作为初学者要做到透彻理解并不容易,但是如果我们将该问题进行细分,由简单到复杂,理解难度将大大降低,在每一种情况下都需要满足上述的读写规则。
1) 一个读者,一个写者共享一个数据文件。
为了更好地让学生理解,我们把抽象的问题具体化。
将一个读者比喻为一个学生小明,而一个写者比喻为老师王老师,而一个数据文件比喻成一个公告版。
在该情况下,可以理解为王老师负责修改布告版的内容,小明只能去阅读报告版的内容。
王老师对布告版内容修改时小明不能去读,反之,小明读的时候王老师也不能去修改。
显然,这是一个简单的互斥问题。
解决这个问题时,我们只需设置一个互斥信号量Wmutex,表示写进程与读进程互斥地访问数据文件,初值为1。
读进程:while(TRUE){P(Wmutex);读数据文件;V(Wmutex);}2) 一个读者,多个写者共享一个数据文件。
类似地,我们仍将一个读者比喻为学生小明,而这个时候写者有多个,这里以两个写者为例,分别称作王老师和赵老师,而数据文件仍比喻成公告版。
在这里,小明和两位写者之间是互斥的,王老师和赵老师之间作为写者也是互斥地去访问数据文件,所以解决方法如第一种情况所示,在此不再赘述。
3) 多个读者,一个写者共享一个数据文件。
这里我们有多个读者,我们以两个为例,分别称之为小明和小强,而这个时候写者为一个称之为王老师,而数据文件仍比喻成公告版。
根据读写规则,小明和小强可以同时访问数据文件,因为读是不会使数据文件发生混乱的,而王老师和小明、小强之间必须满足互斥,即只有当小明和小强都不读时,王老师才可以写数据文件,反之,当王老师执行写操作时,小明和小强中任一个人都不能执行读操作。
根据上述思路,我们给出以下解决方案,在保留写互斥信号量Wmutex基础上,增加共享变量Readcount,该变量记录当前正在读数据集的读进程数目,初值为0。
此外,注意到Readcount是一个可被多个Reader进程访问的临界资源,因此也需对它进行互斥访问,设置一个读互斥信号量Rmutex,表示读进程互斥地访问共享变量Readcount,初值为1。
算法描述为:几点说明:a. 这个时候允许多个读进程在读,而读和写是互斥的,所以必须有个变量记录读者的数目,Readcount就起到这个作用,即可以被多个读进程访问的临界资源,所以必须互斥访问。
上述Reader( )过程中的两对P(Rmutex)、V(Rmutex)表示对Readecount这个共享变量的互斥访问操作。
b. 在Reader( )进程中,如果是第一个来访问的读者(通过Readcount来判断),执行P(Wmutex),阻止写者,防止在读的过程中受到写者的干扰。
如果不是第一个来访问的读者,直接执行Readcount加1操作,因为按照规则,多个读者可以同时访问数据文件。
类似地,在读完数据文件后,仍然先要去访问Readcount这个共享变量,如果不是最后一个读者,就不能释放资源Wmutex,反之则通过V(Wmutex)操作通知写者writer( )可以执行写操作。
4) 多个读者,多个写者共享一个数据文件。
这种情况和3)非常相似,虽然有多个写者去访问数据文件,但仍需满足读者和写者的互斥、写者和写者的互斥,所以该情况下的解决方案和3)相同,在此不再赘述。
3 引入管程机制解决“读者—写者”问题通过分层教学,将难点层层解剖使学生理解了“读者—写者”的概念,此时注意引导、启发学生注意到在用信号量机制解决同步问题时,往往比较繁琐这样一个问题,很自然地引入到采用面向对象的程序设计思想,将资源及对资源的共享操作封装起来,即用管程来管理进程同步互斥问题,实现“读者—写者”问题,使用起来会更加方便。
下面将实现的主要思想描述如下:在具体使用管程机制来实现读者与写者问题时,首先建立一个管程,命名为ReaderWriter进程。
其中包括以下几个过程:1) Read( )过程。
读者利用该过程获取数据块并拥有数据块中的数据,用整型变量ReaderCount来表示现在正在读取数据块中的数据的读者数量,当ReaderCount为0且条件变量MesState不为0或-1时,读者尚须等待。
当ReaderCount大于0时,预示着当前数据块已被读者进程占有,条件变量MesState 应为1,此时其他读者可以进入数据块读取数据信息。
2) EndRead( )过程。
读者读完数据后退出管程,释放数据资源,同时ReaderCount的数量做减1操作。
当ReaderCount的数量不为0时,不允许写者占用该数据资源;当ReaderCount的数量变为0时,将mesStated的值更改为0,以示数据资源现处于空闲状态,允许读者和写者竞争该数据块资源。
3) Write( )过程。
模拟写者利用该过程占有数据块以及获取数据块中的数据,写者可以修改数据。
写者具有追加、删除、修改数据的权限。
写者占有管程及数据块时条件变量MesState的值更改为-1,以示其他写者及所有读者均须等待该写者完成此次操作完成后,才有机会访问该资源,实现读者和写者的互斥、写者和写者的互斥。
当写者完成写操作后,释放管程及数据块资源,将MesState的值更改为0,以唤醒在等待对列的其他进程竞争该资源。
4 结语将操作系统中的一个复杂的进程同步与互斥问题分解成若干个简单的问题,由浅入深,层层解析,逐步扩展,在讲清基本概念之后,进一步采取启发式教学,进一步深化学生对该问题的认识。
该教学方法符合教育教学规律,降低了难度,便于学生掌握课程的重难点,加深了关于同步问题的理解,提高了学习效率,教学效果也非常显著。
参考文献:[1] Crow ley C P. Operating systems: a design-oriented approach [M]. Beijing:World Publishing Co,1999:100-126.[2] 汤小丹,梁红兵,哲凤屏,等. 计算机操作系统[M]. 3版. 西安:西安电子科技大学出版社,2007:58-61.[3] 帖军,陆际光. 同步互斥机制中的读者-写者模型[J]. 中南民族大学学报:自然科学版,2005,24(3):67-70.Discussion on Teaching of “Reader-Writer” Problem in Operating SystemQIU Jianfeng1, XIE Juan2, LI Longshu1, WANG Jiwen1, LI Wei1(1. School of Computer Science and Technology, Anhui University, Hefei 230039,China;2. Department of Mathematics and Physics, Anhui University of Architecture, Hefei 230022, China )Abstract: Operating System course have some characteristics of multi-concept, confused algorithm, which makes it difficult for students to understand and master the course. To resolve the problem, analogy, stratified dissection and evolutionary teaching methods are introduced into the Operating System course. The application of these teaching methods is illustrated by taking producer-consumer problem as an example and make some explanation about the concept and algorithm by heuristics and stratified dissection. To make students comprehend the problem of course’s synchronization and mutex profoundly, various teaching methods are combined. The teaching practice shows good effect.Key words: Operating System; stratified dissection; reader-writer problem; PVprimitive; teaching practice。