📅  最后修改于: 2020-12-14 03:37:09             🧑  作者: Mango
这是最简单的同步机制。这是在用户模式下实现的软件机制。这是一个繁忙的等待解决方案,可以用于两个以上的进程。
在这种机制中,使用了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。
每个同步机制都是基于四个条件进行判断的。
在这四个参数中,任何解决方案都必须提供“互斥和进展”。让我们根据上述条件来分析这种机制。
在某些情况下,锁变量机制不提供互斥。通过从程序的操作系统IE汇编代码的角度查看伪代码,可以更好地描述这一点。让我们将代码转换为汇编语言。
让我们考虑我们有两个过程P1和P2。进程P1要执行其关键部分。 P1进入条目部分。由于锁的值为0,因此P1将其值从0更改为1并进入临界区。
同时,P1被CPU抢占,P2被调度。现在临界区中没有其他进程,并且lock变量的值为0。P2还希望执行其临界区。通过将lock变量设置为1进入关键部分。
现在,CPU将P1的状态从等待更改为运行。 P1尚未完成其关键部分。 P1已经检查了锁变量的值,并且记住它先前检查时它的值为0。因此,它也进入了关键部分而没有检查锁变量的更新值。
现在,关键部分有两个过程。根据互斥的条件,关键部分中不能同时存在多个进程。因此,锁变量机制不能保证互斥。
锁变量机制的问题在于,同时,有多个进程可以看到空标签,并且有多个进程可以进入关键部分。因此,lock变量不提供互斥功能,这就是为什么它不能被普遍使用的原因。
由于此方法在基本步骤中失败;因此,无需讨论要满足的其他条件。