阅读问题和代码我也会说(A)。我假设这些进程在完成任务之前不能被抢占。
它说初始状态是S0=1
S1=0
S2=0
,并且根据我们所知道的P1
并且P2
将执行一次。
并发流程可能很复杂,但是我尝试描述流程,人们会发现我的想法有问题,没关系,我也是来学习的。
现在,您有几种情况会根据流程的顺序产生不同的结果。
P0 -> P1 -> P0 -> P2 -> P0 = Three times
P0 -> P1 -> P2 -> P0 = Twice
P0 -> P2 -> P1 -> P0 = Twice
这给了我们至少两次的答案。
编辑:
所有这一切都是在 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 过去wait() 再次 P0 将运行 3 次。
但我认为这个问题并不意味着有可中断的过程,它只是变得混乱。