锁变量

2024 年 8 月 28 日 | 3 分钟阅读

这是最简单的同步机制。这是一种在用户模式下实现的软件机制。这是一种忙等待解决方案,可用于两个以上的进程。

在此机制中,使用了一个锁变量 lock。锁的值可以是 0 或 1。锁值为 0 表示临界区空闲,而锁值为 1 表示临界区已被占用。

想要进入临界区的进程首先检查锁变量的值。如果为 0,则将锁的值设置为 1 并进入临界区,否则等待。

该机制的伪代码如下所示。

如果我们查看伪代码,我们会发现代码中有三个部分:进入区、临界区和退出区。

最初,锁变量的值为 0。需要进入临界区的进程进入进入区,并检查 while 循环中提供的条件。

该进程将无限期等待,直到 lock 的值为 1(由 while 循环暗示)。由于临界区在第一次时是空闲的,因此进程将通过将锁变量设置为 1 来进入临界区。

当进程从临界区退出时,在退出区中,它将 lock 的值重新分配为 0。

每种同步机制都根据四个条件进行判断。

  1. 互斥
  2. 进度
  3. 有界等待 (Bounded Waiting)
  4. 可移植性

在这四个参数中,任何解决方案都必须提供互斥和进步。让我们根据上述条件分析这种机制。

互斥

在某些情况下,锁变量机制不提供互斥。通过从操作系统的角度(即程序的汇编代码)查看伪代码,可以更好地描述这一点。让我们将代码转换为汇编语言。

  1. 加载锁,R0
  2. 比较 R0,#0
  3. 如果 R0 不为 0,则跳转到步骤 1
  4. 存储 #1,锁
  5. 存储 #0,锁

让我们假设我们有两个进程 P1 和 P2。进程 P1 想要执行其临界区。P1 进入进入区。由于锁的值为 0,因此 P1 将其值从 0 更改为 1 并进入临界区。

同时,P1 被 CPU 抢占,P2 被调度。现在临界区中没有其他进程,锁变量的值为 0。P2 也想执行其临界区。它通过将锁变量设置为 1 来进入临界区。

现在,CPU 将 P1 的状态从等待更改为运行。P1 尚未完成其临界区。P1 已经检查了锁变量的值,并记得它之前检查时值为 0。因此,它也进入临界区,而无需检查锁变量的更新值。

现在,临界区中有两个进程。根据互斥条件,临界区中不能同时存在多个进程。因此,锁变量机制不能保证互斥。

锁变量机制的问题在于,在同一时间,多个进程可以看到空闲标签,并且多个进程可以进入临界区。因此,锁变量不提供互斥,这就是它不能普遍使用的原因。

由于此方法在基本步骤上失败了;因此,没有必要讨论其他需要满足的条件。


下一主题TSL 机制