- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 第三章 进程的描述与控制 * 【思考题】 火车站的排队购买车票问题。 第一种情况:售票停内最多允许100个购票 者在里面; 第二种情况:售票停内能允许的购票者不限 (可排到外面); * 第三章 进程的描述与控制 * 6.4.2 哲学家就餐问题 有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子 每个哲学家的行为是思考,感到饥饿,然后吃通心粉 为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子 * 第三章 进程的描述与控制 * 筷子是临界资源,一段时间只允许一位哲学家使用,为互斥使用,可用一个信号量表示一只筷子。5 个信号量用数组描述如下: var chopstick: array[0, …, 4] of semaphore; 所有信号量初值均为1 ,第i位哲学家的活动可描述如下: repeat wait(chopstick[i]); //拿左边的筷子 wait(chopstick[(i+1) mod 5]); //拿右边的筷子 进食; signal(chopstick[i]); //放左边的筷子 signal(chopstick[(i+1) mod 5]); //放右边的筷子 思考; until false 1、采用记录型信号量集解决哲学家就餐问题 * 第三章 进程的描述与控制 * 以上解法会出现死锁: 如5个哲学家同时去拿左边的筷子后,又要同时去拿右边的筷子时; 为防止死锁发生可采取下列措施之一: 最多允许4个哲学家同时去拿左边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能释放出他用过的两只筷子; 仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子; 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,然后去拿右边的筷子,偶数号的哲学家则反之;由此,最后总会有一个哲学家能获得两只筷子而进餐; 分析 * 第三章 进程的描述与控制 * 2、采用AND信号量集解决哲学家就餐问题 哲学家就餐问题本质上就是AND同步问题,故用AND信号量机制可获得最简洁的解法。 var chopstick: array[0, …, 4] of semaphore :=(1,1,1,1,1); processi repeat 思考; Swait(chopstick[(i+1) mod 5] ,chopstick[i]); 进食; Ssignal(chopstick[(i+1) mod 5] ,chopstick[i]); until false 采取措施: 仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子; * 第三章 进程的描述与控制 * 6.4.3 读者/写者问题 有两组并发进程: 读者(Reader)和写者(Writer),共享一组数据区或一个共享文件; 要求: 允许多个Reader同时执行读操作 不允许Reader 、 Writer同时操作 不允许多个Writer同时操作 * 第三章 进程的描述与控制 * 1、采用记录型信号量集解决读者-写者问题 如果读者来: 1)无读者、写者,新读者可以读 2)有写者等待,但有其它读者正在读,则新读者也可以读 3)有写者写,新读者等待 如果写者来: 1)无读者,新写者可以写 2)有读者,新写者等待 3)有其它写者,新写者等待 * 第三章 进程的描述与控制 * 读者写者问题的解法 设有两个信号量wmutex=1,rmutex=1 另设一个全局变量readcount =0,表示正在读的读者数目 wmutex用于读者和写者、写者和写者之间的互斥 rmutex用于对readcount 这个临界资源的互斥访问 * 第三章 进程的描述与控制 * 读者写者问题可描述如下: Var rmutex,wmutext: semaphore :=1,1; Readcount: integer :=0; begin parbegin Reader:begin repeat wait(rmutex); //等待无进程访问readcount if (readcount=0) wait (wmutex); //等待无写者写
原创力文档


文档评论(0)