锁变量2024 年 8 月 28 日 | 3 分钟阅读 这是最简单的同步机制。这是一种在用户模式下实现的软件机制。这是一种忙等待解决方案,可用于两个以上的进程。 在此机制中,使用了一个锁变量 lock。锁的值可以是 0 或 1。锁值为 0 表示临界区空闲,而锁值为 1 表示临界区已被占用。 想要进入临界区的进程首先检查锁变量的值。如果为 0,则将锁的值设置为 1 并进入临界区,否则等待。 该机制的伪代码如下所示。 如果我们查看伪代码,我们会发现代码中有三个部分:进入区、临界区和退出区。 最初,锁变量的值为 0。需要进入临界区的进程进入进入区,并检查 while 循环中提供的条件。 该进程将无限期等待,直到 lock 的值为 1(由 while 循环暗示)。由于临界区在第一次时是空闲的,因此进程将通过将锁变量设置为 1 来进入临界区。 当进程从临界区退出时,在退出区中,它将 lock 的值重新分配为 0。 每种同步机制都根据四个条件进行判断。
在这四个参数中,任何解决方案都必须提供互斥和进步。让我们根据上述条件分析这种机制。 互斥在某些情况下,锁变量机制不提供互斥。通过从操作系统的角度(即程序的汇编代码)查看伪代码,可以更好地描述这一点。让我们将代码转换为汇编语言。
让我们假设我们有两个进程 P1 和 P2。进程 P1 想要执行其临界区。P1 进入进入区。由于锁的值为 0,因此 P1 将其值从 0 更改为 1 并进入临界区。 同时,P1 被 CPU 抢占,P2 被调度。现在临界区中没有其他进程,锁变量的值为 0。P2 也想执行其临界区。它通过将锁变量设置为 1 来进入临界区。 现在,CPU 将 P1 的状态从等待更改为运行。P1 尚未完成其临界区。P1 已经检查了锁变量的值,并记得它之前检查时值为 0。因此,它也进入临界区,而无需检查锁变量的更新值。 现在,临界区中有两个进程。根据互斥条件,临界区中不能同时存在多个进程。因此,锁变量机制不能保证互斥。 锁变量机制的问题在于,在同一时间,多个进程可以看到空闲标签,并且多个进程可以进入临界区。因此,锁变量不提供互斥,这就是它不能普遍使用的原因。 由于此方法在基本步骤上失败了;因此,没有必要讨论其他需要满足的条件。 下一主题TSL 机制 |
简介:计数信号量是介于 [0, n] 之间的同步机制,其中 n 是大于一 (1) 的非负整数。通过以这种方式计数信号量,可以提供许多关键组件的访问令牌。这使得多个实体可以访问关键...
阅读 8 分钟
这是一种在用户模式下实现的软件机制。它是一种忙等待解决方案,只能用于两个进程。它使用两个变量:turn 变量和 interested 变量。解决方案的代码如下 # define N 2 # define TRUE...
阅读 3 分钟
优先级反转 在 TSL 机制中,可能存在优先级反转问题。假设有两个协作进程 P1 和 P2。P1 的优先级为 2,而 P2 的优先级为 1。P1 先到达并被 CPU 调度。由于它...
阅读1分钟
Test Set Lock 机制 汇编代码中的修改 在 lock 变量机制中,有时进程会读取 lock 变量的旧值并进入临界区。因此,可能有两个或多个进程进入临界区。然而,在第一部分所示的代码中...
阅读 3 分钟
(操作系统)当两个或多个进程相互协作时,它们的执行顺序必须得到保证,否则它们的执行可能发生冲突,并可能产生不适当的输出。协作进程是指可以影响其他进程执行的进程...
阅读1分钟
无忙等待的同步机制 我们到目前为止看到的所有解决方案都旨在通过忙等待提供互斥。然而,忙等待不是最优的资源分配,因为它会一直占用 CPU 来持续检查 while 循环条件...
阅读1分钟
机制 我们必须确保我们的同步机制能够提供进展。在 turn 变量机制中,由于不希望进入临界区的进程不考虑其他...,因此没有提供进展。
阅读 4 分钟
或互斥量简介:称为二进制信号量的同步机制的整数值介于 0 和 1 之间。因此,此类信号量提供对临界区的单一访问点。这意味着关键组件仅对一个人可用...
阅读 4 分钟
在 OS(操作系统)中,临界区是程序中尝试访问共享资源的部分。该资源可以是计算机中的任何资源,如内存位置、数据结构、CPU 或任何 IO 设备。临界区不能由多于... 执行。
阅读 2 分钟
(生产者-消费者问题) 让我们检查基本的 sleep 和 wake 模型。假设我们有两个系统调用:sleep 和 wake。调用 sleep 的进程将被阻塞,而调用 wake 的进程将被唤醒。有一个流行的例子叫做生产者...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India