二进制信号量如何进行?

时间:2012-10-17 14:55:54

标签: 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);                    release (S0);                     release(S0);
print '0';
release (S1);
release (S2);
}

现在的问题是这个过程会打印多少次0?

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

修改

我对二进制信号量的处理方式错了..它们只能占用0和1!

1 个答案:

答案 0 :(得分:0)

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

解决方法如下:

  1. 只有进程P0才能先执行。这是因为进程P0使用的信号量,即S0的初始值为1.现在当P0调用S0等待时,S0的值变为0,这意味着S0已被P0占用。就过程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第二次执行打印并释放S1和S2。但是P1和P2已经被终止,因此P0将永远等待S0的发布。

  6. 这是第二个打印0次的解决方案:

    1. P0开始,打印0和释放S1和S2。

    2. 让P2执行。 P2启动,释放S0并终止。在此之后,只能执行P0或P1。

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

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

    5. P0开始,第3次打印0并释放S1和S2。然后它等待有人释放从未发生过的S0。

    6. 所以答案恰好是两次或者恰好三次,也可以说是“atleast twice”!

      请告诉我,我在哪里错了!