- 1、本文档共49页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PA 、 PB动作的描述 PA: 加工生成消息resultA Send(1,resultA) Receive(2,materialA) Goto PA PB: Receive(1,materialB) 加工生成消息resultB Send(2,resultB) Goto PB * 讨论: 1、用于互斥的P(mutex)和V(mutex)必须在各进程中成对出现; 2、针对avail和full的P、V操作也成对出现,不过分别位于合作的两个进程中; 3、一个进程的两个P原语位置不能颠倒:先私后公 4、一个进程的两个V原语位置可以颠倒。 * 实例2:哲学家进餐问题 要求: 1、只有拿到两支筷子才能吃饭; 2、若筷子已被人拿起,只能等别人放下后才能拿; 3、任意一人先拿到一支筷子后,在没有拿到另一支筷子前决不放下第一支。 5位哲学家围着摆放5支筷子的圆桌,交替思考问题和进餐。 * 临界资源:筷子(两两共用一支筷子) 五支筷子的状态 — 五个信号量描述: 1 — 空闲;0 — 已被占用;-1 — 一人占用,一人等待 并发进程的描述:哲学家的活动:进餐— 思考 是否获得临界资源(筷子)进餐,通过分别对其左右的筷子状态测试,只有同时获得,才能进餐。 * var chopstick: array[0..4] of semaphore :=(1,1,1,1,1); 第i个哲学家的活动进程: Process(i): eat think goto process(i); 保证不会有相邻两人同时进餐,但五人同时进行左筷子的测试并拿起左筷子,会怎样? 大家饿死 方法一:最多允许4人同时要求进餐,保证至少有一人会成功。 另设一个公用信号量 var s = 4 P(s); V(s); P(chopstick[i]); P(chopstick[(i+1)mod5]); V(chopstick[i]); V(chopstick [(i+1)mod5]); * 方法二:仅当左右两支筷子均可用时才能拿起。 Process(i): think SP(chopstick[i] , chopstick [(i+1)mod5]); eat SV(chopstick[i] , chopstick [(i+1)mod5]); goto process(i); SP(s1,s2) if (s1=1 and s2=1) then s1 = s1 - 1 s2 = s2 - 1 else 阻塞所在进程,进程调度 endif SV(s1,s2) s1 = s1 + 1 s2 = s2 + 1 唤醒等待s1或 s2的阻塞进程 * 方法三: 让奇数号哲学家先取右筷子,偶数号哲学家先取左筷子。 Process(i): If (i mod 2 0) then P(chopstick[i+1]mod5); P(chopstick[i]); eat V(chopstick[i+1]mod5); V(chopstick[i]); think goto process(i); else P(chopstick[i]); P(chopstick [(i+1)mod5]); eat V(chopstick[i]); V(chopstick [(i+1)mod5]); think goto process(i); endif * 实例3:读者-写者问题 要求:数据对象允许多个读者同时读,但不允许一个写者与其他读者或写者同时操作。 读者要求进入时: 读者退出时: 2、两个互斥措施: 1)读者与写者之间、写者与写者之间的互斥(主要): 临界资源是共同访问的数据。 2)读者之间互斥(辅要): 临界资源是为实现主要互斥所引入的读者个数计数变量。 1、关于进入临界区进程数的识别: 设置一个读者个数的计数变量readcount,被读者读写; 根据这个变量的值判断进入临界区的读者个数,决定下步操作; 该变量为多个读者进程共享(读、写),要采取互斥措施。 Integer r_mutex=1 , w_mutex=1 , readcount=0 if readcount == 0 then readcount = readcount + 1; readcount = readcount - 1; if readcount == 0 then Write
文档评论(0)