首页 文章

二进制信号量如何进行?

提问于
浏览
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进入阻塞状态,因此所有进程都将被阻塞并处于死锁状态!但不幸的是,这不是答案 . . 请告诉我我错在哪里以及解决方案如何进行? :|

EDIT

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

1 回答

  • 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 ”!

    请告诉我,如果我错了!

相关问题