我花了一些时间试图了解互斥体是如何用多种语言实现的。有多个描述主题的链接(*)但是如果我理解正确的话,所有硬件提供的都是一些原子操作,可能有助于区分现在应该轮流的人。
在软件中,这总是用于繁忙的等待(尝试CAS或测试和设置,如果不成功则在循环中等待),但调度程序如何知道现在我应该从CPU中取走进程/线程,因为它只是在等待?在操作系统中是否有一些支持,例如Java同步使用以便发出信号"我被阻止,请让其他线程运行而不是#34;?我认为是,因为忙等待是使用lock()的替代方法; (所以他们不应该是一样的)
*来源:
答案 0 :(得分:2)
在Linux中,JDK源代码C代码使用pthread
库,它是标准C库的一部分。反过来,它使用Linux内核futex
功能(man futex
)。据我所知,这是通过使用内核调度程序将调用线程置于休眠状态并在收到信号时将其唤醒来实现的。
调度程序本身依赖于定时器中断(硬件)来工作 - 实际上,每次定时器中断到达时,调度程序必须检查当前用户空间线程是否需要/必须被挂起,如果是,则必须选择其他线程。
这里有一些更进一步的链接,用于更清晰和详细的解释:
Linux Kernel Development
预订(但奇怪的是, 只包含futex
)和另一本书(其中包含futex提到但主要是参考外部论文):Kerrisk' The Linux Programming Interface
。答案 1 :(得分:2)
这是一本书级主题。这是这本书:
多处理器编程的艺术 Maurice Herlihy,Nir Shavit ISBN-13:978-0123973375
https://www.amazon.com/Art-Multiprocessor-Programming-Revised-Reprint/dp/0123973376/
实际上,这是另一个原因,因为操作系统提供的用户级互斥锁不仅仅是使用硬件原语。用户级互斥锁与操作系统的调度算法密切相关。
了解Linux内核 Daniel P. Bovet,Marco Cesati ISBN-13:978-0596005658
http://www.amazon.com/Understanding-Linux-Kernel-Third-Daniel/dp/0596005652/