恐龙书说,关键部分问题的解决方案必须满足相互排斥,进步和有界等待
这是彼得森在书中的解决方案中描述的过程的结构:
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];
有界等待表示在进程请求进入其关键部分之后且在该请求被授予之前,允许其他进程进入其关键部分的次数必须存在绑定。
在这里,彼得森的解决方案考虑严格的交替,因此,过程[0]和过程[1]将访问关键部分。在例如情况下,将不满足这样的有限等待。某些过程会使C.S.反复挨饿其他过程,但由于严格的交替,这种情况是不可能的。
通过使用'turn'变量确保有界等待。
首先,需要知道Peterson的解决方案是一个2流程解决方案。 现在回答...... 在这里,您可以看到进程进入循环时
while(flag[j] && turn==j);
它让进程j进入其关键部分。这里的过程我只会在turn != j or flag[j] == false;
时进入其关键部分
让我们说flag [j] = true。在这种情况下,我必须等待并且不能进入其关键部分(我正在等待的过程)。
现在我们知道,只要进程j完成其关键部分,它就会执行该行
flag[j] = false;
这有助于处理我离开循环,即使现在进程j再次尝试进入其关键部分,它将陷入同一循环和进程我将能够执行其关键部分而无需再等待(这里等待的是1)。 在这里,我们可以看到,即使进程j很快并且尝试进入其关键部分的次数,但是一旦准备执行其关键部分,进程就不会饿死。因此有限等待,即在请求的过程之前可以执行其关键部分的过程量(在此为1)的约束被授予执行其关键部分的许可。