0

最近我才知道睡眠在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

回答

4

是否互斥和信號量忙等待

否,內部的那些功能(如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表示等待,他會寫一些評論。但是,「繁忙」一詞在你的書中令人困惑。 –