2012-10-17 87 views
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的等待(S1)和进程P2的等待(S2)。现在,等待(S1)和等待(S2)都将使信号量值为-1,并且进程P1并且P2将被阻塞。然后执行处理P0的等待(S0)。发生这种情况时,S0的值变为0,并且进程P0进入阻塞状态,结果所有进程都将被阻塞并处于死锁状态!但不幸的是,这不是答案。 。请告诉我我错在哪里以及解决方案如何进展? :|

编辑

我错了,我的方法来二进制信号..他们只能在0和1拿!

回答

0

确定..所以我在这里回答我的问题:P ..

的解决方案进行如下:

  1. 只有进程P0可以先执行。这是因为进程P0使用的信号量,即S0的初始值为1.现在,当P0调用S0等待时,S0的值变为0,这意味着S0已被P0取得。就程序P1和P2而言,当它们分别在S1和S2上等待时,由于信号已经被初始化为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 ADN释放S1和S2。

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

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

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

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

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

请告诉我,如果我错了任何地方!

相关问题