读者写者问题实验报告3

上传人:夜人****瑕 文档编号:110395851 上传时间:2022-06-18 格式:DOC 页数:10 大小:30KB
收藏 版权申诉 举报 下载
读者写者问题实验报告3_第1页
第1页 / 共10页
读者写者问题实验报告3_第2页
第2页 / 共10页
读者写者问题实验报告3_第3页
第3页 / 共10页
资源描述:

《读者写者问题实验报告3》由会员分享,可在线阅读,更多相关《读者写者问题实验报告3(10页珍藏版)》请在装配图网上搜索。

1、读者写者问题实验报告3学 号: 课 程 设 计 题 目 实现读者写者 (Reader-Writer Problem) 问题 学 院 计算机科学与技术 专 业 软件工程 班 级 软件 姓 名 指导老师 2022 年 _ 月 _ 日 目 录 1概述 4 1.1设计题目 4 1.2设计目的 4 1.3设计时间 4 1.4开发环境 4 1.5设计要求 4 2数据构造与模块说明 5 2.1设计概述 5 2.2设计流程图 6 3详细编程实现 7 4运行结果与测试 8 5.课程设计总结与体会 11 6【参考文献】:p 】: 11 课程设计任务书 学生姓名: 专业班级: 软件 指导老师: 工作单位: 计算机科

2、学与技术学院 题目: 实现读者写者 (Reader-Writer Problem) 问题 初始条件: 1.操作系统:Linu_ 2.程序设计语言:C语言 3.设有20个连续的存储单元,写入/读出的数据项按增序设定为120这20个字符。 要求完成的主要任务: 包括课程设计工作量及其技术要求,以及说明书撰写等详细要求 1技术要求: 1为每个读者写者产生一个线程,设计正确的同步算法 2每个读者/写者对该存储区进展操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。 3读者应有3个以上,写者应有有两个以上。 4多个读者/写者之间须共享对存储区进展操作的函数代码。 2 设计说

3、明书内容要求: 1设计题目与要求 2总的设计思想及系统平台、语言、工具等。 3数据构造与模块说明功能与流程图 4运行结果与运行情况 提示: (1)连续存储区可用数组实现。 (2)编译命令可用:cc -lpthread -o 目的文件名文件名 (3)多线程编程方法参见附件。 3.调试报告: 1) 调试记录 2) 自我评析和总结 上机时间安排: 18周一 五 08:0 12:00 指导老师签名_: 年 月 日 系主任或责任老师签名_: 年 月 日 实现读者写者 (Reader-Writer Problem) 问题 1 概述 1.1 设计题目 实现读者写者 (Reader-Writer Proble

4、m) 问题 1.2 设计目的 通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。 通过研究Linu_的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。 1.3设计时间 消化资料、系统调查 1天 系统分析p 1天 总体设计、施行方案 2天 撰写课程设计报告书 1天 第18周周一至周五 1.4开发环境 本次课程设计在操作系统:Linu_下,使用的编程语言为C语言。 1.5 设计要求 1为每个读者写者产生一个线程,设计正确的同步算法 2每个读者/写者对该存储区进展操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。

5、3读者应有3个以上,写者应有有两个以上。 4多个读者/写者之间须共享对存储区进展操作的函数代码。 2数据构造与模块说明 2.1设计概述 所谓读者写着问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。 读者写者问题可以这样的描绘,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出恳求时,读者优先。当读者提出恳求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。 信号量机制是支持多道程序的并发操作系统设计中解决资共享时进程间的同步与互斥的重要机制

6、,而读者写者那么是这一机制的一个经典范例。 与记录型信号量解决读者写者问题不同,信号量机制它增加了一个限制,即最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行waitL,1,1操作,来控制读者的数目,每当有一个读者进入时,就要执行waitL,1,1操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1 个读者要进入读时,必然会因waitL,1,1操作失败而堵塞。对利用信号量来解决读者写者问题的描绘如下: Var RN integer;L,m_:semaphore: =RN,1; Begin Parbegin Reader :begin Repeat

7、SwaitL,1,1; Swaitm_,1,0; .Perform reader operation; Ssignal(L,1); Until false; End Writer :begin Repeat Swait(m_ ,1,1,l,RN,0); Perform writer operation; Ssignal(m_,1); Until false; End Parend End 其中,Swaitm_,1,0语句起着开关作用,只要无Writer进程进入些,m_=1,reader进程就都可以进入读。但是要一旦有Writer进程进入写时,其M_=0,那么任何reader进程就都无法进入读。

8、Swait(m_ ,1,1,l,RN,0)语句表示仅当既无Write进程在写m_=1,又无reader进程在读L=RN时,writer进程才能进入临界区写。 2.2设计流程图 主程序 读者 写者 主控 3 详细编程实现 读者-写者的读写限制包括读者优先和写者优先 1写-写互斥,即不能有两个写者同时进展写操作 2读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写 3读读允许,即可以有2个以上的读者同时读 将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可

9、以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程Reader和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件: 1)任意多个读进程可以同时读这个文件; 2) 一次只有一个写进程可以往文件中写; 3假如一个写进程正在进展操作,制止任何读进程度文件。 我们需要分两种情况实现该问题: 读优先:要求指一个读者试图进展读操作时,假如这时正有其他读者在进展操作,他可直接开场读操作,而不需要等待。 写优先:一个读者试图进展读操作时,假如有其他写者在等待进展写操作或正在进展写操作,他要等待该写者完成写操作后才开场读操作。 程序由三局部组成: 1 读者模块:包括系统调用接口,读者

10、活动描绘主程序。系统接口主要功能是通过管道向父进程发送系统调用命令,并读取父进程送来的返回值。 2 写者模块:包括系统调用接口,写者活动描绘主程序。 读者-写者活动程序根据临界资的共享,互斥原那么编制。 3.主控模块:主控模块实现系统初始化系统调用命令接收与解释执行,系统调用功能的实现包括信号量机制,及读者-写者活动过程记录与显示。 4运行结果与测试 测试数据文件包括n 行测试数据,分别描绘创立的n 个线程是读者还是写者,以及读写操作的开场时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第

11、三字段为一个正数,表示读写操作的开场时间。线程创立后,延时相应时间单位为秒后发出对共享资的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开场对共享资的读写操作,该操作持续相应时间后完毕,并释放共享资。下面是一个测试数据文件的例子: 1, W,4, 5, 2, W, 16, 4, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3, 在读者写者同时在队列中等待申请资时,读者优先调用资。而且假如一个读者申请进展读操作时已有另一读者正在进展读操作,那么该读者可直接开场读操作,即读读允许。 进程1是W操作,在时间4时进入队列,运行时间是5,在它进入时没有

12、进程占用资,它既占用资;直到它释放资,等候的进程有3,4,5; 其他进程如截图所示。 5课程设计总结与心得体会 这一次课程设计,我完成了题目“读者-写者问题的实现”,更加系统地理解和掌握C语言的根本概念、语言特点和编程技巧,在应用C语言在程序设计方面得到系统锻炼,为将来用C进展软件开发打下良好根底。对程序设计思想也有了比拟明晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备。总的感觉,学到了很多知识,特别对于linu_有了全面的接触和理解,也开场对linu_产生了兴趣,它所开放的码确实为学计算机的同志们提供了很好的平台。读者-写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写,

13、我对同步机构应用有了深化的理解。懂得了运用信号量实现进程间的互斥。实现了不让共享资同时修改。用信号量上的原语操作使临界段问题的解决比拟简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。理解支持多道程序的并发操作系统设计中解决资共享时进程间的同步与互斥的信号量机制。几天的试验,虽然难度有点大,但只要自己花时间去学习,还是会攻克困难的。 课程设计进步了我对所学知识的综合应用才能,全面检查并掌握所学的内容,培养独立考虑、刻苦钻研的精神,在分析p 问题、解决问题的过程中,更是获得一种成功的喜悦,进而增加学习和应用的兴趣。同时也要催促自己在学习的过程中不断的完善自我,加强自己的动手操作才能,

14、培养我的独立考虑的那种思维方式。 总之,每一次课程设计不仅是我们学习的好时机,而且是我们锻炼实际动手才能的平台,虽然有难度的东西总会让人很抵触,比方在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中可以磨练人的意志与耐心,最后感谢老师的指导与监视。 6参考文 1 Operating System Concepts(Si_th Edition)操作系统概念影印版, 主 编:Abraham Silberschatz 出版社:高等教育出版社 2 操作系统原理(第三版) 主 编: 张尧学 出版社:清华大学出版社 3操作系统实验教程 主 编:张丽芬,刘利雄.出

15、版社:清华大学出版社.本科生课程设计成绩评定表 班级:软件工程姓名:学号: 序号 评分工程 总分值 实得分 1 学习态度认真、遵守纪律 10 2 设计分析p 合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的标准性 10 6 设计验收 10 总得分/等级 评语: 注:最终成绩以五级分制记。优90-100分、良80-89分、中70-79分、 及格60-69分、60分以下为不及格 指导老师签名_: 2022 年 月 日 代码 #include #include #include #include #include #include #define MA

16、_PERSON 100 #define READER 0 /读者 #define WRITER 1 /写者 #define END -1 #define R READER #define W WRITER typedef struct _Person HANDLE m_hThread;/定义处理线程的句柄 int m_nType;/进程类型读写 int m_nStartTime;/开场时间 int m_nWorkTime;/运行时间 int m_nID;/进程号 Person; Person g_PersonsMA_PERSON; int g_NumPerson = 0; long g_Cur

17、rentTime= 0;/根本时间片数 int g_PersonLists = /进程队列 1, W, 4, 5, 2, W, 16, 4, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3, END, ; int g_NumOfReading = 0; int g_NumOfWriteRequest = 0;/申请写进程的个数 HANDLE g_hReadSemaphore;/读者信号 HANDLE g_hWriteSemaphore;/写者信号 bool finished = false; /所有的读完成 /bool wfinished = false; /所有的写完成

18、 void CreatePersonList(int _pPersonList); bool CreateReader(int StartTime,int WorkTime,int ID); bool CreateWriter(int StartTime,int WorkTime,int ID); DWORD API ReaderProc(LPVOID lpParam); DWORD API WriterProc(LPVOID lpParam); int main g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /创立信号灯,当前可用的

19、资数为,最大为 g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /创立信号灯,当前可用的资数为,最大为 CreatePersonList(g_PersonLists); / Create All the reader and writers printf(“Created all the reader and writernn“); g_CurrentTime = 0; while(true) g_CurrentTime+; Sleep(300); / 300 ms printf(“CurrentTime = dn“,g_Curren

20、tTime); if(finished) return 0; system (“pause“); / return 0; void CreatePersonList(int _pPersonLists) int i=0; int _pList = pPersonLists; bool Ret; while(pList0 != END) switch(pList1) case R: Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654 break; case W: Ret = CreateWriter(pList2,pList3,p

21、List0); break; if(!Ret) printf(“Create Person d is wrongn“,pList0); pList += 4; / move to ne_t person list DWORD API ReaderProc(LPVOID lpParam)/读过程 Person _pPerson = (Person_)lpParam; / wait for the start time while(g_CurrentTime != pPerson-m_nStartTime) printf(“Reader d is Requesting n“,pPerson-m_n

22、ID); printf(“nn_n“); / wait for the write request WaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading =0) WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+; ReleaseSemaphore(g_hReadSemaphore,1,NULL); pPerson-m_nStartTime = g_CurrentTime; printf(“Reader d is Reading the S

23、hared Buffern“,pPerson-m_nID); printf(“nn_n“); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) printf(“Reader d is E_itn“,pPerson-m_nID); printf(“nn_n“); WaitForSingleObject(g_hReadSemaphore,INFINITE); g_NumOfReading-; if(g_NumOfReading = 0) ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此时没有读者

24、,可以写 ReleaseSemaphore(g_hReadSemaphore,1,NULL); if(pPerson-m_nID = 4) finished = true; /所有的读写完成 E_itThread(0); return 0; DWORD API WriterProc(LPVOID lpParam) Person _pPerson = (Person_)lpParam; / wait for the start time while(g_CurrentTime != pPerson-m_nStartTime) printf(“Writer d is Requesting n“,p

25、Person-m_nID); printf(“nn_n“); WaitForSingleObject(g_hWriteSemaphore,INFINITE); / modify the writers real start time pPerson-m_nStartTime = g_CurrentTime; printf(“Writer d is Writting the Shared Buffern“,pPerson-m_nID); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) printf(“Writer d is E_it

26、n“,pPerson-m_nID); printf(“nn_n“); /g_NumOfWriteRequest-; ReleaseSemaphore(g_hWriteSemaphore,1,NULL); if(pPerson-m_nID = 4) finished = true;/所有的读写完成 E_itThread(0); return 0; bool CreateReader(int StartTime,int WorkTime,int ID) DWORD dwThreadID; if(g_NumPerson = MA_PERSON) return false; Person _pPers

27、on = g_Personsg_NumPerson; pPerson-m_nID = ID; pPerson-m_nStartTime = StartTime; pPerson-m_nWorkTime = WorkTime; pPerson-m_nType = READER; g_NumPerson+; / Create an New Thread pPerson-m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,dwThreadID); if(pPerson-m_hThread = NULL) return false;

28、return true; bool CreateWriter(int StartTime,int WorkTime,int ID) DWORD dwThreadID; if(g_NumPerson = MA_PERSON) return false; Person _pPerson = g_Personsg_NumPerson; pPerson-m_nID = ID; pPerson-m_nStartTime = StartTime; pPerson-m_nWorkTime = WorkTime; pPerson-m_nType = WRITER; g_NumPerson+; / Create an New Thread pPerson-m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,dwThreadID); if(pPerson-m_hThread = NULL) return false; return true; 第 10 页 共 10 页

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!