2016-10-06 68 views
1

今天我們在課堂上研究了Linux中的等待隊列,並且在討論獨佔/非排他性等待時出現了一些有趣的事情。Linux等待隊列 - 獨佔與非獨佔的組合

有代表問: 如果一個等待隊列中有一些過程中獨佔狀態和其他守候在非排他性的狀態會發生什麼。

講師回覆說wake_up()會遍歷隊列,喚醒所有非排他性的進程,直到它遇到一個獨佔進程,然後它只會喚醒最後一個進程並停止。

例如: 設N,E,表示非排他性和排他處理在等待隊列中,分別爲:

N - N - N - E - N - E - N - N 

講師聲稱,第一4個等待將被喚醒( NNNE),並且內核將在第一個E之後停止遍歷。這聽起來很奇怪,因爲E是唯一的,這意味着它不想被其他人喚醒,並且在這種情況下它被喚醒和其他人。

谷歌搜索的問題產生如下:

當一個等待隊列被「喚醒」在等待隊列所有任務調度程序啓用 。如果使用 專屬功能將任務添加到等待隊列中,則喚醒呼叫將僅喚醒一個專用任務,使其他人仍在等待。 如果 排他性任務和非排他性任務的混合被添加到隊列中,則 喚醒功能將喚醒任何非排他性任務,直到 喚醒排他性任務。喚醒順序通常是任務添加到隊列的順序的反向 。 https://blackfin.uclinux.org/doku.php?id=linux-kernel:wait_queues

哪一個是正確的?真正的答案是完全不同的嗎?

注:在課堂上,我們正在談論Linux2.4.18-14,I386(請評論,如果需要在系統上的更多信息)

回答

4
N - N - N - E - N - E - N - N 

首先要注意的事情是,項將WQ_FLAG_EXCLUSIVE添加到隊列的末尾而不是開始。所以,引用的例子從來沒有發生。等待隊列總是排序:全部是N,然後是所有的Es。

因爲E是排他性的,這意味着它不希望被喚醒與其他任何人,在這種情況下被喚醒與他人

第二件事要注意的是獨家服務員不想被其他專屬服務員驚醒據推測,非獨佔侍者執行的是完全不重疊的工作,而獨佔侍者正在做相關工作 - 可能他們都需要相同的共享資源,所以將它們全部喚醒將導致「雷鳴羣體」,因爲他們都試圖爲相同的鎖。

因此,您通過Google找到的內容是正確的。大部分被告知的是也是是正確的,也就是說Linux在醒來後發現它的第一個專用服務器後停止。然而,等待隊列未被排他性排序的建議不正確。