感兴趣变量机制

17 Mar 2025 | 4 分钟阅读

我们必须确保我们的同步机制提供进展。在轮流变量机制中,由于不希望进入临界区的进程不考虑其他感兴趣的进程,因此未提供进展。

无论临界区内没有人,其他进程也必须等待。如果操作系统可以使用一个额外的变量以及轮流变量,那么这个问题就可以解决,并且我们的问题可以在最大程度上提供进展。

感兴趣变量机制使用一个额外的布尔变量来确保提供进展。

对于进程 Pi

对于进程 Pj

在此机制中,使用了一个额外的变量 interested。这是一个布尔变量,用于存储进程进入临界区的兴趣。

希望进入临界区的进程首先在进入区检查其他进程是否感兴趣。该进程将等待,直到其他进程感兴趣。

在退出区,进程将其兴趣变量的值设置为 false,以便其他进程可以进入临界区。

该表显示了两个进程的兴趣变量的可能值以及在这种情况下获得机会的进程。

兴趣 [Pi]兴趣 [Pj]获得机会的进程
truetrue首先表示兴趣的进程。
trueFalse圆周率
FalsetruePj
FalseFalseX

让我们根据要求分析该机制。

互斥

在感兴趣变量机制中,如果一个进程对进入 CPU 感兴趣,则其他进程将等待直到它变得不感兴趣。因此,临界区中不可能同时存在多个进程,因此该机制保证了互斥。

进度

在此机制中,如果一个进程对进入临界区不感兴趣,它将不会阻止其他进程进入临界区。因此,此方法肯定会提供进展。

有界等待 (Bounded Waiting)

为了分析有界等待,让我们考虑两个进程 Pi 和 Pj 是协作进程,希望在临界区中执行。进程执行的指令以下列相对方式显示。

进程 Pi进程 Pj进程 Pi进程 Pj
1. Int [Pi] = True
2. while (Int [Pj] == True);
3. 临界区
1. Int [Pj] = True
2. while (Int[Pi]==True);
1. Int [Pi] = False
2. Int [Pi] = True
3. while (Int [Pj] == True); //等待 Pj
1. While (Int [Pi] == True); //等待 Pj

最初,两个进程的兴趣变量都为 false。进程 Pi 表示对进入临界区感兴趣。

它将其兴趣变量设置为 true,并检查 Pj 是否也感兴趣。由于其他进程的兴趣变量为 false,因此 Pi 将进入临界区。

同时,进程 Pi 被抢占,Pj 被调度。Pj 是一个协作进程,因此,它也希望进入临界区。它通过将兴趣变量设置为 true 来表示其兴趣。

它还会检查其他进程是否也感兴趣。我们应该注意到 Pi 被抢占,但其兴趣变量为 true,这意味着它需要在临界区中进一步执行。因此,Pj 将无法获得机会并陷入 while 循环。

同时,CPU 将 Pi 的状态从阻塞更改为运行。Pi 尚未完成其临界区,因此它完成临界区并通过将兴趣变量设置为 False 来退出。

现在,可能会出现一种情况,即 Pi 再次想要进入临界区并将其兴趣变量设置为 true,并检查 Pj 的兴趣变量是否为 true。在这里,Pj 的兴趣变量为 True,因此 Pi 将陷入 while 循环并等待 Pj 变得不感兴趣。

由于 Pj 仍然陷入 while 循环,等待 Pi 的兴趣变量变为 false。因此,两个进程都在相互等待,并且它们都没有进入临界区。

这是死锁条件,在死锁情况下永远无法提供有界等待。

因此,我们可以说感兴趣变量机制不能保证无死锁。

架构中立性

该机制是一个完整的在用户模式下执行的软件机制,因此它保证了可移植性或架构中立性。


os Interested Variable Mechanism