《操作系统课程设计》_第1页
《操作系统课程设计》_第2页
《操作系统课程设计》_第3页
《操作系统课程设计》_第4页
《操作系统课程设计》_第5页
已阅读5页,还剩31页未读, 继续免费阅读

下载本文档

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

文档简介

1、 设计2读者写者问题一、设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。理解进程及信号量的概念。二、设计要求1、为每个读者写者产生一个线程,设计正确的同步算法2、每个读者/写者对该存储区进行操作后,即时显示该存储区的全部内容、当前指针位置和读者/写者线程的自定义标识符。3、读者应有3个以上,写者应有有两个以上。4、多个读者/写者之间须共享对存储区进行操作的函数代码。三、设计说明所谓读者写着问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多

2、个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。主要设计流程图I口丨回C:Ll&erslenovaDesktapOODDebugOOO.exeMMMMMXXXXXXXXXXXXXXMXXHKKXMMMMMXXXMMXEeadepPrioirltyiWriterPriopltyi3.ExittcIFindousEntersi

3、ourchoiceC1.2H3-Creftted!allthereaderandwriter4CurrentTime1谓按任意縫继续.CurintT=2请按任意键继续-Ctirrentrine=3请按任意键继续一.Reader5isRenmesting其耳耳其耳其耳其其其耳w”ReadierSisHeadingtheSharedBuffer.#.K幅UK慨耳耳耳豪”耳豪託耳JCMSiMXHilMXXlIXKWXKWWaiter1isRequestliiig贰1曲曲!1曲曲1|曲!11|!1|曲!11|!11曲fl曲曲BB曲HBUf曲BB曲曲BB曲HB曲曲BB曲H!曲曲BB曲Cuircntfim

4、e=吐请按任意键继续Reader3isRequesstimg测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者是,W表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:W,4,5,W,16,4,R,5

5、,2,W,6,5,R,4,3,在读者写者同时在队列中等待申请资时,读者优先调用资源。而且如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许。进程1是W操作,在时间4时进入队列,运行时间是5,在它进入时没有进程占用资源,它既占用资源;直到它释放资源,等候的进程有3,4,5;结束界面五、总结这一次课程设计,我完成了题目“读者-写者问题的实现”,更加系统地理解和掌握C语言的基本概念、语言特点和编程技巧,在应用C语言在程序设计方面得到系统锻炼,为将来用C进行软件开发打下良好基础。对程序设计思想也有了比较清晰的印象,为今后的程序设计奠定了一定的心理和技术上的准备

6、。总的感觉,学到了很多知识,特别对于linux有了全面的接触和了解,也开始对linux产生了兴趣,它所开放的源码的确为学计算机的同志们提供了很好的平台。读者-写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写,我对同步机构应用有了深入的了解。懂得了运用信号量实现进程间的互斥。实现了不让共享资源同时修改。用信号量上的原语操作使临界段问题的解决比较简单明了了。读者写者问题的编写,花的时间很多,也学到很多东西。了解支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。几天的试验,虽然难度有点大,但只要自己花时间去学习,还是会攻克困难的。课程设计提高了我对所学知识的综

7、合应用能力,全面检查并掌握所学的内容,培养独立思考、刻苦钻研的精神,在分析问题、解决问题的过程中,更是获得一种成功的喜悦,进而增加学习和应用的兴趣。同时也要督促自己在学习的过程中不断的完善自我,加强自己的动手操作能力,培养我的独立思考的那种思维方式。总之,每一次课程设计不仅是我们学习的好机会,而且是我们锻炼实际动手能力的平台,虽然有难度的东西总会让人很抵触,比如在课设过程中有很多郁闷的时候,一个小小的错误一不小心就花去了自己一上午的时间,所以在这个过程中能够磨练人的意志与耐心,最后感谢老师的指导与监督附:主要源代码#includewindows.h#include#include#includ

8、e#include#include#include#defineREADERR/读者#defineWRITERW/写者#defineINTE_PER_SEC1000/每秒时钟中断的数目#defineMAX_THREAD_NUM64/最大线程数#defineMAX_FILE_NUM32/最大文件数目数#defineMAX_STR_LEN32/字符串的长度intreadcount=0;/读者数目intwritecount=0;/写者数目CRITICAL_SECTIONRP_Write;/临界资源CRITICAL_SECTIONcs_Write;CRITICAL_SECTIONcs_Read;str

9、uctThreadInfo/线程序号/线程类别(判断是读者还/线程延迟时间/线程读写操作时间intserial;charentity;是写者线程)doubledelay;doublepersist;/读者优先读者线程/P:读者线程信息voidRP_ReaderThread(void*p)/互斥变量HANDLEh_Mutex;h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex_for_readcount);DWORDwait_for_mutex;/等待互斥变量所有权DWORDm_delay;/延迟时间DWORDm_persist;/读文件持续时间intm

10、_serial;/线程序号/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);Sleep(m_delay);/延迟等待printf(Readerthread%dsentsthereadingrequire./n,m_serial);等待互斥信号,保证对ReadCount的访问,修改互斥wait_for_mutex=WaitForSingleObjec

11、t(h_Mutex,-1);/读者数目增加readcount+;if(readcount=1)/第一个读者,等待资源EnterCriticalSection(&RP_Write);ReleaseMutex(h_Mutex);/释放互斥信号/读文件printf(Readerthread%dbeginstoreadfile./n,m_serial);Sleep(m_persist);/退出线程printf(Readerthread%dfinishedreadingfile./n,m_serial);等待互斥信号,保证对ReadCount的访问,修改互斥wait_for_mutex=WaitForS

12、ingleObject(h_Mutex,-1);/读者数目减少readcount-;if(readcount=0)/如果所有的读者读完,唤醒写者LeaveCriticalSection(&RP_Write);ReleaseMutex(h_Mutex);/释放互斥信号/P:写者线程信息voidRP_WriterThread(void*p)/延迟时间/写文件持续时间/线程序号DWORDm_delay;DWORDm_persist;intm_serial;/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)

13、-delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);Sleep(m_delay);延迟等待printf(Writethread%dsentsthewritingrequire./n,m_serial);/等待资源EnterCriticalSection(&RP_Write);/写文件printf(Writerthread%dbeginstowritetothefile./n,m_serial);Sleep(m_persist);/退出线程printf(Writethread%dfinished

14、writingtothefile./n,m_serial);/释放资源LeaveCriticalSection(&RP_Write);/读者优先处理函数/file:文件名voidReaderPriority(char*file)DWORDn_thread=0;DWORDthread_ID;DWORDwait_for_all;/线程数目线程ID/等待所有线程结束/互斥对象HANDLEh_Mutex;h_Mutex=CreateMutex(NULL,FALSE,mutex_for_readcount);/线程对象的数组HANDLEh_ThreadMAX_THREAD_NUM;ThreadInfot

15、hread_infoMAX_THREAD_NUM;readcount=0;/初始化readcountInitializeCriticalSection(&RP_Write);/初始化临界区ifstreaminFile;inFile.open(file);printf(ReaderPriority:/n/n);while(inFile)/读入每一个读者,写者的信息inFilethread_infon_thread.serial;inFilethread_infon_thread.entity;inFilethread_infon_thread.delay;inFilethread_infon_t

16、hread+.persist;inFile.get();for(inti=0;iserial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_persist=(DWORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);Sleep(m_delay);/延迟等待printf(Readerthread%dsentsthereadingrequire./n,m_serial);wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);/读者进去临界区EnterCritic

17、alSection(&cs_Read);/阻塞互斥对象Mutex2,保证对readCount的访问和修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);/修改读者的数目readcount+;if(readcount=1)/如果是第1个读者,等待写者写完EnterCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2);/释放互斥信号Mutex2/让其他读者进去临界区LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex1);/读文件printf(Rea

18、derthread%dbeginstoreadfile./n,m_serial);Sleep(m_persist);/退出线程printf(Readerthread%dfinishedreadingfile./n,m_serial);/阻塞互斥对象Mutex2,保证对readcount的访问,修改互斥wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);readcount-;if(readcount=0)/最后一个读者,唤醒写者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2);/释放互斥信号

19、/写者优先写者线程/P:写者线程信息voidWP_WriterThread(void*p)DWORDwait_for_mutex3;/互斥变量DWORDm_delay;/延迟时间DWORDm_persist;/读文件持续时间/线程序号intm_serial;HANDLEh_Mutex3;h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,mutex3);/从参数中获得信息m_serial=(ThreadInfo*)(p)-serial;m_delay=(DWORD)(ThreadInfo*)(p)-delay*INTE_PER_SEC);m_persist=(D

20、WORD)(ThreadInfo*)(p)-persist*INTE_PER_SEC);Sleep(m_delay);/延迟等待printf(Writerthread%dsentsthereadingrequire./n,m_serial);/阻塞互斥对象mutex3,保证对writecount的访问wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount+;/修改写者数目if(writecount=1)/第一个写者,等待读者读完EnterCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3

21、);/进入写者临界区EnterCriticalSection(&cs_Write);/写文件printf(Writerthread%dbeginstowritetothefile./n,m_serial);Sleep(m_persist);/退出线程printf(Writerthread%dfinishedwritingtothefile./n,m_serial);/离开临界区LeaveCriticalSection(&cs_Write);/阻塞互斥对象mutex3,保证对writecount的访问、修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex

22、3,-1);writecount-;if(writecount=0)/写者写完,读者可以读LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/写者优先处理函数/file:文件名voidWriterPriority(char*file)DWORDn_thread=0;线程数目DWORDthread_ID;线程IDDWORDwait_for_all;/等待所有线程结束/互斥对象HANDLEh_Mutex1;h_Mutex1=CreateMutex(NULL,FALSE,mutex1);HANDLEh_Mutex2;h_Mutex2=Crea

23、teMutex(NULL,FALSE,mutex2);HANDLEh_Mutex3;h_Mutex3=CreateMutex(NULL,FALSE,mutex3);/线程对象HANDLEh_ThreadMAX_THREAD_NUM;ThreadInfothread_infoMAX_THREAD_NUM;readcount=0;/初始化readcountwritecount=0;初始化writecountInitializeCriticalSection(&cs_Write);/初始化临界区InitializeCriticalSection(&cs_Read);ifstreaminFile;inFi.leopen(file);/打开文件printf(Writerpriority:/n/n);while(inFile)/读入每一个读者、写者信息inFilethread_infon_threadserial;inFilethread_infon_threadentity;inFilethread_infon_threaddelay;inFilethread_infon_thread+persist;inFileget();for(inti=0;i(int)(n_thread);i+)if(thread_infoientity=READER|thread_infoientity=r)

温馨提示

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

评论

0/150

提交评论