操作系统:Peterson 的解决方案
Operating Systems: Peterson's solution
我正在尝试了解 peterson 的同步解决方案。作为参考,我附上阅读来源:
这是来自维基百科页面。现在,
假设 P1 想要进入临界区。它设置 flag<a href="https://i.stack.imgur.com/Gtizp.png" rel="nofollow noreferrer">1</a> = true
和 turn=0
。如果 P0 已经在它的临界区,P1 将在它的 while 循环 while(flag[0] == true && turn ==0)
中继续等待 flag[0] = true
。
我的疑问是:
- 这种情况下会发生什么:P1 正在执行它的 while 循环,而当 P0 刚好试图进入临界区并执行
第
flag[0] = true
行。由于某种原因,它无法执行下一行并终止。其中,flag[0] 也为真,并且
turn 也是 0。P1 在没有进程时不必要地等待
关键部分。
- 为什么需要检查
turn
变量。为什么不仅如此: while(flag[0]== true)
一旦 P0 将
离开临界区,flag[0] = false 并且 P1 将能够
输入。
我对这个同步问题有点困惑,任何帮助将不胜感激。
- Why it needs to check for the turn variable. Why not only this: while(flag[0]== true) As soon as P0 will leave from critical section, flag[0] = false and P1 will be able to enter
如果只使用 flag[0] 和 flag[1] 会导致死锁。让我们考虑 P0 设置 flag[0] = true 并继续检查 while 循环中的条件。在 P0 可以将 flag[1] 值加载到寄存器中进行比较之前,P1 设置 flag[1] = true。所以现在 P0 加载值 true 并将继续等待,因为 flag[0] 也是 true 并且 P0 卡在 while 循环中,P1 也会在 while 循环中等待。这是一个死锁条件,因为双方都在等待对方将标志值更改为 false。
- What will happen in the case: P1 is executing its while loop and when P0 just tries to enter the critical section and executed the line flag[0] = true . Due to some reason, it couldnt't execute the next line and terminated. In this, flag[0] is also true and turn is also 0. P1 unnecessarily waits while no process is inside the critical section.
对于这个问题,我不认为P0 突然终止证明Peterson 的同步解决方案的实现是错误的。这是程序中的缺陷,任何有缺陷的代码都可能导致这种死锁情况。
http://www2.cs.uregina.ca/~hamilton/courses/330/notes/synchro/node3.html
下面link通过说明3个案例来解释为什么我们需要彼得森解的转向变量。基本上,如果不使用turn变量,就会导致死锁。
我正在尝试了解 peterson 的同步解决方案。作为参考,我附上阅读来源:
这是来自维基百科页面。现在,
假设 P1 想要进入临界区。它设置 flag<a href="https://i.stack.imgur.com/Gtizp.png" rel="nofollow noreferrer">1</a> = true
和 turn=0
。如果 P0 已经在它的临界区,P1 将在它的 while 循环 while(flag[0] == true && turn ==0)
中继续等待 flag[0] = true
。
我的疑问是:
- 这种情况下会发生什么:P1 正在执行它的 while 循环,而当 P0 刚好试图进入临界区并执行
第
flag[0] = true
行。由于某种原因,它无法执行下一行并终止。其中,flag[0] 也为真,并且 turn 也是 0。P1 在没有进程时不必要地等待 关键部分。 - 为什么需要检查
turn
变量。为什么不仅如此:while(flag[0]== true)
一旦 P0 将 离开临界区,flag[0] = false 并且 P1 将能够 输入。
我对这个同步问题有点困惑,任何帮助将不胜感激。
- Why it needs to check for the turn variable. Why not only this: while(flag[0]== true) As soon as P0 will leave from critical section, flag[0] = false and P1 will be able to enter
如果只使用 flag[0] 和 flag[1] 会导致死锁。让我们考虑 P0 设置 flag[0] = true 并继续检查 while 循环中的条件。在 P0 可以将 flag[1] 值加载到寄存器中进行比较之前,P1 设置 flag[1] = true。所以现在 P0 加载值 true 并将继续等待,因为 flag[0] 也是 true 并且 P0 卡在 while 循环中,P1 也会在 while 循环中等待。这是一个死锁条件,因为双方都在等待对方将标志值更改为 false。
- What will happen in the case: P1 is executing its while loop and when P0 just tries to enter the critical section and executed the line flag[0] = true . Due to some reason, it couldnt't execute the next line and terminated. In this, flag[0] is also true and turn is also 0. P1 unnecessarily waits while no process is inside the critical section.
对于这个问题,我不认为P0 突然终止证明Peterson 的同步解决方案的实现是错误的。这是程序中的缺陷,任何有缺陷的代码都可能导致这种死锁情况。
http://www2.cs.uregina.ca/~hamilton/courses/330/notes/synchro/node3.html
下面link通过说明3个案例来解释为什么我们需要彼得森解的转向变量。基本上,如果不使用turn变量,就会导致死锁。