【问题标题】:how does peterson's solution solve bounded waiting?彼得森的解决方案如何解决有界等待?
【发布时间】:2016-05-24 16:45:29
【问题描述】:

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

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

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];

【问题讨论】:

  • 看起来您或这本书都遗漏了一些片段。该算法仅在系统以通常不反映现实的特定方式运行时才有效。我从未停止对操作系统的教学方式感到惊讶。

标签: multithreading operating-system


【解决方案1】:

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

在这里,彼得森的解决方案是考虑严格交替,因此,或者 process[0] 和 process[1] 将获得对临界区的访问权。这里有界等待不会满足,例如一些进程让 C.S. 反复饿死其他进程,但由于严格交替,这种情况是不可能的。

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

【讨论】:

  • 如果我们在进程 Pi 的入口部分有 turn = i 并且对于进程 Pj 也一样,即在它的入口部分有 turn = j,那么互斥、有界等待和进度将失败。是不是我们会存在互斥​​但有限等待会失败?
【解决方案2】:

首先需要知道彼得森的解决方案是一个 2 过程解决方案。
现在答案...
这里可以看到当进程进入循环时

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

它让进程 j 进入它的临界区。这里我只会在turn != j or flag[j] == false;
可以说 flag[j] = true。在这种情况下,进程 i 必须等待并且无法进入其临界区(进程 i 正在等待)。
现在我们知道,一旦进程 j 完成其临界区,它就会执行该行

flag[j] = false;

这有助于进程 i 退出循环,即使现在进程 j 再次尝试进入其临界区,它也会卡在同一个循环中,并且进程 i 将能够执行其临界区而无需再等待(这里等待的界限是 1)。
在这里我们可以看到,即使进程 j 很快并且尝试多次进入其临界区,一旦它准备好执行其临界区,进程 i 也不会饿死。因此,有界等待,即在请求的进程被授予之前可以执行其临界区的进程数量(这里是 1)是有限制的 执行其关键部分的权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2011-05-05
    • 2020-10-17
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多