《操作系统课程设计说明书--读者写者问题.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计说明书--读者写者问题.docx(14页珍藏版)》请在优知文库上搜索。
1、课程设计说明书题目:读者写者问题课程:操作系统院(部):计算机科学与技术学院专业:软件工程目录课程设计任务书错误!未定义书签。题目生产者消费者问题2、问描述与基本要求.2二、问题分析与算法描述2三、程序设计2、?1不呈.SjH贝U青52k12*13课程设计指导教师评语错误!未定义书签。设计题目读者写者问题已知技术参数和设计要求已知技术参数:读者-写者问题的读写操作限制(包括读者优先和写者优先)1)写一写互斥:不能有两个写者同时进行写操作2)读-写互斥:不能同时有一个在读,而另一个在写。3)读-读允许:可以有一个或多个读者在读。读者优先的附加限制:如果读者申请进行读时已有另一个读者正在读作,则该
2、读者可直接开始读。写者优先的附加限制:如果一个读者申请进行读时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。设计要求:要求能创建多个读者,写者,并在每个读者/写者创建时、发出读写申请时、开始读/写操作和结束读/写操作时分别显示一行提示信息,以检查所有处理都遵守相应的读写操作限制。设计内容与步骤设计内容:在WinCIoWS环境下,利用WineIoWSAPI,实现读者写者问题,包括读者优先和写者优先。设计步骤:L问题的定义与分析。根据设计题目的要求,分析和理解问题。2 .概要设计及流程图。根据题目所涉及内容,参照所学知识,确定解决/设计方案,画出相关流程图
3、。3 .问题的实现与编码。4 .调试与测试。根据题目内容设计测试用例,使之能够充分证明设计完成的正确性。5 .总结分析。设计工作计划与进度安排L系统实现8学时2.课程设计说明书2学时设计考核要求1、设计情况(80%)2、考勤情况(20%)题目读者写者问题一、问题描述与基本要求VarRNinteger;L,mx:semaphore:=RN,1;BeginParbeginReader:beginRepeatSwait(L,1,1);Swait(mx,1,0);Performreaderoperation;Ssignal(L,1);Untilfalse;EndWriter:beginRepeatSw
4、ait(mx,1,1,1,RN,0);Performwriteroperation;Ssignal(mx,1);Untilfalse;EndParendEnd其中,Swait(mx,1,0)语句起着开关作用,只要无Writer进程进入写,mx=l,reader进程就都可以进入读。但是要一旦有Writer进程进入写时,其MXR,则任何reader进程就都无法进入读。Swait(mx,1,1,1,RN,0)语句表示仅当既无Write进程在写(mx=l),又无reader进程在读(L=RN)时,Writer进程才能进入临界区写。二、问题分析与算法描述在WineioWS7环境下,创建一个包含n个线程的
5、控制台进程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。读者-写者问题的读写操作限制:读者-写者的读写限制(包括读者优先和写者优先)D写-写互斥,即不能有两个写者同时进行写操作2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写3)读读允许,即可以有2个以上的读者同时读将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些
6、只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:1)任意多个读进程可以同时读这个文件;2)一次只有一个写进程可以往文件中写;3)如果一个写进程正在进行操作,禁止任何读进程度文件。我们需要分两种情况实现该问题:读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。三、程序设计程序由两部分组成:Io读者-写者模块:包括系统调用接口,读者-写者活动描述主程序。系统接口主
7、要功能是通过管道向父进程发送系统调用命令,并读取父进程送来的返回值。读者-写者活动程序根据临界资源的共享,互斥原则编制,具体见源程序。2。主控模块:主控模块实现系统初始化系统调用命令接收与解释执行,系统调用功能的实现(包括信号量机制),及读者-写者活动过程记录与显示。初始化系统环境建立通信管道启动读者-写者进程接收系统调用命令解释执行系统初始化模块管道建立模块进程启动模块命令解释模块WaitOSignal()Wakeup()BlockO四、源程序#include# include# include# include# include# include# defineMAX_PERSON100#
8、 defineREADER0读者# defineWRITER1写者# defineEND-1# defineRREADER# defineWWRITERtypedefstruct_Person(HANDLEthread;定义处理线程的句柄inttype;进程类型(读写)intStartTime;开始时间intWorktime;运行时间intID;进程号)Person;Persong_PersonsMAX_PERSON;intg_NumPerson=0;longg_CurrentTime=0;基本时间片数intg_PersonLists=进程队列1,R,3,5,2,W,4,5,3,R,5,2,4
9、,R,6,5,5rW,5.1,3,END.);intg_NumOfReading=O;正在读进程的个数intg_NumOfWriteRequest=O;申请写进程的个数HANDLEreadsignal;/读者信号HANDLEWriteSignaI;/写者信号boolfinished=false;所有的读完成boolwfinished=false;/所有的写完成voidCreatePersonList(int*pPersonList);boolCreateReader(intStartTime,intWorkTime,intID);boolCreateWriter(intStartTime,in
10、tWorkTime,intID);DWORDWINAPIReaderProc(LPVOIDIpParam);DWORDWINAPIWriterProc(LPVOIDIpParam);intmain()(readsignal=CreateSemaphore(NULL,1,100,NULL);创建信号灯,当前可用的资源数为1,最大为100writesignal=CreateSemaPhOre(NULL,1,100,NULL);/创建信号灯,当前可用的资源数为1,最大为100CreatePersonList(g_PersonLists);/CreateAlIthereaderandwritersPr
11、intf(正在创建读者和写者n.n);g_CurrentTime=0;whiIe(true)g_CurrentTime+;SIeep(300);/300msprintf(CurrentTime=%dn,g_CurrentTime);if(finished)return0;)/returnO;)voidCreatePersonList(int*pPersonLists)(inti=0;int*pList=pPersonLists;booIRet;while(pList0!=END)Iswitch(pList1)(caseR:Ret=CreateReader(pList2,pList3,pList
12、0);/351,w452,523r654break;caseW:Ret=CreateWriter(pList2,pList3,pList0);break;)if(!Ret)printf(CreatePerson%diswrongn,pListO);pList+=4;/movetonextpersonIist)DWORDWINAPIReaderProc(LPVOIDIPParam)读过程(Person*pPerson=(Person*)IpParam;/waitforthestarttimewhile(g_CurrentTime!=pPerson-startTime)(Jprintf(Reade
13、r%disRequesting.n,rpPerson-ID);/等待写者发出请求WaitForSingIeObject(readsigna11INFINITE);if(g_NumOfReading=0)WaitForSingIeObject(writesigna11INFINITE);g_Num0fReading+;ReIeaseSemaphore(readsigna1,1,NULL);pPerson-startTime=g_CurrentTime;printf(Reader%disReadingtheSharedBuffer.n,pPerson-ID);printf(nnn);while(g
14、_CurrentTimestartTime+pPerson-worktime)()printf(Reader%disExit.n,pPerson-ID);printf(nnn);WaitForSingIeObject(readsignaI1INFINITE);g_NumOfReading;if(g_Num0fReading=0)ReIeaseSemaphore(writesigna1,1,NULL);此时没有读者,可以写)ReIeaseSemaphore(readsigna1,1,NULL);if(pPerson-ID=4)finished=true;所有的读写完成ExitThread(0);return0;)DWORDWINAPIWriterProc(LPVOIDIpParam)(Pe