第3章 PV专题.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章 PV专题

deposit (data ) Begin P (avail ) 选择一个空缓冲区i P (mutext [I]) 送数据入缓冲区i V (full ) V (mutext [I]) End Remove (data ) Begin P (fu1l ) 选择一个满缓冲区I P (mutext [I]) 取缓冲区i中的数据 V (avai1) V (mutext [I]) End 例12:试: (1)描述一个保证不会出现两个邻座同时要求吃饭的通信算法。 (2)描述一个既没有两邻座同时吃饭,又没有人饿死(永远拿不到筷子)的算法。在什么情况下,5个哲学家全部吃不上饭? 解答: (1)设信号量C〔0]~c[4〕,初始值均为1,分别表示I号筷子被拿(I—0,1,2,3,4), Philosopher(I)://第I个哲学家要吃饭 Begin P (c[I]); P(c[(I+l)mod 5]) ; Eat I V(c[(I+l)mod 5]) ; V (c[I] ) End; //该过程能保证 两邻座不同时吃饭,但会出现5个哲学家一人拿一只筷子,谁也吃不上饭的死锁情况。 (2)解决的思路如下:让奇数号的哲学家先取右手边的筷子,让偶数号的哲学家先取左手边的筷子。 这样,任何一个哲学家拿到一只筷子以后,就已经阻止了他邻座的一个哲学家吃饭的企图,除非某个哲学家一直吃下去,否则不会有人会饿死。 Philosopher (I ): Begin If I mod 2 = = 0 then { P(c[I]);P(c[(I+l) mod 5 ]) Eat ; V(c[I]);V(c[(I+1) mod 5]) } else { P (c[(I+l) mod 5] ) ;P(c[I]) Eat V (c[(I+l) mod 5] ) ;V(c[I]) } End 例14:问题:用P、V操作解决下图之同步问题 (同步)信号量:{实际上也起到互斥作用} S_Empty, T_Empty, {初值为1} S_Full, T_Full; {初值为0} Get(): Begin Repeat P(S_Empty) T_get_S(); V(S_Full); Until false; End Copy(): Begin Repeat P(S_Full); P(T_Empty); S_copy_T(); V(T_Full); V(S_Empty); Until false; End Put(): Begin Repeat P(T_Full); T_put_G(); V(T_Empty); Until false; End 例10: main( ) { int sa=0;∕*表示buf中有无信息 *∕ int sb=1; *表示buf中有无空位置*∕ int ta=0; ∕*表示buf中有无信息 *∕ int tb=1; *表示buf中有无空位置*∕  cobegin get( ); copy( ); put( ); coend } get( ) { while(还要计算)   { 产生一个结果数据; p(sb); 将数送到缓冲区s中; v(sa); } } copy( ) { while(还要复制) { p(sa); p(tb); 将缓冲区s中的数复制到t中; v(ta); v(sb); } } put( ) { while(还要输出) { p(ta); 从缓冲区t中取数据; v(tb); 在打印机上输出;  } } 例11: 一类同步问题的解法 合作进程的执行次序 若执行次序是已知的,则可用进程流图来表示。 进程流图可用来描述进程集合的执行时间轨迹,图中的连接点表示进程开始执行和结束的约束. 例A:设 p1 、

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档