- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中北大学操作系统课程设计说 明 书?学 院、系:软件学院专 业:软件工程学 生 姓 名:学 号:设 计 题 目:基于Linux的进程和线程控制起 迄 日 期:2015年12月28日- 2016年1月8日指 导 教 师:??年12月25日一.需求分析:读者—写者问题(Readers-Writers problem)是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:(1)允许多个读者同时执行读操作;(2)不允许读者、写者同时操作;(3)不允许多个写者同时操作。Reader和Writer的同步问题分为读者优先和写者优先两种情况,它们的处理方式不同。概要设计:读者写者问题可以这样的描述:有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书。但是,只能有一个写者在写书,并且,读者可以比写者优先,写者也可以比读者优先。也就是说,当读者和写者同时提出请求时,两者都能优先但只能有一个优先。当一方提出请求时需要有一个互斥操作,另外,需要有一个信号量S来确定当前是否可操作。所以可以通过利用记录型信号量对读者写者问题的解决过程进行模拟演示,形象地阐述记录型信号量机制的工作原理。写 读三.详细设计:(一)读者优先只要有一个读者正在读,那么后续的读者都能立即读,不管有多少写者在等待。可能导致写者饥饿。1. 读者特点:1) 写者写时,不可读2) 有别的读者正在读,可读2. 写者特点:1) 有读者正在读,不可写2) 有写者正在写,不可写3) 无读者正在读,无写者正在写,可写(二)写者优先当新的写者希望写时,不允许该写者后续的读者访问数据区,但必须保证之前的读者读完。1. 读者特点:1) 有写者正在写或者等待写,须等到没有写者才能读2) 没有写者,可以读2. 写者特点:1) 写者与写者互斥。当其它写者正在写时,其它写者不能写。2) 写者与读者互斥。之前只有读者在读,当写者出现时,必须等到之前的读者都读完才能写。这尊重了之前读者的意愿。3) 写者可以有条件地插读者的队。当前有写者正写,有读者在等,这时来了新写者,新写者可以在那些读者之前执行。四.写者实现首先,写者的代码应该是这样一种形式,才能保证同一时刻只有一个写者修改数据:[cpp] view plaincopywhile(1) { pthread_mutex_lock(writeLock); {//临界区,限制只有一个写者修改数据 write(); } pthread_mutex_unlock(writeLock); } 考虑到写者对读者的影响是:当任何写者想写时,读者都必须被阻塞;并且,写者阻塞了读者并停止阻塞之前,后续的任何写者都会优先于读者执行。这就如同有一个写者队列,当第一个写者入队时,读者完全被阻塞,直到最后一个写者离开队列。据此,可以用 writerCnt 来统计写者的数量,而用互斥量 accessWriterCnt 来互斥各线程对 writerCnt 的访问。代码应作如下调整:[cpp] view plaincopywhile(1) { pthread_mutex_lock(accessWriterCnt); {//临界区,希望修改 writerCnt,独占 writerCnt writerCnt++; if(writerCnt == 1){ //读者与写者互斥;使用readerLock来描述; pthread_mutex_lock(readerLock); } } pthread_mutex_unlock(accessWriterCnt); pthread_mutex_lock(writeLock); {//临界区,限制只有一个写者修改数据 write(); } pthread_mutex_unlock(writeLock); pthread_mutex_lock(accessWriterCnt); {//临界区,希望修改 writerCnt,独占 writerCnt writerCnt--; if(writerCnt == 0){
文档评论(0)