进程P1、P2、P3、P4、P5的前趋关系图如下所示:

若用PV操作控制这5个进程的同步与互斥,程序如下:

程序中空a和空b处应分别为(问题1),空c和空d处应分别为(问题2);空e和空f处应分别为(问题3)。
本题考察的是用信号量PV操作实现前驱图约束(进程同步)。
在前驱图中,前驱进程结束时对对应信号量执行V操作,后继进程在开始前对该信号量执行P操作,从而保证先后关系;一个结点若有多个前驱,则开始前需要对多个信号量分别执行P;若有多个后继,则结束后需要对多个信号量分别执行V。
问题1(P2 的 a/b):
P2 的唯一前驱是 P1,因此在开始前需等待 P1 结束;而 P2 的后继有 P4 与 P3,因此完成后需分别通知它们。
A选项 V(S1) 和 V(S2)V(S3):开始前做V错误,不能用V等待前驱;错误。
B选项 P(S1) 和 V(S2)V(S3):开始前用P(S1)等待P1的V(S1);结束后用V(S2)、V(S3)分别唤醒后继;正确。
C选项 P(S1) 和 P(S2)V(S3):结束后应是V而非P;错误。
D选项 P(S1) 和 P(S2)P(S3):结束后都做P更不对;错误。
所以选择 B。
问题2(P3 的 c/d):
P3 的前驱有两个:P2 与 P4,因此开始前需等待两个信号;P3 的后继是 P5,结束后需通知 P5。
A选项 V(S2)V(S4) 和 V(S5):开始前应为P而非V;错误。
B选项 P(S2)V(S4) 和 V(S5):还缺对来自P4的等待,应为P(S4);错误。
C选项 P(S2)P(S4) 和 V(S5):开始前对S2、S4各做一次P以分别等待P2与P4;结束后V(S5)唤醒P5;正确。
D选项 P(S2)V(S4) 和 P(S5):结束后应通知而非再等待;错误。
所以选择 C。
问题3(P4 的 e/f):
P4 的唯一前驱是 P2,因此开始前需等待来自 P2 的信号;P4 的后继有 P3 与 P5,结束后需分别通知它们。
A选项 V(S3) 和 V(S4)V(S6):开始前应为P而非V;错误。
B选项 P(S3) 和 V(S4)V(S6):开始前用P(S3)等待P2;结束后分别V(S4)、V(S6)通知P3、P5;正确。
C选项 P(S3) 和 P(S4)V(S6):结束后对S4做P错误;错误。
D选项 P(S3) 和 V(S4)P(S6):结束后对S6做P错误;错误。
所以选择 B。
