mutex内部是如何实现的
How is mutex internally implemented
我花了一些时间试图了解如何在多种语言中实现互斥锁。有多个链接描述了主题 (*),但如果我理解正确,所有硬件提供的都是一些原子操作,可能有助于区分现在应该轮到谁。
在软件中,这总是用于忙等待(尝试 CAS 或测试并设置,如果不成功则在 while 循环中等待),但是调度程序如何知道现在我应该拿走 process/thread 来自 CPU 因为它所做的只是等待? OS 中是否有一些支持,例如 Java 同步用于发出 "I am blocked, please let other Threads run instead" 信号?我认为是的,因为忙等待是使用 lock() 的替代方法; (所以他们不应该相同)
*来源:
- http://en.wikipedia.org/wiki/Mutual_exclusion
- How are mutex and lock structures implemented?
在 Linux JDK 中,源 C 代码使用 pthread
库,它是标准 C 库的一部分。反过来,它使用 Linux 内核 futex
特性 (man futex
)。据我所知,这是使用内核调度程序实现的,使调用线程进入睡眠状态并在收到信号时将其唤醒。
调度器本身依赖定时器中断(硬件)来工作——本质上,每次定时器中断到达时,调度器必须检查当前用户-space线程wants/must是否被挂起,如果是, 它必须选择其他线程。
这里有几个进一步的链接,以获得更清晰和详细的解释:
- http://man7.org/linux/man-pages/man7/futex.7.html
- http://www.quora.com/How-different-is-a-futex-from-mutex-conceptually-and-also-implementation-wise
- 罗伯特·洛夫
Linux Kernel Development
的书(但是,奇怪的是,它 没有 提到 futex
)和另一本书(确实包含 futex 提及,但主要是在对外部论文的引用中):Kerrisk 的 The Linux Programming Interface
.
这是书本级别的话题。这是这本书:
多处理器编程的艺术
莫里斯·赫利希,尼尔·沙维特
ISBN-13:978-0123973375
https://www.amazon.com/Art-Multiprocessor-Programming-Revised-Reprint/dp/0123973376/
实际上,这是另一个原因,因为操作系统提供的用户级互斥体不仅仅是使用硬件原语。用户级互斥与操作系统的调度算法密切相关。
了解 Linux 内核
丹尼尔·P·播威、马尔科·切萨蒂
ISBN-13:978-0596005658
http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/
我花了一些时间试图了解如何在多种语言中实现互斥锁。有多个链接描述了主题 (*),但如果我理解正确,所有硬件提供的都是一些原子操作,可能有助于区分现在应该轮到谁。
在软件中,这总是用于忙等待(尝试 CAS 或测试并设置,如果不成功则在 while 循环中等待),但是调度程序如何知道现在我应该拿走 process/thread 来自 CPU 因为它所做的只是等待? OS 中是否有一些支持,例如 Java 同步用于发出 "I am blocked, please let other Threads run instead" 信号?我认为是的,因为忙等待是使用 lock() 的替代方法; (所以他们不应该相同)
*来源:
- http://en.wikipedia.org/wiki/Mutual_exclusion
- How are mutex and lock structures implemented?
在 Linux JDK 中,源 C 代码使用 pthread
库,它是标准 C 库的一部分。反过来,它使用 Linux 内核 futex
特性 (man futex
)。据我所知,这是使用内核调度程序实现的,使调用线程进入睡眠状态并在收到信号时将其唤醒。
调度器本身依赖定时器中断(硬件)来工作——本质上,每次定时器中断到达时,调度器必须检查当前用户-space线程wants/must是否被挂起,如果是, 它必须选择其他线程。
这里有几个进一步的链接,以获得更清晰和详细的解释:
- http://man7.org/linux/man-pages/man7/futex.7.html
- http://www.quora.com/How-different-is-a-futex-from-mutex-conceptually-and-also-implementation-wise
- 罗伯特·洛夫
Linux Kernel Development
的书(但是,奇怪的是,它 没有 提到futex
)和另一本书(确实包含 futex 提及,但主要是在对外部论文的引用中):Kerrisk 的The Linux Programming Interface
.
这是书本级别的话题。这是这本书:
多处理器编程的艺术 莫里斯·赫利希,尼尔·沙维特 ISBN-13:978-0123973375
https://www.amazon.com/Art-Multiprocessor-Programming-Revised-Reprint/dp/0123973376/
实际上,这是另一个原因,因为操作系统提供的用户级互斥体不仅仅是使用硬件原语。用户级互斥与操作系统的调度算法密切相关。
了解 Linux 内核 丹尼尔·P·播威、马尔科·切萨蒂 ISBN-13:978-0596005658
http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/