读者写者问题_第1页
读者写者问题_第2页
读者写者问题_第3页
读者写者问题_第4页
读者写者问题_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计(大作业)报告课程名称:操作系统 设计题目:读者写者问题模拟实现 院 系: 班 级: 设 计 者: 学 号: 指导教师: 设计时间: 昆明学院昆明学院课程设计(大作业)任务书姓 名:院(系):信息技术学院专 业:计算机科学与技术学 号:任务起止日期:2012年12月24日至12月28日 课程设计题目:读者写者问题模拟实现课程设计要求及任务描述:设计内容:1. 创建进程,在该进程中创建若干个线程模拟读者和写者线程,每个线程按照要求进行读写操作。2. 线程读写操作要符合以下几个条件:第一:写写互斥。不能有两个写线程同时进行写操作。第二:读写互斥。不能同时有一个线程在读,另一个线程在写。第三

2、:读读允许。可以有一个或多个读者在读。第四:写者优先。如果一个读进程申请读操作时,已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。3. 创建两个队列其中一个放读者,另一个放写者。当读允许时就从读者队列中取出一个或者多个读线程进行操作;当写允许时,就从写者队列中取出一个或者多个写线程进行操作。4. 测试文件测试文件中每行表示一个线程信息,每行四个字段,每个字段用空格隔开。第一个字段为正数,表示线程序号;第二个字段表示线程的角色,R表示读者,W表示写者;第三个字段为一个正数,表示读写操作提交时间;第四个字段表示读写操作的持续时间。5. 显示结果。使用提示信息

3、方式显示结果。每个线程发出读写操作请求、开始读写操作、结束读写操作、被阻塞时分别显示一行提示信息。注:实验环境及工具不限。工作计划及安排:工作时间为2012年12月24日至12月28日。12月24日分析问题并开始着手画程序流程图,24日至25日程序流程图基本完工,26日开始写程序代码,26日至27日程序代码基本完成并成功实现要求显示的结果,28日完成该提交的报告文档内容指导教师签字 年 月 日 课程设计(大作业)成绩学号:5 姓名:郭永权 指导教师:段玻课程设计题目:读者写者问题模拟实现完成情况总结:由老师给出的指导任务书,根据任务书分析问题并画出基本流程图,然后根据流程图逐一写出程序,并调式

4、显示出老师给出的要求。通过这次实验,让我对C+语言的编写有了更深的了解,也让我了解了支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。在这次的设计中,遇到了许多意想不到的问题,在画流程图的过程中发现自己对问题的不熟悉和理解,让进度严重延迟,对程序的编写也存在很大的问题,自己也没有足够的能力解决,最后是通过同学的帮助才能基本完成。通过这次设计也体现出了自己的不足,今后需对程序的编写和流程图的设计做出更多的学习。指导教师评语:成绩:填表时间:指导教师签名:课程设计(大作业)报告一、实验原理分析1)、读者写者问题读者写者问题是指多个进程对一个共享资源即数据集进行读写操作的

5、问题,其中一些进程只要求读数据集的内容,而另一些进程则要求修改或写数据集的内容。将只要求读数据的进程称为读进程,将要求修改或写数据集的进程称为写进程。多个读进程可以同时读此数据集,不需要互斥也不会产生任何问题,但是一个写进程不能与其他进程(读进程或写进程)同时访问此数据集,它们之间必须互斥,否则数据集的完整性和正确性将遭到破坏。2)、设计的算法要求第一:写写互斥。不能有两个写线程同时进行写操作。第二:读写互斥。不能同时有一个线程在读,另一个线程在写。第三:读读允许。可以有一个或多个读者在读。第四:写者优先。如果一个读进程申请读操作时,已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处

6、于等待状态后才能开始读操作。二、流程图表示及说明1、流程图:线程1发出读请求临界区加载Input.txt文件是否有写进程在运行加入等待队列 Y 线程1、3、4结束读进程线程4发出读请求并开始读线程5发出写进程并进入等待队列线程3发出读进程并开始读线程2发出写请求并进入等待队列N线程1开始读文件无线程在读及写线程2结束写文件 无线程读和写线程5开始写文件线程5结束写文件2、说明:根据读者-写者的读写限制(写者优先)1)写-写互斥,即不能有两个写者同时进行写操作2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写3)读读允许,即可以有2个以上的读者同时读4)写者优先。如果一个读进程申请读

7、操作时,已经有一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。线程1进入临界区申请读文件,临界区无写线程运行,线程1开始读文件,线程2申请写进程,有线程1在读文件,所以进入等待队列,线程3申请读进程,因可以有2个以上进程可读,所以线程2开始读文件,线程5申请写进程,因有进程在读,所以进入等待队列,线程4申请读进程并开始读文件,线程1、3、4结束进程,无进程读写,线程2开始写文件,线程2结束写文件,无进程读写,线程5开始写文件并结束。三、设计及实现1. 变量定义1)write-count用于记录正在等待的写者数目,它的初始值为0,当线程开始调入时,只允许一个写者

8、准备读,等待互斥信号,保证对write-count的访问,修改互斥,即为write-count+,而当线程进行读操作时,相应写者数目减少,即write-count-,当write-count=0时,说明所有读者都已经读完,离开临界区唤醒读者,释放互斥信号。2)read为实现写者优先,当有写者在写文件或等待时,读者必须阻塞在read上。2. 函数声明及功能说明相关API说明 CreateThread功能:创建一个线程。 CreateMutex的功能:产生一个命名或匿名的互斥量对象。 CreateSemaphore的功能:创建命名或匿名信号量对象。 WaitForSingleObject的功能:使

9、程序处于等待状态,直到信号量出现或超过规定等待的最长时间,信号量出现指信号量大于或等于1。 ReleaseSemaphore的功能:将所指信号量加上指定大小的一个量,执行成功返回非0值。 ReleaseMutex的功能:用来打开互斥锁,即将互斥量加1,成功调用则返回0。 InitializeCriticalSection的功能:初始化临界区对象。 EnterCriticalSection的功能:等待指定临界区对象的所有权。 LeaceCriticalSection的功能:释放指定临界区对象指针。3 .主函数结构main()rsem= CreateSemaphore(NULL,1,1,NULL)

10、;wsem= CreateSemaphore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphore(NULL,1,1,NULL);CurrentTime = 0;while(true)/模拟20个时钟周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(当前时间 = %d:n,CurrentTime);if(CurrentTime=30)b

11、reak;system(pause);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0;4.代码及说明源代码:/写者优先算法#include #include #include #include #include #include #define MAX_PERSON 10#define READER 0#define WRITER 1#define END -1#define R READER#define W WRITER ty

12、pedef struct _PersonHANDLE Thread;int Type;int StartTime;int WorkTime;int ID;Person;Person PersonsMAX_PERSON;int NumPerson = 0;long CurrentTime= 0;int PersonLists = 1,R,2,7,2,W,5,6,/*读写互斥*/3,R,6,3,/*写读互斥*/4,R,7,6,/*读读互斥*/5,W,6,4,/*读写互斥*/END,; int rfirst = 0;int wfirst = 0;int NumOfReaders = 0;int Nu

13、mOfWriters = 0;HANDLE rsem;/*初值为1的互斥信号量,在至少有一个写者准备访问数据时就不允许随后来的读者访问数据*/HANDLE wsem;/*初值为1的互斥信号量,之后有一个写者访问数据时其他写者和读者就被阻止对数据的访问*/HANDLE z;/*初值为1的互斥信号量,在至少有一个写着准备访问数据、且后面已经来一个读者时再来的读者将在这个信号量上等待*/HANDLE ReadMutex;/*创建写者的互斥信号量,初值为1*/HANDLE WriteMutex;/*创建读者的互斥信号量, 初值为1*/ void CheckPersonList(int *pPerson

14、List);/*查看人数,为创建读写者线程*/bool CreateReader(int StartTime,int WorkTime);bool CreateWriter(int StartTime,int WorkTime);DWORD WINAPI ReaderProc(LPVOID lpParam);/*读者进程程序*/DWORD WINAPI WriterProc(LPVOID lpParam);/*写着进程程序*/#include Writerprior.hint main()rsem= CreateSemaphore(NULL,1,1,NULL);wsem= CreateSema

15、phore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphore(NULL,1,1,NULL);CurrentTime = 0;while(true)/模拟20个时钟周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(当前时间 = %d:n,CurrentTime);if(CurrentTime=30)break;system(pause

16、);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0;void CheckPersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool P;while(pList0 != END)if(pList2 = CurrentTime)switch(pList1)case R:P = CreateReader(pList2,pList3);/创建一个读者break;c

17、ase W:P = CreateWriter(pList2,pList3);/创建一个写者break;if(!P)printf(Create Person %d is wrongn,pList0);pList += 4; / 数组的指针指向第二个人DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfReaders;WaitForSingleObject(z,INFINITE);/P(z),其余读者在此排队printf(tt读者 %d 申请读数据.n,pPerso

18、n-ID);WaitForSingleObject(rsem,INFINITE);/P(rsem),一个读者与一个写着再次竞争数据的使用权/printf(Reader %d is requesting the Shared Buffer.n,pPerson-ID); WaitForSingleObject(ReadMutex,INFINITE);/P(ReadMutex),读者请求进入rfirst临界区rfirst+; if(rfirst = 1)/是否是第一个读者 WaitForSingleObject(wsem,INFINITE);/读者在此处与写者进行同步 ReleaseSemaphor

19、e(ReadMutex,1,NULL);/退出rfirst临界区,V(ReadMutex)ReleaseSemaphore(rsem,1,NULL);ReleaseSemaphore(z,1,NULL);/V(z)/ 读取所需数据,将现在时间赋值给读者,用以计算结束时间printf(tt读者 %d 申请成功n,pPerson-ID);pPerson-StartTime = CurrentTime; printf(tt读者 %d 正在读数据.n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/ 模拟读数据printf(tt读

20、者 %d 读完数据退出n,pPerson-ID);WaitForSingleObject(ReadMutex,INFINITE); rfirst-; if(rfirst = 0) /是最后一个读者? ReleaseSemaphore(wsem,1,NULL);/没有读者了,写者放行 ReleaseSemaphore(ReadMutex,1,NULL);/退出读者临界区ExitThread(0);/关闭读者线程return 0;DWORD WINAPI WriterProc(LPVOID lpParam)/写者进程程序Person *pPerson = (Person*)lpParam;pPer

21、son-ID = +NumOfWriters; printf(tt写者 %d 正在申请写数据.n,pPerson-ID); WaitForSingleObject(WriteMutex,INFINITE);/请求进入写者临界区wfirst=wfirst+;if(wfirst=1)WaitForSingleObject(rsem,INFINITE);/一个写者在此与读者取得同步ReleaseSemaphore(WriteMutex,1,NULL);/退出rfirst临界区WaitForSingleObject(wsem,INFINITE);/其他写者在此等候进入写临界区 / 读取所需数据,将现在

22、时间赋值给读者,用以计算结束时间pPerson-StartTime = CurrentTime; printf(tt写者 %d 正在写数据.n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/模拟写数据printf(tt写者 %d 写完数据退出n,pPerson-ID);ReleaseSemaphore(wsem,1,NULL);/退出进入写临界区WaitForSingleObject(WriteMutex,INFINITE);/请求进入wfirst临界区wfirst=wfirst-;if(wfirst=0)/是最后一个写

23、者?ReleaseSemaphore(rsem,1,NULL);/没有写者了,向读者放行ReleaseSemaphore(WriteMutex,1,NULL);/退出wfirst临界区ExitThread(0);/关闭写者线程return 0;bool CreateReader(int StartTime,int WorkTime)DWORD dwThreadID;Person *pPerson = &PersonsNumPerson;pPerson-StartTime= StartTime;pPerson-WorkTime= WorkTime;pPerson-Type= READER;Num

24、Person+;/ 创建一个读者的新线程pPerson-Thread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-Thread = NULL) return false;return true; bool CreateWriter(int StartTime,int WorkTime)DWORD dwThreadID;if(NumPerson = MAX_PERSON)return false;Person *pPerson = &PersonsNumPerson;pPerson-StartTime = StartTime;pPerson-WorkTime = WorkTime;pPerson-Type = WRITER;NumPerson+;/ 创建一个写者的新线程pPerson-T

温馨提示

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

评论

0/150

提交评论