操作系统:Peterson的解决方案
问题描述:
我想了解peterson的同步解决方案。作为参考,我附上了阅读的来源: 操作系统:Peterson的解决方案
这是来自维基百科页面。现在, 假设P1想要进入关键部分。它设置了flag 1 = true
和turn=0
。如果P0已经处于临界区,则P1将继续等待while(flag[0] == true && turn ==0)
的。 我的疑问是:
- 的情况下,会发生什么:P1执行其while循环,当P0只是试图进入临界区,并执行 线
flag[0] = true
。由于某种原因,它不能执行下一行并终止。在这里,标志[0]也是如此,并且 转也是0. P1不必要地等待 临界区内没有进程。 - 为什么需要检查
turn
变量。为什么不仅仅是这样:while(flag[0]== true)
只要P0将 离开临界区,flag [0] = false并且P1将能够 进入。
我在这个同步问题有点困惑,任何帮助将不胜感激。
答
- 为什么需要检查转向变量。为什么不仅如此:在(标志[0] ==真)只要P0将关键部分离开,标志[0] = FALSE和P1将能够进入
如果你要只用flag [0]和flag [1]就会导致死锁。让我们考虑P0设置标志[0] =真,然后继续检查while循环中的条件。在P0可以将寄存器中的标志[1]值加载进行比较之前,P1设置标志[1] =真。所以现在P0加载的值为true,并且将继续等待,并且由于标志[0]也是如此,P0在while循环中停留,所以P1也将等待while循环。这是一个死锁状态,因为两者都在等待另一个将标志值更改为false。
- 会发生的情况下什么: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例,为什么我们需要对彼得森的解决方案转变。基本上,如果转向变量没有被使用,就会导致死锁。