我想了解如何在Linux內核的計劃進程實際工作。我的問題不是關於調度算法。它關於功能schedule()
和switch_to()
是如何工作的。Linux內核的schedule()+ switch_to()函數是如何工作的?
我會盡力解釋。我看到:
當進程用完時間片時,標記need_resched
由scheduler_tick()
設置。內核檢查標誌,看到它已設置,並調用schedule()
(與問題1相關)切換到新進程。該標誌是應該儘快調用調度的消息,因爲另一個進程值得運行。 返回到用戶空間或從中斷返回時,將檢查need_resched
標誌。如果已設置,則內核在繼續之前調用調度程序。看看內核源代碼(linux-2.6.10-「Linux Kernel Development,第二版」所基於的版本),我還看到有些代碼可以自動調用schedule()
函數,給出另一個進程運行權。 我看到函數switch_to()
是實際進行上下文切換的函數。我研究了一些依賴於架構的代碼,試圖瞭解switch_to()
實際上在做什麼。
這種行爲提出了一些問題,我無法找到答案:
當
switch_to()
結束,什麼是當前正在運行的進程?這個過程叫做schedule()
?或者下一個過程,即被選中運行的過程?當
schedule()
被中斷調用時,當中斷處理完成時(在某種RTE之後),選擇的進程運行開始運行?或之前?如果
schedule()
函數不能從中斷中調用,何時設置了flag-need_resched
?當定時器中斷處理程序正在工作時,正在使用什麼堆棧?
我不知道我是否可以說清楚。如果我不能,我希望我能在回答(或問題)後做到這一點。 我已經看了幾個試圖瞭解這個過程的來源。我有這本書「Linux Kernel Development,sec ed」,我也在使用它。 我知道一些關於MIP和H8300架構,如果有幫助解釋。
對不起,我還是不明白。 例如: 假設我們有一個任務'A'正在運行。 1 - 發生定時器中斷。 2 - 定時器中斷處理程序啓動。 3 - 現在是時間調用schedule()並且我們來做。(),switch_to()已經完成,任務'B'是當前任務(現在我們正在使用任務'B'的堆棧,並且我們仍在運行中斷代碼) 。 5 - 定時器中斷結束,並恢復執行任務'B'。 這個例子正確嗎?如果不是,過程如何發生? – derf
謝謝你的時間和耐心,但我想我錯過了一些觀點。你提供的信息比我現在可以處理的更多(當然,我對此非常感興趣)。你能以更一般的方式解釋嗎? 我真的不明白的是:switch_to()完成後會發生什麼? 在中斷代碼返回之前,所選任務(下一個)是否開始運行?哪個堆棧是當前的? – derf
我想我明白了。爲了保持直線,我們沒有中斷,讓我們忽略所有其他細節,並且只使用switch_to()。假設我有兩個任務A和B,他們都有10個指令要做。任務A正在執行指令3,任務B正在執行指令6.任務A是當前任務。因此,任務A調用switch_to(),在指令3中保留任務A,並在指令6中恢復任務B.任務B跳到7,調用switch_to(),在7保留B,並在3恢復A.任務A去到4,再次調用switch_to(),並且進程繼續進行。那是對的嗎? – derf