【问题标题】:Terminology question: mutex lock, spin lock, sleepable lock术语问题:互斥锁、自旋锁、可睡眠锁
【发布时间】:2021-03-02 02:44:11
【问题描述】:

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

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

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

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

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

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

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

你会同意哪种方法?

【问题讨论】:

  • 您指的是哪种方法?您的问题不清楚。
  • 定义互斥锁的方法。许多资源将互斥锁和自旋锁称为不同的东西。它与我提到的书的方法不同。

标签: multithreading concurrency operating-system mutex spinlock


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 您好,感谢您的精彩回答!定义澄清了它。我也同意应该是2. A specific mutex implementation that always waits in a busy loop.
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    更高级的锁/互斥锁可能在其实现中包含旋转部分,但这些部分通常持续不超过几微秒左右。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2010-12-17
      • 1970-01-01
      相关资源
      最近更新 更多