临界区的进度和有限等待是啥?

Posted

技术标签:

【中文标题】临界区的进度和有限等待是啥?【英文标题】:What is progress and bounded waiting in critical section?临界区的进度和有限等待是什么? 【发布时间】:2016-01-13 15:08:01 【问题描述】:

我正在阅读 Peter B. Galvin 的操作系统概念中的关键部分问题。 根据它

1)进度是:如果没有进程在其临界区执行,并且某些进程希望进入它们的临界区,那么只有那些没有在其剩余部分执行的进程才能参与决定接下来将进入其临界区,这个选择不能无限期推迟。

2) 有界等待:在进程请求进入其临界区后,允许其他进程进入其临界区的次数存在界限或限制,并且在该请求被批准之前。

我不明白作者在这两种情况下想说什么。

您能否通过与此定义相关的适当示例让我理解。

谢谢。

【问题讨论】:

【参考方案1】:

首先,让我介绍一些术语。 临界区 (CS) 是一系列指令,最多可以同时由一个进程执行。使用临界区时,代码可以分为以下几个部分:

// Some arbitrary code (such as initialization).

EnterCriticalSection(cs);

// The code that constitutes the CS.
// Only one process can be executing this code at the same time. 

LeaveCriticalSection(cs);

// Some arbitrary code. This is called the remainder section.

第一部分包含一些代码,例如初始化代码。我们没有该部分的名称。第二部分是尝试进入 CS 的代码。第三部分是CS本身。第四部分是离开临界区的代码。第五个也是最后一个部分称为剩余部分,它可以包含任何代码。请注意,CS 本身可能因进程而异(例如,一个进程接收来自客户端的请求并将其插入队列,另一个进程处理这些请求)。

要确保关键部分的实现正常工作,必须满足三个条件。你提到了其中两个(我将在下面解释)。三是互斥,这显然是至关重要的。值得注意的是,互斥仅适用于 CS 和休假部分。但是,其他三个部分并不排斥。

第一个条件是进度。此条件的目的是确保某个进程当前在 CS 中并正在做一些工作,或者,如果至少有一个进程想要进入 CS,它会然后做一些工作。在这两种情况下,一些工作正在完成,因此所有流程都在总体上取得进展。

进度:如果没有进程在其临界区执行,并且 一些进程希望进入它们的临界区,那么只有那些 不在其剩余部分执行的进程可以 参与决定下一个将进入其临界区, 并且此选择不能无限期推迟。

让我们逐句理解这个定义。

如果没有进程在其临界区执行

如果有一个进程在其关键部分执行(即使没有明确说明,这也包括离开部分),那么这意味着一些工作正在完成。所以我们正在取得进展。否则,如果不是这种情况......

有些进程希望进入它们的临界区

如果没有进程想要进入它们的临界区,那么就没有更多的工作要做。否则,如果至少有一个进程希望进入其临界区...

那么只有那些不在其剩余部分执行的进程

这意味着我们正在讨论在前两个部分中的任何一个中执行的那些进程(请记住,没有进程在其关键部分或离开部分中执行)...

可以参与决定下一个将进入其临界区,

由于至少有一个进程希望进入它的 CS,我们必须以某种方式选择其中一个进入它的 CS。但谁来做这个决定?那些已经请求允许进入其关键部分的进程有权参与做出此决定。此外,那些可能希望进入其 CS 但尚未请求这样做的进程(这意味着它们正在执行第一部分)也有权参与制作这个决定。

而且这个选择不能无限期推迟。

这表明选择一个进程进入其 CS 将花费有限的时间。特别是,不会出现deadlock or livelock。所以在这个有限的时间之后,一个进程会进入它的CS并做一些工作,从而取得进展。

现在我将解释最后一个条件,即有限等待。此条件的目的是确保每个进程都有机会实际进入其临界区,以便没有进程starves forever。但是,请注意,这个条件和进度都不能保证公平。 CS 的实现不必是公平的。

有界等待:存在一个界限或限制, 允许其他进程进入其临界区的次数 在进程请求进入其临界区之后,并且 在该请求被批准之前。

让我们逐句理解这个定义,从最后一个开始。

在进程请求进入其临界区后 在该请求被批准之前。

也就是说,如果有一个进程请求进入它的CS但还没有进入它。我们称这个过程为 P。

存在数量上的界限或限制 允许其他进程进入其临界区的次数

当 P 等待进入其 CS 时,其他进程可能也在等待,并且某些进程正在其 CS 中执行。当它离开它的CS时,必须选择其他进程进入可能是P也可能不是P的CS。假设选择了P以外的进程。这种情况可能会一次又一次地发生。也就是说,其他进程有机会进入他们的 CS,但从来没有 P。请注意,正在取得进展,但是其他进程而不是 P。问题是 P 没有机会做任何工作。为了防止饥饿,必须保证 P 最终会进入它的 CS。为此,必须限制其他进程进入其 CS 的次数。这样的话,P肯定有机会进入自己的CS。

我想提一下,CS 的定义可以概括为最多有 N 个进程在其临界区执行,其中 N 是任何正整数。还有读写器临界区的变体。

【讨论】:

精彩的逐行讲解 你太棒了。很好的解释! 如果没有饥饿,我们可以说我们有界等待吗? @RadhaGogia 是的。一般来说,饥饿与无限等待是一样的。但是,特定的教科书或论文可能会对这些术语给出更精确的定义。 你能回答这个问题吗? cs.stackexchange.com/questions/100269/…【参考方案2】:

总的来说,临界区问题的解决方案必须满足三个条件:

    互斥:每个进程独占访问共享内存。在任何给定时间,只能有一个进程位于其关键部分。

    进度:如果没有进程处于其临界区,并且如果一个或多个线程想要执行其临界区,则必须允许这些线程中的任何一个进入其临界区部分。

    有限等待:在一个进程发出进入其临界区的请求后,在该进程的请求发出之前,有多少其他进程可以进入其临界区是有限制的的确。因此,达到限制后,系统必须授予进程权限才能进入其临界区。此条件的目的是确保每个进程都有机会实际进入其临界区,这样就不会有进程永远饿死。

【讨论】:

【参考方案3】:

互斥

任何时间点都不能有两个进程同时出现在临界区内,任何时间点只能有一个进程进入临界区。

进度图片:

进展

在临界区之外运行的任何进程都不应阻止其他感兴趣的进程进入临界区,而实际上该临界区是空闲的。 在此图像中,P1(在临界区之外运行)阻止 P2 进入临界区,而实际上临界区是空闲的。

有限等待

任何进程都不应该永远等待才能进入临界区。 进入关键部分的机会应该有一个界限。 如果有界等待不满足,那么就有可能饿死。

注意 没有任何假设与硬件或处理速度有关。

【讨论】:

【参考方案4】:

判断同步解决方案是否正确的要求

1)。互斥:-在任何时间点,临界区中都应该存在一个进程。

2)。进度:-在临界区之外并且不想进入临界区的进程,那么该进程不应阻止其他感兴趣的进程进入其临界区。如果一个进程成功地停止了其他感兴趣的进程,则不能保证进度,否则就可以保证。关键部分应该是免费的。

3)。 Bounded waiting:-临界区外的进程的等待时间应该是有限的。

4)。架构中立:-没有关于硬件的假设

【讨论】:

【参考方案5】:

(简单的定义)

Bounded Waiting :- 当只有单个进程轮到进入临界区时,实际上其他进程也有兴趣进入临界区。

【讨论】:

以上是关于临界区的进度和有限等待是啥?的主要内容,如果未能解决你的问题,请参考以下文章

多线程程序的临界区

进程同步 (Process Synchronization)

临界区和临界资源的关系

c++多线程问题

同步互斥

Linux内核自旋锁