术语问题:互斥锁、自旋锁、可睡眠锁

Terminology question: mutex lock, spin lock, sleepable lock

在 Whosebug 和网络上,我看到人们区分互斥锁和自旋锁,因为互斥锁是提供 acquire()release() 功能的互斥锁,如果锁被占用,那么 acquire() 将允许进程被抢占。

尽管如此,A. Silberschatz 在他的操作系统概念中的第 6.5 节中说:

... The simplest of these tools is the mutex lock. (In fact, the term mutex is short for mutual exclusion.) We use the mutex lock to protect critical sections and thus prevent race conditions. That is, a process must acquire the lock before entering a critical section; it releases the lock when it exits the critical section. The acquire() function acquires the lock, and the release() function releases the lock.

然后他描述了一个自旋锁,虽然稍后添加了一点

The type of mutex lock we have been describing is also called a spinlock because the process “spins” while waiting for the lock to become available.

因此自旋锁只是一种互斥锁,而不是允许进程被抢占的可睡眠锁。也就是说,自旋锁和可睡眠锁都是互斥锁:通过 acquire()release() 函数锁定。

我认为按照 Silberschatz 的方式定义互斥锁是完全合乎逻辑的(尽管有点含蓄)。

您同意哪种方法?

The type of mutex lock we have been describing is also called a spinlock because the process “spins” while waiting for the lock to become available.

也许您误读了这本书(即,“我们一直在描述的互斥锁类型” 可能与您认为的确切段落不符),或者这本书已经过时了。什么是互斥锁,现代术语已经很清楚了,但是自旋锁有点模糊。

  • 互斥锁是一种并发原语,允许一个代理一次访问其资源,而其他代理必须同时等待,直到独占访问被释放。他们如何等待没有指定且无关紧要,他们的进程可能会进入睡眠状态,写入磁盘,循环自旋,或者您可能正在使用协作并发(也称为“异步编程”)并将控制权传递给事件循环你的 'waiting operation'.

  • 自旋锁没有明确的定义。它可能被用来指代:

    1. 互斥量的同义词(我认为错误,但确实如此)。
    2. 始终在繁忙循环中等待的特定互斥实现。
    3. 任何类型的等待资源的忙等待循环。例如,信号量也可以使用 'spinlock'.
    4. 来实现

    如果更笼统的术语不合适,我认为任何使用该词来指代在繁忙循环中等待的并发原语的(部分)特定实现都是正确的。也就是说,使用 mutex(或任何你想要的原语)除非你特别想谈论一个忙等待并发原语。

自旋锁是一种lock/mutex,其实现主要依赖于自旋循环。

更高级的 locks/mutexes 在其实现中可能有旋转部件,但这些部件通常持续不超过几微秒左右。

一位作者在一本书或手册中使用的词在本书和每本手册中并不总是具有相同的确切含义。单词的含义随着时间的推移而演变,当单词是新想法的名称时,它会很快发生。

并不是每一本书都是同时写成的。并非每个作者都年龄相同或有相同的老师。这只是你必须习惯的事情。

“Mutex”是不久前的一个新想法的名称。 在一本书中,它可能无非就是防止两个或多个线程同时进入同一临界区。在另一本书中,它可能指的是特定操作系统或库中用于相同目的的特定类型的对象。