2015-01-07 116 views
3

我明白新的linux內核允許內核空間線程被搶佔。 有人可以簡要解釋在內核模式下如何執行pre-empting工作嗎? 因此,當進行系統調用時,軟件中斷將把線程切換到內核模式,並且它將運行必要的操作。 現在,讓我們說它的時間片已經到了 - 另一個用戶線程運行,它也想在內核空間中執行。 (或者它可能是一個h/w中斷)。 當內核被中斷時,內核如何維護它正在修改的任何結構的完整性?內核模式搶佔

+0

@shekhar Thats dosent真的回答我的問題。我不是在談論進程狀態 - 我談論的是在內核模式下被搶佔 - 可以說你正在更新內核中的一些數據結構 – excalibur

+0

是什麼讓你「_understand new linux kernel allow kernel space threads pre -empted_「?你能否提供這個假設的來源? https://github.com/torvalds/linux/commits/master提交了哪個提交? – xmojmr

+0

@xmojmr - 「new」可能並不合適,但無論如何,這裏有一篇文章描述2.6中的新特性。「http://www.linuxjournal.com/article/7477」從內核2.6開始,內核就是可搶佔的。可以被搶佔,這樣一些重要的用戶應用程序可以繼續運行...因此,在Linux下2。6,內核現在可以中斷任務,所以其他應用程序可以繼續運行「 – excalibur

回答

5

Linux內核以與在多線程環境中運行的任何內容相同的方式保護其數據結構。

它可能會使用一些sort of lock來保護必須以原子方式訪問的數據結構。通常,這些包括自旋鎖,互斥和信號量。

還有一些函數disable preemption,但通常不會顯式使用,因爲鎖定代碼將隱式地處理這個問題。

+0

感謝代碼指針,尤其是」_preemption point_「,'/ include/linux/preempt.h','preempt_schedule' – xmojmr

+0

它使用幾種代碼鎖(spinlocks,信號量,等待隊列等),具體取決於被保護資源的類型。 –

+0

因此,死鎖在內核中是真實的可能性嗎?如果它被中斷,例如 – excalibur

3

有人可以簡要解釋如何在內核模式下執行pre-empting工作嗎?

它的工作原理與其他任何上下文切換一樣。當在可搶佔代碼中發生中斷時,CPU跳轉到相應的中斷處理程序,並在堆棧上留下一些信息(通常是中斷任務的RIP/CS/EFLAGS/RSP/SS寄存器),以便能夠返回到pre - 稍後調高任務。

因此,當進行系統調用時,軟件中斷會將線程切換到內核模式,並且它將運行必要的操作。現在,讓我們說它的時間片已經到了 - 另一個用戶線程運行,它也想在內核空間中執行。 (或者它可能是一個h/w中斷)。當內核被中斷時,內核如何維護它正在修改的任何結構的完整性?

我們調用第一個(被搶佔的)任務T1和新的任務T2。如果T1正在訪問某些數據結構,那麼T1必須先獲取鎖。所有可能被多個線程併發訪問的內核數據結構都被鎖(幾乎)保護。如果T2試圖訪問相同的數據結構,那麼它將無法獲得該鎖,因爲T1仍然存在,結果T2將阻塞,並使CPU返回到另一個任務。過了一段時間T1將再次開始執行,釋放鎖,睡眠再次切換回T2,T2獲取鎖,就執行,釋放鎖等

如果多個線程試圖訪問同一數據保護同時,只有第一個線程通常會獲得訪問權限,所有其他線程將不得不等待。