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

若用PV操作控制进程P1~P4并发执行的过程,则需要设置5个信号量S1、S2、S3、S4和S5,且信号量S1-S5的初值都等于0。下图中a、b和c处应分别填写 (问题1) ;d、e和f处应分别填写 (问题2) 。

用PV操作实现进程前驱约束是进程同步的典型应用,核心规则清晰明确:用于同步的信号量初始值需设为0,代表进程需等待前驱事件完成;前驱进程执行完毕后,要对每个对应后继的信号量执行V操作,以此传递“已完成、可启动”的信号;后继进程启动前,需对所有依赖前驱的信号量执行P操作,确保所有前置条件满足后再推进自身逻辑。当一个进程存在多个前驱时,需为每个前驱单独设置信号量,启动前依次执行对应P操作,等待所有前驱的通知;若一个进程有多个后继,要为每个后继配置独立信号量,完成后逐一执行V操作,分别触发各后继的执行。同时要牢记P操作是申请等待、V操作是释放通知,二者不能混淆,否则会打破进程间的时序约束,引发提前执行、永久等待等同步问题。这类基于信号量的同步逻辑,还可延伸应用到生产者消费者、读者写者等复杂进程协作场景,本质都是通过PV操作的配对,实现进程间的有序协作。
本题考察的是用信号量实现前驱约束(进程同步)。
信号量初值为0表示“需等待”。在前趋图中,每一条有向边用一个信号量表示“前驱完成后释放,后继开始时等待”。根据图中依赖关系:P1→P2 用S1,P1→P3 用S2,P3→P2 用S3,P2→P4 用S4,P3→P4 用S5。
问题1:
A选项 V(S1)V(S2)、P(S1)V(S3)和V(S4):b处为P2开始位置,P2应等待P1与P3完成,应为P(S1)与P(S3)同时等待,但该项把P(S3)放在V后续组合不当,且缺少对S3的等待顺序一致性表达,错误。
B选项 P(S1)V(S2)、P(S1)P(S2)和V(S1):a处在P1末尾应释放给P2和P3的两个信号量,应为V(S1)与V(S2),而不是P;c处应释放给P4的是S4,而不是V(S1),错误。
C选项 V(S1)V(S2)、P(S1)P(S3)和V(S4):a为P1结束后向P2、P3分别发信号,故V(S1)V(S2)正确;b为P2开始需等待来自P1和P3的S1与S3,故P(S1)P(S3)正确;c为P2结束后通知P4可继续,故V(S4)正确。此项正确。
D选项 P(S1)P(S2)、V(S1)P(S3)和V(S2):a处错误地用P;c处应发S4而非S2,错误。
所以选择 C。
问题2:
A选项 P(S2)、V(S3)V(S5)和P(S4)P(S5):d为P3开始需等待来自P1的S2,故P(S2)正确;e为P3结束后需分别通知P2与P4,故V(S3)V(S5)正确;f为P4开始需等待来自P2与P3的S4与S5,故P(S4)P(S5)正确。此项正确。
B选项 V(S2)、P(S3)V(S5)和V(S4)P(S5):d应为等待而非释放,V(S2)错误;f应为等待两个信号量而非对S4执行V,错误。
C选项 P(S2)、V(S3)P(S5)和P(S4)V(S5):e处对S5不应等待而应释放,P(S5)错误;f处对S5不应释放而应等待,V(S5)错误。
D选项 V(S2)、V(S3)P(S5)和P(S4)V(S5):同样把等待与释放颠倒,错误。
所以选择 A。
