操作系统学过很久了,很多东西都忘了,刚刚来复习操作系统的PV操作,百度搜了好几篇文章,最后还是看的一知半解,然后看到2018年的一个软考题和答案,这才一目了然。我觉得这个答案是最浅显易懂的解释了。
题目如下:进程 P1、P2、P3、P4 和 P5 的前趋图如下所示:
若用 PV 操作控制这 5 个进程的同步与互斥的程序如下,那么程序中的空①和空②处应分别为(24);空③和空④处应分别为(25);空⑤和空⑥处应分别为(26)。
(24)A. V(S1)和 P(S2) B. P(S1)和 V(S2)
C. V(S1)和 V(S2) D. V(S2)和 P(S1)
(25)A.V(S3)和V(S5) B.P(S3)和V(S5)
C.V(S3)和P(S5) D.P(S3)和P(S5)
(26)A.P(S6)和P(S5)V(S6) B.V(S5)和V(S5)V(S6)
C.V(S6)和P(S5)P(S6) D.P(S6)和P(S5)P(S6)
【答案】D B C
【解析】本题考查的是利用PV操作控制进程的并发执行。
先理清楚前趋图中的逻辑关系:P1没有前驱,P2的前驱是P1,P3的前驱是P1、P2,P4的前驱是P2,P5的前驱是P3、P4。
前驱就是指只有在前驱进程完成后,该进程才能开始执行。由图可知,这里进程之间有6条有向弧,分别表示为P1->P2,P1-P3,P2->P3,P2->P4,P3->P5,P4->P5,各个进程间的逻辑关系,那么我们需要设定6个信号量(S1、S2、S3、S4、S5、S6),利用PV操作来控制这些过程。
对于第一个空①,P1执行完成之后,需要通知P2、P3可以开始,此处需要V(S1)、V(S2)操作分别唤醒P2、P3进程,已有V(S1),此处需要填写V(S2)。
第二个空②,P2执行之前,需要检查P1进程是否完成,因此需要通过P(S1)操作来判定,P1是否完成。
第三个空③,在P3执行之前,需要检查P1、P2进程是否完成,因此需要通过P(S2)、P(S3)操作来判定P1、P2是否完成,已有P(S2),此处填写P(S3)。
第四个空④,P3执行完成后,需要通知P5进程可以开始,此处需要通过V(S5)操作唤醒P5进程;
第五个空⑤,P4进程完成后,需要通知P5进程可以开始,此处需要通过V(S6)操作唤醒P5进程;
第六个空⑥,P5进程开始之前,需要检查P3、P4进程是否已完成,因此需要P(S5)、P(S6)操作来判断P3、P4是否完成。
(滑动查看不方便的话就只看下面这一张图)