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

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

程序中空a和空b处应分别为 (问题1) ,空c和空d处应分别为 (问题2) ;空e和空f处应分别为 (问题3) 。
用信号量PV操作实现进程同步(前驱约束)的核心知识点为:前驱进程执行完成后,需对对应信号量执行V操作,以此向后继进程发送完成信号;后继进程启动前,要对前驱对应的信号量执行P操作,实现对前驱进程的等待。拓展来说,若某进程存在多个前驱,启动前需对每个前驱对应的信号量分别执行P操作,保证所有前驱进程都完成后自身才开始执行;若某进程存在多个后继,执行完成后需对每个后继对应的信号量分别执行V操作,逐一唤醒所有待启动的后继进程。其中P操作的本质是阻塞等待信号,V操作的本质是发送唤醒信号,这一逻辑可推广到任意多进程的前驱后继同步场景,通过PV操作的配对使用,严格保证进程间的执行顺序约束。
本题考察的是用信号量PV操作实现前驱图约束(进程同步)。
在前驱图中,前驱进程结束时对对应信号量执行V操作,后继进程在开始前对该信号量执行P操作,从而保证先后关系;一个结点若有多个前驱,则开始前需要对多个信号量分别执行P;若有多个后继,则结束后需要对多个信号量分别执行V。
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。
