首页 > 解决方案 > 术语问题:互斥锁、自旋锁、可睡眠锁

问题描述

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

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

...这些工具中最简单的是互斥锁。(实际上,互斥锁是互斥的缩写。)我们使用互斥锁来保护临界区,从而防止竞争条件。也就是说,一个进程必须在进入临界区之前获得锁;它在退出临界区时释放锁。acquire() 函数获取锁,release() 函数释放锁。

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

我们一直在描述的互斥锁类型也称为自旋锁,因为进程在等待锁可用时“自旋”。

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

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

你会同意什么方法?

标签: multithreadingconcurrencyoperating-systemmutexspinlock

解决方案


我们一直在描述的互斥锁类型也称为自旋锁,因为进程在等待锁可用时“自旋”。

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

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

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

    1. 互斥锁的同义词(我认为这是错误的,但确实发生了)。
    2. 始终在繁忙循环中等待的特定互斥锁实现。
    3. 等待资源的任何类型的忙等待循环。例如,信号量也可能使用“自旋锁”来实现。

    如果更一般的术语不合适,我会考虑使用该词来指代在繁忙循环中等待的并发原语的(a 的一部分)特定实现是正确的。也就是说,除非您特别想谈论忙等待并发原语,否则请使用互斥锁(或您想要的任何原语)。


推荐阅读