- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 3. 哲学家进餐问题(the dining philosophers problem) 问题描述:(由Dijkstra首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子; * * 1.利用记录型信号量机制解决 2.利用AND型信号量机制解决 2.4.2哲学家就餐问题 * 哲学家就餐问题 问题分析: 筷子是临界资源:每根有多于一个哲学家要用,而且同时只能有一个哲学家使用 5根筷子可以用5个信号量表示。形成信号量数组: var chopstick:array[0,…4]of semaphore; 所有信号量初值为1,表示未被使用。 * 哲学家就餐问题 第i位哲学家的活动描述为: Repeat wait(chopstick[i]); wait(chopstick[(i+1)mod 5]); eat; signal(chopstick[i]); signal(chopstick[(i+1)mod 5]); think; Until false; parbegin philosopher (0); philosopher (1); philosopher (2); philosopher (3); philosopher (4); parend * 哲学家就餐问题 可能产生死锁: 五位哲学家同时饥饿,各自拿起左边的筷子时,会使得所有信号量的值为0,再试图拿起右边的筷子时,都将拿不到筷子。 解决死锁的方法: 至多允许四个哲学家同时进餐。 仅当哲学家的左右两支筷子均可用时,才进餐。(用AND信号量机制解决哲学家进餐问题。) 奇数号哲学家先拿左边的筷子,偶数号哲学家先拿右边的筷子。 * AND型信号量机制解决哲学家就餐问题 要求哲学家同时获得两根筷子,否则一根也不拿。 var chopstick:array[0,…4]of semaphore:=(1,1,1,1,1); Repeat think; Sswait(chopstick[(I+1)mod 5]),chopstick[I]); Eats; Ssignal(chopstick[(I+1)mod 5]),chopstick[I]); until false; * 思考: 用其余两种思路,怎样解决哲学家就餐问题? * 小结 顺序执行和并发执行 进程的定义(与程序比较),静态表示(上下文,包括PCB),动态表示(状态),用户代码和OS代码 进程控制(注意:挂起和激活),UNIX和Windows NT举例 线程:引入原因,与进程比较 互斥和同步:信号量,信号量集,管程 进程间通信IPC:信号,共享存储区,管道,消息,管套 死锁问题:原因,条件,解决方法 其他方面:OS引导 * 2.3.2.1 信号量和wait、signal原语 信号量只能通过初始化和两个标准的原语来访问--作为OS核心代码执行,不受进程调度的打断 在实际操作系统中,一般情况下是由机器硬件提供P、V操 作的指令,当然是原子操作,若机器不提供P、V操作的指 令,则操作系统提供P、V操作原语。 信号量的形式化定义: type semaphore=record value: integer; L: listofprocess; end 1. P原语(wait) * procedure wait(S) var S:semaphore; begin S.value:=S.value-1; //表示申请一个资源; if S.value0 then block(S.L); //如果没有空闲资源,调用进程进入和信号量S相关的等待队列 s.L; 阻塞调用wait 的进程 end 2. V原语(signal) procedure signal(S) var S: semaphore; begin S.value:=S.value+1; //表示释放一个资源; if S.value=0 then wakeup(S.L);//如果有进程处于阻塞状态,从等待队列s.L中取出一个进程P,将其唤醒; end * V原语通常唤醒进程等待队列中的头一个进程 * 3. 利用信号量实现互斥 为临界资源设置一个互斥信号量mutex(MUTual Exclusion),其初值为1;在每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间 必须成对使用P和
您可能关注的文档
最近下载
- 计算机兴趣小组活动计划.docx VIP
- 人民币实际有效汇率波动对天津市贸易收支影响的实证研究的中期报告.docx VIP
- 中国石狮子PPT课件.pptx VIP
- 2025年全国高考(新课标)化学真题卷含答案解析 .pdf VIP
- 新部编小学语文五年级上册看拼音写词语.docx VIP
- 人教版(2025)必修第三册Unit 1 Festivals and celebrations Discovering Useful Structures 课件(共46张PPT)(含音频+视频).pptx VIP
- 年产2500吨高端氟材料项目环评报告表.pdf VIP
- 临床微生物室标准操作程序SOP.pdf VIP
- Boss Roland逻兰RC-600 乐句循环工作站RC-600 中文用户手册 说明书.pdf
- 2025年秋季湖北武汉市华中师范大学校友工作办公室学生助理招聘笔试历年典型考题(历年真题考点)解题思路附带答案详解(5套).docx VIP
文档评论(0)