两个并发进程 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; |
两个进程同时启动,每个资源一次只能被一个进程访问 进程对资源的访问之间存在以下调度约束:
- P2 必须在 P1 访问 R1 之前完成对 R1 的使用
- 在 P2 访问 R2 之前,P1 必须完成对 R2 的使用。
- 在 P1 访问 R3 之前,P2 必须完成对 R3 的使用。
- 在 P2 访问 R4 之前,P1 必须完成对 R4 的使用。
进程之间没有其他调度约束。如果只使用二进制信号量来强制执行上述调度约束,那么所需的最少二进制信号量是多少?
(一) 1
(乙) 2
(三) 3
(四) 4答案:(乙)
解释:
我们使用两个信号量: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 的使用。现在,在 B = 0 的 P2 值中。因此,P2 不能使用资源 R2,直到 P1 使用 R2 并调用函数Signal(B) 将 B 的值增加到 1。
因此,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)是正确的。
如果您发现上面的帖子有任何错误,请在下面发表评论。这个问题的测验