Operating system 操作系统:彼得森&x27;s溶液

Operating system 操作系统:彼得森&x27;s溶液,operating-system,synchronization,critical-section,Operating System,Synchronization,Critical Section,我试图理解彼得森的同步解决方案。作为参考,我附上阅读资料来源: 这是来自维基百科页面。现在, 假设P1想要进入临界区。它设置flag=true和turn=0。如果P0已经在其关键部分,P1将在其while循环中持续等待while(标志[0]==true&&turn==0)作为标志[0]=true。 我的疑问是: 在这种情况下会发生什么:P1正在执行其while循环,而P0只是尝试进入临界段并执行 行标志[0]=true。由于某种原因,它无法执行下一行并终止。在这种情况下,标志[0]也是正确的

我试图理解彼得森的同步解决方案。作为参考,我附上阅读资料来源:

这是来自维基百科页面。现在, 假设P1想要进入临界区。它设置
flag=true
turn=0
。如果P0已经在其关键部分,P1将在其while循环中持续等待
while(标志[0]==true&&turn==0)
作为
标志[0]=true
。 我的疑问是:

  • 在这种情况下会发生什么:P1正在执行其while循环,而P0只是尝试进入临界段并执行 行
    标志[0]=true
    。由于某种原因,它无法执行下一行并终止。在这种情况下,标志[0]也是正确的 回合也为0。P1在没有进程的情况下不必要地等待 关键部分
  • 为什么需要检查
    turn
    变量。为什么不仅如此:
    while(flag[0]==true)
    只要P0愿意 离开临界段,标志[0]=假,P1将能够 进入
  • 我对这个同步问题有点困惑,如果有任何帮助,我们将不胜感激

  • 为什么需要检查turn变量。为什么不仅如此:虽然(标志[0]==真)只要P0离开临界段,标志[0]=假,P1就可以进入
  • 如果只使用标志[0]和标志[1],将导致死锁。让我们考虑P0设置标志[0 ]=Trand并继续检查while循环中的条件。在P0可以加载寄存器中的标志[1]值进行比较之前,P1将标志[1]=true。因此,现在P0加载值true并将继续等待,因为标志[0]也是true,并且P0卡在while循环中,P1也将等待while循环。这是一种死锁状态,因为两者都在等待另一方将标志值更改为false

  • 在这种情况下会发生什么:P1正在执行其while循环,而P0只是尝试进入临界段并执行行标志[0]=true。由于某种原因,它无法执行下一行并终止。在这种情况下,标志[0]也是真的,转角也是0。P1在临界段内没有进程时不必要地等待
  • 对于这个问题,我不认为这会突然证明彼得森同步解决方案的实现是错误的。这是程序中的一个缺陷,任何错误代码都可能导致这种死锁情况

    下面的链接通过说明3种情况解释了为什么我们需要Peterson的解决方案使用turn变量。基本上,如果不使用turn变量,将导致死锁