1

当出现以下问题时,我正在研究二进制信号量:

假设有 3 个并发进程和 3 个二进制信号量……信号量被初始化为 S0=1、S1=0、S2=0。这些进程具有以下代码:

Process P0:                   Process P1:                       Process P2:

while (true){                 wait(S1);                         wait(S2);
wait (S0);                    release (S0);                     release(S0);
print '0';
release (S1);
release (S2);
}

现在的问题是该过程将打印多少次 0 ?

让我解释一下我是如何解决它的。假设三个进程的前三个语句同时执行!即,进程p0的while语句,进程p1的wait(S1)和进程P2的wait(S2)。现在,wait(S1)和wait(S2)都将使信号量值-1和进程P1并且 P2 将被阻塞.. 然后进程 P0 的 wait(S0) 将被执行。当这种情况发生时,S0 的值变为 0 并且进程 P0 进入阻塞状态,结果所有进程都将被阻塞并处于死锁状态!但不幸的是,这不是答案。. 请告诉我我错在哪里以及解决方案如何进行?:|

编辑

我对二进制信号量的方法是错误的。它们只能取 0 和 1!

4

1 回答 1

0

好的..所以我在这里回答我自己的问题:P ..

解决方案如下:

  1. 只有进程 P0 可以先执行。这是因为进程 P0 使用的信号量,即 S0 的初始值为 1。现在当 P0 调用等待 S0 时,S0 的值变为 0,这意味着 S0 已被 P0 占用。就 Process P1 和 P2 而言,当它们分别在 S1 和 S2 上调用 wait 时,它们无法继续进行,因为信号量已经被初始化为取 0,所以它们必须等到 S1 和 S2 被释放!

  2. P0 首先执行并打印 0。现在下一条语句释放 S1 和 S2!当 S1 被释放时,进程 P1 的等待结束,因为 S1 的值增加了 1 并被标记为未占用。P1 取 S1 并使 S1 为取。过程 P2 也是如此。

  3. 现在,only one of P1 or P2 can execute, because either of them can be in the critical section at a given time.. 假设 P2 执行。它释放 S0 并终止。

  4. 让 P1 执行下一步.. P1 启动 释放 S0 并终止。

  5. Now only P0 can execute because its in a while loop whose condition is set to true, which makes it to run always.P0 执行第二次打印 0 并释放 S1 和 S2。但是 P1 和 P2 已经终止,所以 P0 永远等待 S0 的释放。

这是第二个解决方案,它打印 0 三次:

  1. P0 启动,打印 0 并释放 S1 和 S2。

  2. 让 P2 执行。P2 启动,释放 S0 并终止。此后只有 P0 或 P1 可以执行。

  3. 让 P0 执行。第二次打印 0 并释放 S1 和 S2。此时只有 P1 可以执行。

  4. P1 启动,释放 S0,P1 终止。此时只有 P0 可以执行,因为它在条件设置为 true 的 while 循环中!

  5. P0 启动,第三次打印 0 并释放 S1 和 S2。然后它等待某人释放 S0,而这永远不会发生。

所以答案就变成了正好两倍或正好三次,也可以说是“ atleast twice”!

请告诉我我是否在任何地方错了!!

于 2012-10-18T03:40:44.110 回答