首页 文章

处理P0打印“0”的次数是多少?

提问于
浏览
0

以下程序由3个并发进程和3个二进制信号量组成 . 信号量初始化为S0 = 1 S1 = 0 S2 = 0

过程P0:

while(1)
{
wait (S0);
print '0';
release (S1);
release (S2);
}

流程P1:

wait(S1);
release (S0);

过程P2:

wait(S2);
release (S0);

处理PO打印'0“的次数是多少?

(A)至少两次(b)完全tWlce(c)完全三次(d)恰好一次

在这个我有一个混乱,过程P1和P2将执行一次或他们将继续执行一次,因为他们没有像循环过程P0,如果他们将只执行一次那么根据我的答案应该是(b) ,如果他们将再次执行,那么答案将是(A)

请提前帮助谢谢

6 回答

  • 2

    最初 P0 将执行,因为只有 S0=1 . 它将打印单个0 .

    现在当 S1S2P0 释放时,可以执行其中任何一个 .

    让我们假设P1执行并释放S0(现在S0的值为1) .

    现在有两种可能性 P0P2 可以执行 .

    让我们执行 P2 执行并释放 S0 ,所以最后P0执行并打印0(意味着两个0)但是如果 P0P2 之前执行那么将打印总共3个0(一个在 P0 时,然后 P2 释放 S0 所以 P0 再次执行) .

    所以完美的答案是至少两个0 .

  • 0

    解决方案如下:

    • 只有进程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 ”!

    请告诉我,如果我错了!

    有关信号量的更多问题,请参阅this

  • 0

    我假设wait()递减信号量并阻塞它变为<= 0,而release会增加计数器并唤醒下一个进程 .

    给定您的代码,P1和P2执行一次(它们周围没有循环) . 这意味着每个触发一次S0 . 并且当P0在每次打印之前在S0上等待时,它最终将打印“0”两次 .

    要检查的另一件事是S0的初始状态,因为如果S0为0,P0将仅阻塞 . 这是你的陈述的情况 . 因此,答案是P0将正好打印0两次 .

  • 0

    阅读问题和代码,我也会说(A) . 我假设在完成任务之前不能抢占进程 .

    它说初始状态是 S0=1 S1=0 S2=0 ,从我们所知道的 P1P2 将只执行一次 .

    并发过程可能很复杂,但是我试着描述人们会以我的想法发现错误的流程,这没关系,我也在这里学习 .

    现在您有几种情况会产生不同的结果,具体取决于流程的顺序 .

    P0 -> P1 -> P0 -> P2 -> P0 = Three times
    
    P0 -> P1 -> P2 -> P0 = Twice
    
    P0 -> P2 -> P1 -> P0 = Twice
    

    这给了我们至少两次答案 .

    Edit:

    所有这些都是在wait()阻塞的假设下进行的,而semaphore == 0并且release()设置了semaphore = 1,否则代码将主要是精神错乱 .

    如果进程可以随时中断,那么事情就会变得有趣 .

    P0 starts out running because S0=1 at start
    P0 print '0';
    P0 release(S1);
    -- here S1 may take over or not --
    P0 release(S2);
    -- here S2 may take over or not --
    P0 goes back to wait(S0)
    -- here P0 continues or if S1 *and* S2 have not run blocks --
    -- it may also be that only S1 or S2 ran and now the other will run --
    

    现在我尝试找出一种可视化方法的方法,并且我找不到将它放在代码块中的方法 .

    如果S1和S2都尽快运行,因为信号量是二进制的,并且只能处于两种状态中的一种状态,P0只会运行两次,但是如果调度足够延迟S1或S2,直到P0通过等待()P0将再次运行三次 .

    但我认为这个问题并不意味着有可中断的过程,它只会变得混乱 .

  • 0

    P0将首先执行,因为只有S0 = 1 . 因此它将打印0(第一次) . P0也释放S1和S2 . 由于S1 = 1且S2 = 1,因此P1或P2,可以执行它们中的任何一个 . 让我们假设P1执行并释放S0(现在S0的值= 1) . 请注意,P1过程已完成 . 现在S0 = 1且S2 = 1,因此P0可以执行或P2可以执行 . 让我们检查两个条件: -

    • 让我们假设P2执行,并释放S0并完成其执行 . 现在P0执行; S0 = 0并打印0(即第二个0) . 然后发布S1和S2 . 但请注意,P1和P2进程已完成执行 . 再次,如果P0尝试执行,它将进入睡眠状态,因为S0 = 0 . 因此,打印的最小次数“0”为2 .

    • 现在,让我们假设P0执行 . 因此S0 = 0,(由于等待(S0)),它将打印0(第二个0)并释放S1和S2 . 现在只有P2可以执行,因为P1已经完成执行而P0无法执行,因为S0 = 0.现在P2执行并释放S0(即S0 = 1)并完成执行 . 现在P0开始执行并再次打印0(thrid 0)并释放S1和S2(注意现在S0 = 0) . P1和P2已经完成执行,因此P1再次轮流,但由于S0 = 0,它进入睡眠状态 . 并且可以唤醒P0的进程P1和P2已经完成执行 . 因此,打印的最大次数'0'是2 .

    参考:http://www.btechonline.org/2013/01/gate-questions-os-synchronization.html

  • 1

    最初只有P0可以进入while循环,因为S0 = 1,S1 = 0,S2 = 0.P0首先打印'0'然后,在释放S1和S2后,P1或P2将执行并释放S0 . 因此再次打印0 .

相关问题