如下所示,两个并发进程P1和P2使用四个共享资源R1,R2,R3和R4。
P1 | P2 |
---|---|
Compute: Use R1; Use R2; Use R3; Use R4; |
Compute; Use R1; Use R2; Use R3;. Use R4; |
这两个进程是同时启动的,并且每次只能通过一个进程访问每个资源。在进程对资源的访问之间存在以下调度约束:
- 在P1访问R1之前,P2必须完成对R1的使用
- 在P2访问R2之前,P1必须完成对R2的使用。
- 在P1访问R3之前,P2必须完成对R3的使用。
- 在P2访问R4之前,P1必须完成对R4的使用。
流程之间没有其他调度约束。如果仅使用二进制信号量来执行上述调度约束,那么所需的最小二进制信号量是多少?
(A) 1
(B) 2
(C) 3
(D) 4答案: (B)
解释:
我们使用两个信号量:A和B。
A初始化为0,B初始化为1。
P1:
Compute;
Wait(A);
Use R1;
Use R2;
Signal(B);
Wait(A);
Use R3;
Use R4;
Signal(B);
P2:
Compute;
Wait(B);
Use r1;
Signal(A);
Wait(B);
Use R2;
Use R3;
Signal(A);
Wait(B);
Use R4;
Signal(B);
在过程p1中,最初的控制将停留在Wait(A)的while循环中,因为A = 0。
在过程p2中,Wait(B)将B的值减为0。现在,P2使用资源R1,并将值A增加到1,以便进程P1可以进入其关键部分并使用资源R1。因此,P2将在P1访问R1之前完成R1的使用。现在,在P2中,B的值=0。因此,直到P1使用R2并调用函数Signal(B)将B的值增加到1,P2才能使用资源R2。
因此,P1将在P2访问R2之前完成R2的使用。现在,信号量A =0。因此,P1无法进一步执行,并陷入了函数Wait(A)的while循环中。
进程P2使用R3并将信号量A的值增加到1。现在,P1可以进入其关键部分以使用R3。
因此,P2将在P1访问R3之前完成R3的使用。现在,P1将使用R4并将B的值增加到1,以便P2可以进入使用R4的关键区域。
因此,P1将在P2访问R4之前完成R4的使用。
因此,选项(B)是正确的。
如果您在以上文章中发现任何错误,请在下面发表评论。这个问题的测验