ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:59.13KB ,
资源ID:5078042      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5078042.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(读者与写者问题.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

读者与写者问题.docx

1、读者与写者问题2012-2013学年第 一 学期 学院综合设计读者与写者问题 学号:姓名:成绩:评语:设计要求:用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“Im the writer number X. It is TIME. ”,其中X是pid,TIME是访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.

2、05秒。读者写者问题的实现1、概述1.1 设计题目读者写者问题的实现1.2 设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。1.3开发环境使用的操作系统:Linux系统使用的编程语言:C语言1.4 设计要求用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“Im the writer number X. It is TIME. ”,其中X是pid,TIME是访问文件的时间,格

3、式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.05秒。2、设计思想读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;(3)如果一个写进程正在进行操作,禁止任何读进程度文件。3、具

4、体程序实现#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 _PersonHANDLE m_hThread;/定义处理线程的句柄int m_nType;/进程类型(读写)int m_nStartTime;/开始时间int m_nWorkTime;/运行时间int m_nID;/进程号Perso

5、n; Person g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 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 finish

6、ed = false; /所有的读完成/bool wfinished = false; /所有的写完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main()g_hReadSemaph

7、ore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可的资源数为,最大为g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可用的资源数为,最大为CreatePersonList(g_PersonLists); / Create All the reader and writersprintf(Created all the reader and writern.n);g_CurrentTime = 0;while(true)g_CurrentTime+;Sleep(300)

8、; / 300 msprintf(CurrentTime = %dn,g_CurrentTime);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,654break; case W:Ret =

9、 CreateWriter(pList2,pList3,pList0);break;if(!Ret)printf(Create Person %d is wrongn,pList0); pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam)/读过程Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime) printf(Reader %d is R

10、equesting .n,pPerson-m_nID);printf(nn*n);/ wait for the write requestWaitForSingleObject(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 i

11、s 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_NumOfReading-;if(g_NumOfReading = 0)ReleaseSemaphore(g_hWriteSemaphore,1,NULL);/此时

12、没有读者,可以写ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true; /所有的读写完成ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d is Requesting .n,pPe

13、rson-m_nID);printf(nn*n);WaitForSingleObject(g_hWriteSemaphore,INFINITE);/ modify the writers real start timepPerson-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-

14、m_nID);printf(nn*n);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true;/所有的读写完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON)return false;Person *pPerson = &g_Personsg_NumPer

15、son;pPerson-m_nID = ID;pPerson-m_nStartTime = StartTime;pPerson-m_nWorkTime = WorkTime;pPerson-m_nType = READER;g_NumPerson+;/ Create an New ThreadpPerson-m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-m_hThread = NULL)return false;return true;bool CreateWriter(i

16、nt StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_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 ThreadpPerson-m_hThread= Create

17、Thread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-m_hThread = NULL)return false;return true; 4、运行结果 测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个

18、正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:1, W,4, 5, 2, W, 16, 4, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3,在读者写者同时在队列中等待申请资时,读者优先调用资源。而且如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许。5、总结通过本次实验“读者-写者问题的实现”的学习对线程及其同步机制有了进一步的学习和掌握,并认识到同步可以保证在一个时间内只有一个线程对某个资源有控制权。也使我对于linux有了

19、全面的接触和了解,而linux所开放的源码的确为学计算机的人提供了很好的平台。对程序设计思想也有了系统的设计的构想,为今后的程序设计奠定了基础。总体而言,这次通过“读者-写者问题”这一经典的线程同步问题,对读者写者问题的编写让我对同步机构应用有了深入的了解,懂得了运用信号量实现进程间的互斥,也学会了如何实现不让共享资源同时修改。 本次试验也使我对C语言有了一个很好的复习和学习,对线程的创建及同步问题及其同步对象都有了很好的理解。并能初步进行简单的程序编程,对程序的调式过程也使我更好了解到线程同步的具体运行过程,我也能够更好的理解程序。学习语言是一个漫长的过程,我想只有在不断的实践练习中,才能更好的掌握编程的技巧,提高自己的编程能力,此次实验让我深深体会到自己还有很多东西需要学习。6、参考文献 1操作系统原理(第三版) 主编:张尧学 出版社:清华大学出版社2操作系统实验教程 主编:张丽芬,刘利雄 出版社:清华大学出版社3操作系统教程 主编:孙钟秀 出版社:高等教育出版社

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1