2013-02-06 30 views
1

讓我們來考慮一個場景: -在線程/進程必須禁止中斷在執行關鍵部分

內核線程獲取鎖和處於臨界區的中間出現中斷時。 中斷處理程序運行併到達同一關鍵部分,並嘗試獲取鎖定並進入睡眠狀態。

發生這種情況還是在臨界區禁用中斷? 採取了哪些步驟來避免它?

// Some Code 
Acquire_lock() 

Critical section //Interrupt occurs and arrives to acquire the same lock. 

Disable_lock() 
+1

你有沒有特別的平臺,或者這只是一個通用的問題? – Pete

+0

一個通用的問題。比方說x86機器上的Linux內核? –

回答

2

絕不允許持有鎖的代碼被嘗試獲取同一鎖的代碼中斷。如果你的意思是在操作系統內部,它可能需要禁用代碼中的所有中斷,這些中斷與也被中斷處理程序操縱的對象交互。

用戶空間線程和進程沒有這樣的問題。沒有中斷處理程序獲取用戶空間線程可以獲取的鎖定。如果一個保存用戶空間鎖的線程中斷,它會在它重新安排後立即釋放 - 用戶空間線程仍然可以運行。

+0

對不起,我沒有提到我在談論內核線程。因此,基本上內核線程_MUST和SHOULD_在進入臨界區之前禁用中斷。 它如何決定哪個中斷線應被禁用?或者一般禁用所有中斷? –

+0

如果他們想要保留一箇中斷處理程序可能嘗試獲取的鎖,那麼他們至少需要禁用該內核中的中斷服務。 –

+0

@DavidSchwartz如果處理器在關鍵部分執行期間獲得的中斷不能被錯過怎麼辦?這種情況如何處理? –