操作系统 锁变量
这是最简单的同步机制。这是一种在用户模式下实现的软件机制。这是一种可以用于两个以上进程的繁忙等待解决方案。
在这种机制中,使用一个锁变量 lock 。锁的值可以是0或1。锁的值为0意味着临界区是空闲的,而锁的值为1意味着它被占用。
想要进入临界区的进程首先检查锁变量的值。如果为0,则将锁的值设置为1并进入临界区,否则等待。
机制的伪代码如下所示。
Entry Section →
While (lock! = 0);
Lock = 1;
//Critical Section
Exit Section →
Lock =0;
假设我们看一下伪代码,我们可以发现代码中有三个部分。入口部分、临界区和退出部分。
初始时 锁变量 的值是 0 。需要进入 临界区 的进程首先进入入口区,并检查while循环中提供的条件。
如果 锁 的值为1(在while循环中已隐含),进程将无限等待。由于第一次临界区为空,因此进程将通过将锁变量设置为1进入临界区。
当进程从临界区退出时,在退出区中将锁的值重新赋为0。
每种同步机制都根据四个条件进行评估。
- 互斥
- 进展
- 有界等待
- 可移植性
在这四个参数中,互斥和进展必须由任何解决方案提供。我们将根据上述条件分析该机制。
互斥
在某些情况下,锁变量机制不提供互斥。从操作系统的角度来看,可以通过查看程序的汇编代码来更好地描述。让我们将代码转换为汇编语言。
- Load Lock, R0
- CMP R0, #0
- JNZ Step 1
- Store #1, Lock
- Store #0, Lock
假设我们有两个进程P1和P2。进程P1希望执行其临界区。P1进入入口区。由于锁的值为0,因此P1将其值从0改为1并进入临界区。
同时,P1被CPU抢占,P2被调度。此时临界区没有其他进程,锁变量的值为0。P2也希望执行其临界区。它通过将锁变量设置为1进入临界区。
现在,CPU将P1的状态从等待更改为运行。P1还没有完成其临界区。P1已经检查了锁变量的值,并记住先前检查时的值为0。因此,它也在不检查锁变量的更新值的情况下,进入临界区。
现在,我们有两个进程在临界区。根据互斥条件,临界区中不应该同时存在多个进程。因此,锁变量机制不能保证互斥。
锁变量机制的问题在于,同时可以有多个进程看到空标签,并且可以有多个进程进入临界区。因此,锁变量不能提供互斥,因此不能在一般情况下使用。
由于该方法在基本步骤上失败了,因此无需讨论其他需要满足的条件。