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

Joh*_*Doe 1 multithreading operating-system

恐龙书上说,临界区问题的解决方案必须满足互斥、进步和有界等待

这是书中彼得森解决方案中描述的流程结构:

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

  // critical section
  flag[i]=False;

  // remainder section
} while (True);
Run Code Online (Sandbox Code Playgroud)

我不明白这是如何解决有界等待问题的。有界等待表示可以阻止进程进入其临界区的次数是有限的,因此没有进程会饿死。但是这里没有针对此的计数器,并且在此解决方案中,进程之间仅共享这两个变量:

int turn;
boolean flag[2];
Run Code Online (Sandbox Code Playgroud)

Rup*_*ngh 5

有界等待表示在一个进程发出进入其临界区的请求之后和该请求被授予之前,允许其他进程进入其临界区的次数必须存在一个界限。

在这里,彼得森的解决方案是考虑严格交替,因此,进程 [0] 和进程 [1] 将获得对临界区的访问权限。如果某些进程使 CS 反复饥饿其他进程,则不会满足有限等待,但这种情况由于严格交替,这是不可能的。

通过使用“turn”变量,可以确保有界等待。