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循环,而纺暂停状态)

要短:是否互斥体和信号量忙等待,而把等待线程的线程挂起状态?

在此先感谢!!请在我的理解中错误地纠正我!

+1

简而言之,答案是肯定答案,不是,但比本书描述的要复杂得多。在[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

+0

@jszakmeister不仅效率低下,而且会被打破! – curiousguy

+0

@curiousguy非常真实! – jszakmeister

是否互斥和信号量忙等待

否,内部的那些功能(如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 glibcmusl-libc源代码)。

+0

感谢您的回答。我想我在书中的代码片段中误导了一行“//等待”。 –

+1

当有人用C代码片段写一本书时,他不能用简单的C表示等待,他会写一些评论。但是,“繁忙”一词在你的书中令人困惑。 –