彼得森的解决方案如何解决有限的等待?

时间:2016-05-24 16:45:29

标签: multithreading operating-system

恐龙书说,关键部分问题的解决方案必须满足相互排斥,进步和有限等待

这是Peterson在本书中的解决方案中所描述的过程的结构:

do {
  flag[i]=True;
  turn=j;
  while (flag[j] && turn==j);

  // critical section
  flag[i]=False;

  // remainder section
} while (True);

我不明白这是如何解决有限的等待问题。有限的等待表示,进程停止进入其关键部分的次数是有限的,这样就不会有任何进程被饿死。但是这里没有反制,并且这个过程中的进程之间只分享这两个变量:

int turn;
boolean flag[2];

2 个答案:

答案 0 :(得分:4)

有限等待表示在进程请求进入其关键部分之后且在该请求之前允许其他进程进入其关键部分的次数必须存在一个限制理所当然的。

这里,彼得森的解决方案是考虑严格交替,因此,过程[0]和过程[1]将可以访问临界区。在例如情况下,不会满足这样的有限等待。某些过程会使C.S.反复挨饿其他过程,但由于严格的交替,这种情况是不可能的。

通过使用'turn'变量确保有界等待。

答案 1 :(得分:0)

首先,需要知道彼得森的解决方案是一个双流程解决方案 现在回答......
在这里,您可以看到进程进入循环时

while(flag[j] && turn==j);

它允许进程j进入其关键部分。这里的过程我只会在turn != j or flag[j] == false;
时进入其关键部分 让我们说flag [j] = true。在这种情况下,我必须等待并且不能进入其关键部分(我正在等待的过程)。
现在我们知道,只要进程j完成其临界区,它就会执行行

flag[j] = false;

这有助于处理我离开循环,即使现在进程j再次尝试进入其关键部分,它将陷入同一循环和进程我将能够执行其关键部分而无需再等待(这里等待的界限是1) 在这里,我们可以看到,即使进程j很快并且尝试进入其关键部分的次数,但是一旦准备执行其关键部分,进程就不会饿死。因此有限等待,即在请求的进程被执行之前可以执行其关键部分的进程数量(此处为1)的约束被授予 允许执行其关键部分。