LINUX系统中互斥和信号量是否“忙等待”?
最近我才知道睡眠在linux内核中的系统调用会暂停当前调用线程到挂起/阻塞状态,这意味着他们不会使用CPU,直到提到的时间过去。 - 完全理解。LINUX系统中互斥和信号量是否“忙等待”?
现在来互斥和信号灯,
互斥锁:
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++;
}
PS:这些代码段是从“操作系统概念采取-9th版本“ by ABRAHAM SILBERSCHATZ
我的问题:
我知道忙等待是不是接近同步问题的有效途径,但是从上面我所提到的代码段有一个疑问,使用互斥和信号灯将在忙等待结束?? (虽然互斥和信号广泛用于解决大多数系统问题)。
这inturn让我觉得利用互斥&信号灯是不是解决同步问题的有效方式,因为它会消耗CPU周期(因为它不会导致while循环,而纺暂停状态)。
要短:是否互斥体和信号量忙等待,而把等待线程的线程挂起状态?
在此先感谢!!请在我的理解中错误地纠正我!
是否互斥和信号量忙等待
否,内部的那些功能(如pthread_mutex_lock
例如Pthread的互斥功能)的使用加上futex(7)atomic机器指令(在汇编编码的)。
对于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源代码)。
感谢您的回答。我想我在书中的代码片段中误导了一行“//等待”。 –
当有人用C代码片段写一本书时,他不能用简单的C表示等待,他会写一些评论。但是,“繁忙”一词在你的书中令人困惑。 –
简而言之,答案是肯定答案,不是,但比本书描述的要复杂得多。在[semaphores](https://0xax.gitbooks.io/linux-insides/content/SyncPrim/sync-3.html)和[mutexes](https://0xax.gitbooks.io/linux-insides) /content/SyncPrim/sync-4.html)。更长的形式是,如果获得了互斥体或信号量,那么它将停止调用线程,直到原语被释放。这样更好,只是旋转 - 而且你是完全正确的,如果只是旋转它将是非常低效的。幸运的是,事实并非如此。 :-) – jszakmeister
@jszakmeister不仅效率低下,而且会被打破! – curiousguy
@curiousguy非常真实! – jszakmeister