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



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

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

。。。这些工具中最简单的是互斥锁。(事实上,术语互斥是互斥的缩写。(我们使用互斥锁来保护关键部分,从而防止竞争条件。也就是说,进程必须在进入关键部分之前获取锁;它在离开关键部分时释放锁。acquire((函数获取锁,release((函数释放锁。

然后他描述了一个旋转锁,尽管稍后添加了

我们所描述的互斥锁类型也称为旋转锁,因为进程在等待锁可用时"旋转"。

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

我认为像Silberschatz那样定义互斥锁是完全合乎逻辑的(尽管有点隐含(。

你会同意什么方法?

我们所描述的互斥锁类型也称为旋转锁,因为进程在等待锁可用时"旋转"。

也许你误读了这本书(也就是说,"我们一直在描述的互斥锁类型">可能没有提到你认为的确切段落(,或者这本书已经过时了。现代术语对互斥是什么很清楚,但自旋锁有点混乱。

  • 互斥是一种并发原语,它允许一个代理一次访问其资源,而其他代理则必须在此期间等待,直到释放独占访问。它们的等待方式没有具体说明,也不相关,它们的进程可能会进入睡眠状态,写入磁盘,在循环中旋转,或者您可能正在使用协作并发(也称为"异步编程"(并将控制权传递给事件循环作为"等待操作"。

  • 旋转锁没有明确的定义。它可以用来指代:

    1. 互斥的同义词(在我看来这是错误的,但它确实发生了(
    2. 一种特定的互斥实现,它总是在繁忙循环中等待
    3. 任何一种等待资源的繁忙等待循环。例如,信号量也可以使用"spinlock"来实现

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

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

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

"Mutex";是不久前一个新想法的名字。在一本书中,它可能只意味着阻止两个或多个线程同时进入同一关键部分。在另一本书中,它可能指的是某个操作系统或库中用于相同目的的特定类型的对象。

spinlock是一种锁/互斥体,其实现主要依赖于旋转循环。

更高级的锁/互斥体在其实现中可能有旋转部分,但这些部分通常只持续几微秒左右

最新更新