操作系统:Peterson的解决方案

问题描述:

我想了解peterson的同步解决方案。作为参考,我附上了阅读的来源: enter image description here操作系统:Peterson的解决方案

这是来自*页面。现在, 假设P1想要进入关键部分。它设置了flag 1 = trueturn=0。如果P0已经处于临界区,则P1将继续等待while(flag[0] == true && turn ==0)的。 我的疑问是:

  1. 的情况下,会发生什么:P1执行其while循环,当P0只是试图进入临界区,并执行 线flag[0] = true。由于某种原因,它不能执行下一行并终止。在这里,标志[0]也是如此,并且 转也是0. P1不必要地等待 临界区内没有进程。
  2. 为什么需要检查turn变量。为什么不仅仅是这样:while(flag[0]== true)只要P0将 离开临界区,flag [0] = false并且P1将能够 进入。

我在这个同步问题有点困惑,任何帮助将不胜感激。

  1. 为什么需要检查转向变量。为什么不仅如此:在(标志[0] ==真)只要P0将关键部分离开,标志[0] = FALSE和P1将能够进入

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

  1. 会发生的情况下什么:P1执行其while循环并且当P0只是试图进入临界区和执行的行标志[0] =真。由于某种原因,它不能执行下一行并终止。在这种情况下,flag [0]也是true,并且turn也是0.在临界区内没有进程时,P1会不必要地等待。

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

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

以下链接说明,通过说明3例,为什么我们需要对彼得森的解决方案转变。基本上,如果转向变量没有被使用,就会导致死锁。