標籤:

linux CFS調度演算法的疑問?

Hi,大家好,最近在看linxu CFS調度,但是有一個疑問一直解決不了,麻煩不吝解答。

CFS主要思想是把period按照權重分給不同的進程,每個進程有一個Ideal_time。在外部時鐘中斷到來後,如果當前進程的執行時間已經超過ideal_time就會置標置位,執行調度。

我的問題如下:

當前如果有兩個進程A、B,他們的優先順序一致,那麼權重是1:1。假設period為2ms,每個進程的ideal_time為1ms。假設外部中斷每4ms來一次,這樣是不是會出現一種情況:假設進程A先執行,那麼進程A就要執行4ms才會被調度出去,這樣他的4ms就超過了ideal_time(1ms)。

1.這是不是就違背了CFS的原理呢?

2.難道是period與外部中斷的機制可以保證進程的執行不超ideal_time?比如中斷時間要比進程最小運行時間要小。


當前如果有兩個進程A、B,他們的優先順序一致,那麼權重是1:1。假設period為2ms,每個進程的ideal_time為1ms。假設外部中斷每4ms來一次,這樣是不是會出現一種情況:假設進程A先執行,那麼進程A就要執行4ms才會被調度出去,這樣他的4ms就超過了ideal_time(1ms)。

是的。我們假設系統上只有 A、B 兩個進程。那麼雖然 A 執行了 4 ms,但是當 A 被調度出去以後,update_curr 會知道 A 實際運行了 4 ms 而不是 1 ms,並根據這個實際運行的時間來計入 A 的 vruntime。之後 B 會得到運行(例如也是 4 ms),並且也在 B 被調度出去後,根據其實際運行的時間來更新它的 vruntime。

之後每一次調度時,也都會在 A 和 B 之間選擇先前得到時間較少的那一個(vruntime 小的那一個)來執行。所以長期來看,A 和 B 得到執行的總時間比例是無限趨近於 1 的,也就保證了公平性。「每次調度時選擇先前得到時間較少的那一個來執行」才是 CFS 的核心原理,而不是預先計算時間片長度。

所以即使進程單次運行的時間較長,也並不會「違反 CFS 的原理」。

難道是period與外部中斷的機制可以保證進程的執行不超ideal_time?比如中斷時間要比進程最小運行時間要小。

實踐上,你可以看到 sysctl_sched_min_granularity 被設置為 0.75 ms。而基本上所有處理器都能提供比這個細得多的中斷,所以實踐上也基本不會出現進程執行時間超過預先計算的時間片長度的這個問題。


推薦閱讀:

如何理解Linux一切皆是文件?這當中又有哪些值得後人借鑒的思想?
為什麼微內核系統在PC不如宏內核普及?
platform driver 是作為一個怎樣的概念出現的?
如何製造一個內核態的軟鎖死?
如何正確開發 linux bsp?

TAG:Linux內核 |