当出现以下问题时,我正在研究二进制信号量:
假设有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 :(得分:0)
好的..所以我在这里回答我自己的问题:P ..
解决方法如下:
只有进程P0才能先执行。这是因为进程P0使用的信号量,即S0的初始值为1.现在当P0调用S0等待时,S0的值变为0,这意味着S0已被P0占用。就过程P1和P2而言,当它们分别在S1和S2上调用wait时,它们无法继续,因为信号量已经被初始化为取即0,所以它们必须等到S1和S2被释放!
P0先行并打印0.现在接下来的陈述将释放S1和S2!当S1被释放时,过程P1的等待结束,因为S1的值上升1并且未被标记。 P1取S1并使S1成为。过程P2也是如此。
现在,only one of P1 or P2 can execute, because either of them can be in the critical section at a given time
..假设P2执行。它释放S0并终止。
让P1执行下一步.. P1开始释放S0并终止。
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的发布。
这是第二个打印0次的解决方案:
P0开始,打印0和释放S1和S2。
让P2执行。 P2启动,释放S0并终止。在此之后,只能执行P0或P1。
让P0执行。第二次打印0并释放S1和S2。此时只有P1可以执行。
P1开始,释放S0,P1终止。此时只有P0可以执行,因为它在一个while循环中,其条件设置为true!
P0开始,第3次打印0并释放S1和S2。然后它等待有人释放从未发生过的S0。
所以答案恰好是两次或者恰好三次,也可以说是“atleast twice
”!
请告诉我,我在哪里错了!