最近我发现linux内核中的 Sleep 系统调用会将当前调用线程挂起到暂停/阻塞状态,这意味着他们不会使用CPU直到提到的时间过去了。 - 完全理解。
现在来到互斥和信号量,
Mutex Locks:
acquire() {
while (!available)
; // busy wait --> my doubt
available = false;;
}
release() {
available = true;
}
信号量锁:
wait(S) {
while (S <= 0)
; // busy wait --> my doubt
S--;
}
signal(S) {
S++;
}
P.S:这些代码片段取自&#34;操作系统概念-9th edition&#34; by ABRAHAM SILBERSCHATZ
我的问题:
我知道忙碌等待不是解决同步问题的有效方法,但是从上面提到的代码片段我怀疑使用互斥和信号量最终会在忙碌等待? (虽然互斥锁和信号量被广泛用于解决大多数系统问题)。
这让我觉得使用互斥&amp;信号量不是解决同步问题的有效方法,因为它会消耗CPU周期 (因为它不会导致暂停状态而是在while循环中旋转)。
要简短: 互斥锁和信号量是否会等待而不是将等待的线程线程置于挂起状态?
提前致谢!!如果我理解错误,请纠正我!!
答案 0 :(得分:5)
互斥锁和信号量是否忙于等待
不,内部这些函数(例如像pthread_mutex_lock
这样的Pthread互斥函数)使用atomic机器指令(用汇编语言编写)和futex(7)。
对于POSIX信号量(参见sem_overview(7)),内核scheduler将安排其他任务。所以它不忙等待。
如果没有任务可以运行,内核会在其idle loop等待(没有燃烧CPU周期)的情况下(例如interrupt)。因此,在这种情况下,您的笔记本电脑不会过热并使用太多电池!
另请阅读Operating Systems: Three Easy Pieces(可免费下载)。如果你想开发一些玩具内核,也可以查看OSDEV。您还可以研究Linux kernel的源代码,因为它是free software,然后在kernelnewbies上询问。标准C库及其pthread层也是免费软件(因此请研究GNU glibc或musl-libc源代码)。