【问题标题】:Critical section临界区
【发布时间】:2012-06-17 11:53:02
【问题描述】:

下面的解如何不满足临界区问题的解标准

这三种情况哪一种不满足?
1. 互斥
2. 进展
3.有界等待

我知道这是满足互斥但2和3呢?
请注意,这不是家庭作业。想了很多,还是没搞清楚。

[编辑]
删除图片并添加代码。

Pi’s Algorithm    
    Var flag : array [ i…j] of boolean    
    repeat  
    flag [i] = true;    
While ( flag [j]  == “ true ”) do no-op;        


            Critical section


Flag [i]=“ false ”;
 until false

另一个进程

Pj’s Algorithm    
    Var flag : array [ i…j] of boolean
repeat  
  flag [ j ] = true;
While ( flag [ i ]  == “ true ”) do no-op;  


        Critical section


Flag [j]=“ false ”;
 until false

【问题讨论】:

  • 这是一个来自采访的问题,他们问为什么彼得森问题如果只取一个变量就会失败?所以,我只为一个变量标志编写了代码,并留下了另一个[转]。现在,我无法弄清楚这是如何失败的?

标签: operating-system


【解决方案1】:

系统可能出现死锁:

2 个进程:P1、P2。我假设 i 和 j 是进程的 ID,并且是共享变量,flags 数组也是如此。

然后P1开始执行:

flag[1] := true;

-> 这里 P1 被调度程序中断,P2 开始运行:

flag[2] := true;
while (flag[1] == true) do nop ;

-> P2 仍然在这个循环中。稍后调度程序再次选择 P1:

while (flag[2] == true) do nop;

-> P1 也陷入了循环。没有进展。这种死锁,因此违反了#2 和#3。此外,也有可能一个进程被饿死(另一个进程总是运行整个代码并且永远不会在 flag[i] := false 和 flag[i] := true 之间中断,因此第一个进程永远不会得到有机会离开 while 循环。

【讨论】:

  • 我同意你的看法。但是,您不认为彼得森的解决方案中也会发生这种情况,但仍然证明它为临界区问题提供了解决方案。请看这个链接:stackoverflow.com/questions/4849077/…
猜你喜欢
  • 2018-10-17
  • 2013-03-26
  • 2013-04-07
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多