- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用PV操作实现进程同步的示例 示例1 设有n个整数环形缓冲区和一个无穷整数序列。进程A逐个地把整数写入环形缓冲区,进程B则逐个地把缓冲区中的整数读出。请回答: (1)叙述A、B进程间的具体制约关系; (2)若信号量S1的初值为0,信号量S2的值是n-1,则下图用PV操作描述的算法有何错误? 解答: (1)进程A和进程B是合作进程,必须同步。进程A应该超前进程B,但不能超前进程Bn个缓冲单元;进程B不能超前进程A。 (2)进程A中V(S1)操作放在“整数写入缓冲区”之前有逻辑错。因为可能进程A执行V(S1)后,在“整数写入缓冲区”之前,进程A被中断而调度进程B执行,进程B将通过P(S1),从而从缓冲区中读取尚未写入的整数,造成错误。 示例2 生产围棋的工人不小心把相等数量的黑子和白子混装在一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,系统功能如下: (1)进程A专门拣黑子,进程B专门拣白子; (2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子; (3)当一个进程拣了一个子(黑子或白子)以后,必让另一个进程拣一个子(白子或黑子); 用PV操作管理这两个并发进程,使其能正确实现上述功能。 (1)应定义的信号量及初值 ; (2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作。 (1)应定义的信号量及初值 ; (2)在下列的程序中填上适当的P、V操作,以保证它们能正确并发工作。 示例4 假定有3个进程R,W1,W2共享一个缓冲器B,B中每次只能存放一个整数。进程R每次启动输入设备读一个整数且把它存放到缓冲器B中。若存放到缓冲器B中的是奇数,则由进程W1将其取出打印,否则,由进程W2将其取出打印。规定进程R存入缓冲器B的数,由进程W1和W2正确无误地打印出来(即要求打印的与存入的完全一致)。要求用PV操作管理这3个并发进程,使它们能正确同步工作。 解答: 设3个同步信号量:①empy是进程R的私有信号量,初值为1,表示开始时进程R可向缓冲器B中送一整数;②SW1是进程W1的私有信号量,初值为0,表示开始时缓冲器B中无奇数可供进程W1取;③ SW2是进程W2的私有信号量,初值为0,表示开始时缓冲器B中无偶数可供进程W2取; 3个进程的同步并发程序如下:struct semaphore empty,SW1,SW2=1,0,0;int B;cobegin void PROCESS R(void) { int x; while(TRUE) { 从输入设备上读一个整数到x; P(empty); B=x; if(x%2==1) V(SW1); else V(SW2); } } void PROCESS SW1(void){ int y; while(TRUE) { P(SW1); y=B; V(empty); 打印y中的数; }} void PROCESS SW2(void){ int z; while(TRUE) { P(SW2); z=B; V(empty); 打印z中的数; }} * * V(S1); 进程A 一个整数写入缓冲区; P(S2); P(S1); 进程B 从缓冲区中取出一个整数; V(S2); P(S2); 进程A 一个整数写入缓冲区; V(S1); P(S1); 进程B 从缓冲区中取出一个整数; V(S2); 正确解决方法:设置同步信号量S1,表示开始时缓冲区中没有数据可供进程B读的整数,初值为0;设置同步信号量S2,表示开始时缓冲区中有n个空位置可供进程A送n个整数,初值为n。 Process A begin L1: ① ; 拣黑子; ② ; goto L1; end; V(S2); Process B begin L2: ③ ; 拣白子; ④ ; goto L2; end; 信号量S1(允许进程A拣黑子)、S2 (允许进程B拣白子),初值为1,0 P(S1); P(S2); V(S1); 示例3 一条小
文档评论(0)