操作系统 TSL自旋锁机制

操作系统 TSL自旋锁机制

修改装配代码

在锁变量机制中,有时进程会读取锁变量的旧值并进入临界区。因此,多个进程可能进入临界区。然而,下面部分一中显示的代码可以替换为部分二中显示的代码。这不会影响算法,但是通过这样做,我们可以在一定程度上提供互斥,但不能完全实现。

在代码的更新版本中,将锁的值加载到本地寄存器R0中,然后将锁的值设置为1。

然而,在步骤3中,将之前的锁的值(现在存储在R0中)与0进行比较。如果为0,则进程将简单地进入临界区,否则将通过连续执行循环等待。

由进程自身立即将锁设置为1的好处是,进入临界区的进程携带的是锁变量的更新值1。

即使在被抢占并再次调度时,无论锁变量的当前值如何,它也不会进入临界区,因为它已经知道锁变量的更新值是多少。

Section 1

1. Load Lock, R0
2. CMP R0, #0   
3. JNZ step1
4. store #1, Lock 

Section 2

1. Load Lock, R0
2. Store #1, Lock
3. CMP R0, #0
4. JNZ step 1 

TSL指令

然而,上述片段中提供的解决方案在一定程度上提供了互斥性,但不能确保互斥性总是存在。有可能有多个进程在临界区中。

如果进程在执行第二节中编写的汇编代码的第一条指令后被抢占,会怎么样?在这种情况下,它将携带锁变量的旧值,并且无论知道锁变量的当前值如何,它都将进入临界区。这可能导致两个进程同时存在于临界区中。

为了解决这个问题,我们必须确保在加载锁变量的先前值并将其设置为1之后不久之后,不会发生抢占。如果我们能够合并前两条指令,就可以解决这个问题。

为了解决这个问题,操作系统提供了一条特殊的指令,称为 测试设置锁定(TSL) 指令,它只需将锁变量的值加载到本地寄存器R0中,并同时将其设置为1

首先执行TSL的进程将进入临界区,而在此之后,没有其他进程可以进入,直到第一个进程退出。即使第一个进程被抢占,也没有进程能够执行临界区。

解决方案的汇编代码如下所示。

  1. TSL Lock, R0
  2. CMP R0, #0
  3. JNZ step 1

让我们根据四个条件来检查TSL。

  • 互斥性

TSL机制保证了互斥性,因为一个进程在设置锁变量之前永远不会被抢占。在特定时间只有一个进程可以看到锁变量的值为0,因此互斥性得到了保证。

  • 进展

根据进展的定义,在TSL机制中,一个不想进入临界区的进程不应该阻止其他进程进入。一个进程只有在想进入临界区时才会执行TSL指令。如果没有进程想进入临界区,锁的值始终为0,因此TSL总是保证进展。

  • 有界等待

TSL不能保证有界等待。有些进程可能很长时间都没有机会。我们无法预测一个进程是否肯定在一定时间后有机会进入临界区。

  • 架构中立性

TSL不提供架构中立性。它取决于硬件平台。TSL指令由操作系统提供。有些平台可能没有提供该指令。因此,它不是架构中立的。

操作系统 TSL自旋锁机制

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程