这是最简单的同步机制。这是在用户模式下实现的软件机制。这是一个繁忙的等待解决方案, 可以用于两个以上的进程。
在这种机制中, 使用了Lock变量lock。可能有两个锁定值, 分别为0或1。锁定值0表示临界区是空的, 而锁定值1则表示它已被占用。
想要进入关键部分的线程首先检查lock变量的值。如果为0, 则将lock的值设置为1并进入临界区, 否则等待。
该机制的伪代码如下所示。
Entry Section →
While (lock! = 0);
Lock = 1;
//Critical Section
Exit Section →
Lock =0;
如果查看伪代码, 则会发现该代码中包含三个部分。入口部分, 关键部分和出口部分。
最初, lock变量的值为0。需要进入临界区, 进入入口区并检查while循环中提供的条件的线程。
进程将无限期等待, 直到lock的值为1(while循环隐含)。由于关键部分在第一时间空缺, 因此该线程将通过将lock变量设置为1进入关键部分。
当进程从关键部分退出时, 然后在退出部分中, 它将lock的值重新分配为0。
每个同步机制都是基于四个条件进行判断的。
- 互斥
- 进展
- 有限的等待
- 可移植性
在这四个参数中, 任何解决方案都必须提供”互斥和进展”。让我们根据上述条件来分析这种机制。
互斥
在某些情况下, 锁变量机制不提供互斥。通过从操作系统角度I.E查看伪代码可以更好地描述这一点。程序的汇编代码。让我们将代码转换为汇编语言。
- 负载锁定, R0
- CMP R0, #0
- JNZ步骤1
- 商店#1, 锁
- 商店#0, 锁
让我们考虑我们有两个线程P1和P2。进程P1要执行其关键部分。 P1进入条目部分。由于锁的值为0, 因此P1将其值从0更改为1并进入临界区。
同时, P1被CPU抢占, P2被调度。现在临界区中没有其他进程, 并且lock变量的值为0。P2还希望执行其临界区。通过将lock变量设置为1进入关键部分。
现在, CPU将P1的状态从等待更改为运行。 P1尚未完成其关键部分。 P1已经检查了锁变量的值, 并且记住它先前检查时它的值为0。因此, 它也进入了关键部分而没有检查锁变量的更新值。
现在, 关键部分有两个线程。根据互斥的条件, 关键部分中不能同时存在多个进程。因此, 锁变量机制不能保证互斥。
锁变量机制的问题在于, 同时, 有多个进程可以看到空标签, 并且有多个进程可以进入关键部分。因此, lock变量不提供互斥功能, 这就是为什么它不能被普遍使用的原因。
由于此方法在基本步骤中失败;因此, 无需讨论要满足的其他条件。
评论前必须登录!
注册