操作系统:彼得森的解决方案

时间:2017-06-14 15:00:26

标签: operating-system synchronization critical-section

我试图了解彼得森的同步解决方案。作为参考,我附上了阅读的来源: enter image description here

这是来自维基百科页面。现在, 让我们说P1想要进入关键部分。它设置了flag1 = trueturn=0。如果P0已经在其临界区中,P1将在其while循环 while(flag[0] == true && turn ==0) 中连续等待flag[0] = true。 我怀疑是:

  1. 在这种情况下会发生什么:P1正在执行其while循环,当P0尝试进入临界区并执行 第flag[0] = true 行。由于某种原因,它无法执行下一行并终止。在这里,flag [0]也是如此 转弯也是0. P1在没有进程的情况下不必要地等待 关键部分。
  2. 为什么需要检查turn变量。为什么不只是这样: while(flag[0]== true)只要P0会     离开临界区,flag [0] = false,P1就可以了     输入
  3. 我对此同步问题感到困惑,任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

  
      
  1. 为什么需要检查转弯变量。为什么不只是这样:while(flag [0] == true)一旦P0离开临界区,标志[0] =假,P1就能进入
  2.   

如果你只使用flag [0]和flag [1],它将导致死锁。让我们考虑P0设置标志[0] =真并继续检查while循环中的条件。在P0可以将标志[1]值加载到寄存器中进行比较之前,P1设置标志[1] =真。所以现在P0加载值为true并且将继续等待,因为标志[0]也是真的并且P0卡在while循环中,P1也会等待while循环。这是一个死锁条件,因为它们都在等待另一个将标志值更改为false。

  
      
  1. 在这种情况下会发生什么:P1正在执行其while循环,当P0尝试进入临界区并执行行标志[0] = true时。由于某种原因,它无法执行下一行并终止。在这里,flag [0]也是true,turn也是0.P1不必等待,而临界区内没有进程。
  2.   

对于这个问题,我不认为P0突然终止证明了Peterson的同步解决方案的实施是错误的。它是程序中的缺陷,任何错误的代码都可能导致这种死锁情况。

答案 1 :(得分:0)

http://www2.cs.uregina.ca/~hamilton/courses/330/notes/synchro/node3.html

以下链接通过说明3个案例解释了为什么我们需要Peterson解决方案的转弯变量。基本上,如果没有使用转弯变量,则会导致死锁。