Concurrency 二进制信号量是如何进行的?

Concurrency 二进制信号量是如何进行的?,concurrency,operating-system,semaphore,critical-section,Concurrency,Operating System,Semaphore,Critical Section,我正在研究二进制信号量,这时出现了以下问题: 假设有3个并发进程和3个二进制信号量。。。信号量初始化为S0=1、S1=0、S2=0。这些过程具有以下代码: Process P0: Process P1: Process P2: while (true){ wait(S1); wait(S2); wait (S0);

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

假设有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

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

编辑


我使用二进制信号量的方法是错误的。。他们只能接受0和1

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

解决办法如下:

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

  • P0首先进行并打印0。下面的语句将发布S1和S2!当S1被释放时,过程P1的等待结束,因为S1的值上升1,并且被标记为未采取。P1取S1,并使S1成为所取。过程P2也是如此

  • 现在,
    只能执行P1或P2中的一个,因为它们中的任何一个都可以在给定的时间处于临界区。。假设P2执行。它释放S0并终止

  • 让P1执行下一步。。P1开始释放S0并终止

  • 现在只有P0可以执行,因为它在while循环中,其条件设置为true,这使得它始终运行。
    P0执行时打印0秒,并释放S1和S2。但是P1和P2已经终止,所以P0永远等待S0的释放

  • 下面是第二个将0打印三次的解决方案:

  • P0开始,打印0,并释放S1和S2

  • 让P2执行。P2启动、释放S0并终止。在此之后,只有P0或P1可以执行

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

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

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

  • 所以答案变成两次或三次,也可以说“
    至少两次”

    如果我哪里做错了,请告诉我