![操作系统原理课程设计读者-写者问题的实现_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/4cc5ccab-e556-44af-b246-b7deb6b0a0d0/4cc5ccab-e556-44af-b246-b7deb6b0a0d01.gif)
![操作系统原理课程设计读者-写者问题的实现_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/4cc5ccab-e556-44af-b246-b7deb6b0a0d0/4cc5ccab-e556-44af-b246-b7deb6b0a0d02.gif)
![操作系统原理课程设计读者-写者问题的实现_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/4cc5ccab-e556-44af-b246-b7deb6b0a0d0/4cc5ccab-e556-44af-b246-b7deb6b0a0d03.gif)
![操作系统原理课程设计读者-写者问题的实现_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/4cc5ccab-e556-44af-b246-b7deb6b0a0d0/4cc5ccab-e556-44af-b246-b7deb6b0a0d04.gif)
![操作系统原理课程设计读者-写者问题的实现_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-3/10/4cc5ccab-e556-44af-b246-b7deb6b0a0d0/4cc5ccab-e556-44af-b246-b7deb6b0a0d05.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、*实践教学实践教学* 兰州理工大学兰州理工大学计算机与通信学院2012 年秋季学期操作系统原理操作系统原理课程设计课程设计题 目: 读者-写者问题的实现 专业班级: 姓 名: 学 号: 指导教师: 成 绩: 1目录目录摘 要.21 设计思想.32 各模块的伪码算法.43. 函数关系调用图.64 程序测试结果.7设计总结.10参考文献.11致 谢.122摘摘 要要 本设计的读者写者问题,是指一些进程共享一个数据区。数据区可以使一个文件、一块内存空间或者一组寄存器。Reader 进程只能读数据区中的数据,而 writer 进程必须与其他进程互斥地访问共享对象的同步问题。 读者写者问题可以这样的描述
2、, 有一群写者和一群读者, 写者在写同一本书, 读者也在读这本书, 多个读者可以同时读这本书。但是,只能有一个写者在写书, 并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作, 另外, 需要有一个信号量 S 来确定当前是否可操作。 本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模 拟演示,形象地阐述记录型信号量机制的工作原理。关键词关键词:共享对象,互斥,同步,信号量31 1 设计设计思想思想本设计借助 C 语言实现进程同步和互斥的经典问题-读者写者问题,用高级语言编写和调试一个进程同步程序,以加深对进程同步机制的理解。通过用
3、C 语言模拟进程同步实现,加深理解有关进程同步和互斥机制的概念及 P、V 操作的应用。学生通过该题目的设计过程,掌握读者、写者问题的原理、软件开发方法并提高解决实际问题的能力。在 Windows 环境下,创建一个包含 n 个线程的控制台进程。用这 n 个线每个线程按相应测试数据文件的要求,进行读写操作。程来表示 n 个读者或写者。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。读者-写者的读写限制(包括读者优先和写者优先) 1)写-写互斥,即不能有两个写者同时进行
4、写操作; 2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写; 3)读读允许,即可以有 2 个以上的读者同时读;4)读者优先附加条件:如果一个读者申请进行读操作,同时又有一个读操作正在进行读操作,则该读者可以直接开始读操作; 5)写者优先附加条件:如果一个读者申请进行读操作时已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。42 2 各模块的伪码算法各模块的伪码算法读者优先算法:读者优先算法:设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据rmutex 用于读者互斥的访问读者计数器 readcountsemapho
5、re rwmutex=1, rmutex=1;int readcount = 0; reader i /读者进程 i=1,2,. doP(rmutex); /读者互斥readcount+; /读者数加 1if (readcount = 1) P(rwmutex); /读者写者互斥 V(rmutex); 读者读数据;P(rmutex); Readcount-; if (readcount = 0) V(rwmutex); V(rmutex);while(1); writer j /写者进程 j = 1,2,. doP(rwmutex); 写文件; V(rwmutex); while(1); 写者
6、优先算法:写者优先算法:设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据 rmutex 用于读者互斥的访问读者计数器 readcount nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作semaphore rwmutex= 1,rmutex= 1,nrmutex= 1; 5int readcount = 0;reader i /读者进程 i=1,2,.doP(rwmutex); P(rmutex); readcount+;if (readcount = 1) P(nrmutex); /有读者进入,互斥写操作V(rmutex);V(rwmutex
7、);/及时释放读写互斥信号量,允许其它读、写进程申请资源读数据;P(rmutex);readcount-;if (readcount = 0) V(nrmutex); /所有读者退出,允许写更新V(rmutex); while(1);writer j /写者进程 j = 1,2,.doP(rwmutex); / 互斥后续其它读者、写者P(nrmutex); /如有读者正在读,等待所有读者读完写更新;V(nrmutex); /允许后续新的第一个读者进入后互斥写操作V(rwmutex); /允许后续新读者及其它写者 while(1);63.3. 函数关系调用图函数关系调用图Main()g_Curr
8、entTime()CreatePersonList()ReaderProc()WriterProc()CreateReader()CreateWriter()图 1 函数关系图74 4 程序程序测试结果测试结果测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是读者还是写者,以及读写操作的开始时间和持续时间.每行测试数据包括四个字段,各字段 间用空格分隔。第一字段为一个正整数,表示线程序号.第二字段表示相应线程 角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开 始时间。线程创建后,延时相应时间 (单位为秒) 后发出对共享资源的读写申请. 第四字段为一个正数,表
9、示读写操作的持续时间。当线程读写申请成功后,开始 对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。在读者写者同时在队列中等待申请资时,读者优先调用资源.而且如果一个 读者申请进行读操作时已有另一读者正在进行读操作, 则该读者可直接开始读操 作,即读读允许。图 2 进程 1、2 的测试结果 如图 2 所示,进程 1 是 W 操作,在时间 3 时进入队列,运行时间是 5,即在时间 8 时,进程 1 退出。在它进入时没有进程 占用资源,它既占用资源;知道它释放资源,等候的进程有 3,4,5; 8图 3 进程 3、5 的测试结果如图 3 所示,进程 5 是 R 操作,在时间 4 时进入
10、队列,运行时间是 3, 进程 3 是 R 操作,在时间 5 时进入队列,运行时间是 2, 在它们进入时,进程 1占用资源,它等待资源,当进程 1 释放资源后,由于读者优先,进程 3,5 同时调运资源,因此在时间 11 时,进程 3 退出,在时间 12 时,进程 5 退出;图 4 进程 2、4、6 的测试结果如图 4 所示,进程 4 是 W 操作,在时间 5 时进入队列,运行时间是 5,在它9进入时进程 1 占用资源,它等待资源,当进程 1 释放资源后,由于读者优先,进程 3,5 占用资源,它依然等待,直到进程 3,5 都结束,即进程 4 在时间 12 时开始调用资源;进程 2 是 R 操作,
11、在时间 16 时进入队列,运行时间是 5,在它进入时进程 4 占用资源,它等待资源,当 4 释放时占用资源后,进程 2 开始运行;进程 6 是 R 操作,在时间 17 时进入队列,运行时间是 7,在它进入时进程2 占用资源,它等待进程 2 释放后最后调用资源。10设计总结设计总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。此次操作系统课程设计,我的感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,我学到很多的东西;同时不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通
12、过这次课程设计我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,所以只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正的服务于社会,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。因此,在以后的学习中要多下苦功,加强基础知识的学习,并且培养自己的动手实践能力。11参考文献参考文献1. 汤子瀛,哲凤屏. 计算机操作系统,西安:电子科技大学学出版社,2002年2. 王清,李光明. 计算机操作系统,北京:冶金工业出版社,2
13、003 年 3 月3.孙钟秀等. 操作系统教程. 北京:高等教育出版社,2008 年 4 月4.曾明. Linux 操作系统应用教程. 西安: 陕西科学技术出版社,2005 年5. 张丽芬,刘利雄. 操作系统实验教程. 北京: 清华大学出版社,2006 年6. 孟静.操作系统教程原理和实例分析. 北京:高等教育出版社,2001年7. 周长林. 计算机操作系统教程. 北京:高等教育出版社,2011 年 12 月8. 张尧学. 计算机操作系统教程.北京:清华大学出版社,2006 年 10 月9. 任满杰. 操作系统原理实用教程.北京:电子工业出版社,2006 年 1 月12致致 谢谢这次课程设计培
14、养了我耐心、缜密、全面地思考问题的能力,从而加快了问题解决的速度、提高了个人的工作效率,以及锻炼了使问题在短时间内得以解决的品质。我从“纸上谈兵”到可以自己动脑动手分析调试程序,收获不少。首先要感谢学校给我这次实践的机会,给了自己一个舞台。这不仅是对自身的检验,而且增加了我编写代码的功力。还有多亏了老师们从理论到上机亲自指导的辛苦教授,给予了我们最大帮助和全面指导。在这里,尤其感谢我的指导老师朱红蕾老师,你不辞辛苦的给我们耐心指导。在这里,我衷心向你们致谢!最后还要感谢热心的同学们,在我陷入误区的时候,是他们热心的帮助使我摆脱困境。最后衷心感谢所有给予我帮助和指导的老师和同学,没有他们的帮助我
15、的程序也不会完成得这么顺利。13源代码:#include #include #include #include #include #include #define MAX_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; /开始时间14int m_nWorkTime; /运
16、行时间int m_nID;/进程号 Person; Person g_PersonsMAX_PERSON; int g_NumPerson = 0;long g_CurrentTime= 0; /基本时间片数int g_PersonLists = /进程队列 1, W, 3, 5, 2, W, 16, 5, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3, 6, R, 17,7, END, ; int g_NumOfReading = 0;int g_NumOfWriteRequest = 0; /申请写进程的个数 HANDLE g_hReadSemaphore; /读者
17、信号 HANDLE g_hWriteSemaphore; /写者信号 bool finished = false; /所有的读完成 /bool wfinished = false; /所有的写完成 void CreatePersonList(int *pPersonList); bool CreateReader(int StartTime,int WorkTime,int ID); bool CreateWriter(int StartTime,int WorkTime,int 15ID); DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINA
18、PI WriterProc(LPVOID lpParam);int main() g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可用的资源数为 1,最大为 100 g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前 可用的资源数为 1,最大为 100CreatePersonList(g_PersonLists); / 创建所有的读者和写者 printf(Created all the reader and writern.n); g_Curr
19、entTime = 0; while(true) g_CurrentTime+; Sleep(300); / 300 ms printf(CurrentTime = %dn,g_CurrentTime); if(finished) return 0; 16 / return 0; void CreatePersonList(int *pPersonLists) int i=0; int *pList = pPersonLists; bool Ret; while(pList0 != END) switch(pList1) case R: Ret = CreateReader(pList2,pL
20、ist3,pList0); /351,w452,523,654 break; case W: Ret = CreateWriter(pList2,pList3,pList0); break; if(!Ret) printf(Create Person %d is wrongn,pList0); pList += 4; / move to next person list17 DWORD WINAPI ReaderProc(LPVOID lpParam) /读过程 Person *pPerson = (Person*)lpParam; / wait for the start time whil
21、e(g_CurrentTime != pPerson-m_nStartTime) printf(Reader %d is Requesting .n,pPerson-m_nID); printf(nn*n); / wait for the write request WaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading=0) WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+; ReleaseSemaphore(g_hReadSemapho
22、re,1,NULL); pPerson-m_nStartTime = g_CurrentTime;18printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_nID); printf(nn*n); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) printf(Reader %d is Exit.n,pPerson-m_nID); printf(nn*n); WaitForSingleObject(g_hReadSemaphore,INFINITE); g_NumOfRea
23、ding-; if(g_NumOfReading = 0) ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此时没有读者,可以写 ReleaseSemaphore(g_hReadSemaphore,1,NULL); if(pPerson-m_nID = 4) finished = true; /所有的读写完成 ExitThread(0); return 0; 19 DWORD WINAPI WriterProc(LPVOID lpParam) Person *pPerson = (Person*)lpParam; / wait for the start
24、 time while(g_CurrentTime != pPerson-m_nStartTime) printf(Writer %d is Requesting .n,pPerson-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 Buffer.n,pPerson-m_nID); while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime) printf(Writer %d is Exit.n,pPerson-m_nID); printf(nn*n); 20/g_NumOfWriteRequest-; ReleaseSemaphore(g_hWriteSemaphore,1,NULL); if(pPerson-m_nID = 4) finished = true;/所有的读写完成 ExitThread(0); return 0;bool CreateReader(int StartTime
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中交集团高层次人才招聘笔试参考题库附带答案详解
- 2024年秦创原(咸阳)创新促进中心招聘(12人)笔试参考题库附带答案详解
- 2024年福建水投集团晋金供水有限公司招聘1人笔试参考题库附带答案详解
- 2025-2030年变频节能电风扇行业深度调研及发展战略咨询报告
- 2025-2030年口算练习器行业跨境出海战略研究报告
- 2025-2030年史前遗迹探秘行业深度调研及发展战略咨询报告
- 2025-2030年手术室空气净化系统行业深度调研及发展战略咨询报告
- 2025-2030年拉面技艺传承学校行业跨境出海战略研究报告
- 2025-2030年手持式碎菜器行业深度调研及发展战略咨询报告
- 2025-2030年户外露营厨具套装行业跨境出海战略研究报告
- 保育员教学大纲和教学计划
- 领子的分类详解课件
- 工厂员工消防安全培训内容
- XX站SCADA系统升级改造施工方案(模板)
- 调节与集合的相关性 相对调节和相对集合的关系
- 《金融工程》课程教案
- 信贷管理系统需求说明书
- 蒙台梭利教育理论
- 水轮机结构总体介绍
- “求是鹰眼”反无人机系统
- 《X公司应收账款管理研究14000字(论文)》
评论
0/150
提交评论