首页 > 解决方案 > 什么是原子交换(寄存器和内存位置之间)指令?

问题描述

我正在研究操作系统,突然对原子交换(寄存器和内存位置之间)指令是什么感到好奇。以及如何使用它来实现锁?

标签: operating-system

解决方案


我不确定您所说的原子交换是什么意思,但也许您的意思是比较和交换指令。

  1. 比较和交换指令检查给定值的内存位置,如果该内存位置中的值等于给定值,则它将内存位置设置为新值。这是“原子地”完成的,这意味着当这条指令执行时,系统中没有其他东西可以执行(让我们保持这种方式),或者这条指令的执行不能被抢占。这个代码看起来像这样 -
function cas(p : pointer to int, old : int, new : int) returns bool {
    if *p ≠ old {
        return false
    }
    *p ← new
    return true
}

为什么从锁定的角度来看这很重要?假设你有一个互斥“锁”并且两个线程想要访问锁,每个线程都需要检查互斥值是否为 1,如果为 1,则线程必须将其设置为 0。如果线程 1 和线程 2 都尝试同时执行此操作,然后对于指令不是原子的情况,线程 1 可能会将值视为 1。线程 1 会尝试将值设置为 0,但在到达该语句之前,它会被抢占,线程 2 然后将值设置为 0,然后线程 1 再次设置它。然后,两个线程都可以获取锁,认为它们是唯一获得锁的线程,这确实是不正确的行为。

但是,如果比较和交换是原子的,则意味着如果一个线程在上面描述的 cas 函数内,则在完成该函数的完整执行或保证执行在 1 个周期内完成之前,没有其他线程将执行。因此线程 1 会将内存位置的值更新为 0,然后线程 2 将返回 false。


推荐阅读