如果你覺沒有從cfs中看到什麼,那麼最簡單我告訴你,就是提高了響應速度,為何呢?在shell下執行vmstat,觀察cs欄位,也就是1秒內程序切換的次數,然後盡量滿載系統,觀察cs和誰有關,它的值和程序的數量,程序的優先順序有關,當程序的優先順序很大的時候,cs的值就會減少,反之cs值會增加,我們看看這是為什麼,o(1)排程器中,時間片的分配是絕對的分配,也就是說排除程序飢餓和核心搶占,每個程序執行的時間片是絕對的,是按照它的nice值計算出來的,如果說有變動,那也只是由於優先順序動態調整導致的變化,那時的時間片只和程序的優先順序有關,優先順序變化幅度不大,時間片調整的也不多,因此我們不考慮優先順序調整,一旦系統負載增加,排程完整個系統的所有程序的時間就會很長,活動程序數量越多,這一段時間就會越長,o(1)排程器中的時間片是固定的,那麼cfs中的呢?
cfs中的時間片是動態分配的,是按照比例分配的而不是按照優先順序固定分配的,其精髓就是系統擁有乙個可配置的系統排程週期,在該週期內執行完所有的程序,如果系統負載高了,那麼每乙個程序在該週期內被分配的時間片都會減少,將這些程序減少的部分累積正好就是新程序的時間片,其實完全可以實現乙個更簡單的cfs版本,按照固定的順序執行程序,就是將紅黑樹退化成乙個先入先出的佇列,每個程序都排入程序,然後執行完按比例分配給它的動態時間片之後排入佇列最後,然後繼續下乙個程序,如此反覆,但是這樣實現的話很不靈活,很難實現核心的實時搶占和新程序的搶占以及程序喚醒後的補償,於是紅黑樹完美的解決了這乙個問題,於是就出現了虛擬時鐘的概念,每乙個程序都有乙個虛擬時鐘,按照不同的速率在每乙個物理時鐘節拍內向前推進,越高權值的程序的推進速率越慢,這樣它就可以執行更多的物理時間。cfs排程器選擇當前最慢的虛擬時鐘進行推進,做到了公平。
cfs排程器中分配的動態時間片和hz沒有關係,它只和程序的權值以及當前紅黑樹程序的總權值還有排程週期有關,它本質上是乙個相對的概念而不像以前是乙個絕對的概念,相對的概念就是比絕對的概念要靈活,比如用相對目錄的程式就比用絕對目錄的程式擁有更好的移植性。cfs排程器將時間片的概念進行了相對了,抽象出了虛擬時鐘的概念,如此一來1秒鐘內的程序切換次數就不再和程序優先值有關了,而是和排程週期和程序數量有關,理論上就是(程序數量)*(1秒/排程週期)次,當然加上搶占和新程序建立就不是這麼理想了,經過試驗,和理論資料差別不大,在同一負載下,提高或者降低多個程序的優先順序在o(1)排程器下會引起vmstat中cs的變化,但是在cfs中vmstat中的cs值卻不會受到影響。
CFS排程器的思想的新理解
本文通過詳細分析老的排程器來說明cfs的優勢。總是新理解新理解的,我怎麼這麼沒完沒了啊,其實每隔一段時間我都會在工作之餘再讀一讀linux核心源 的關鍵部分,每次讀都有新的理解,然後就第一時間將心得記錄下來,今天又讀了cfs排程器,越來越發現其美妙了。這次配合了sched nice design.t...
CFS排程器的思想的新理解
本文通過詳細分析老的排程器來說明cfs的優勢。總是新理解新理解的,我怎麼這麼沒完沒了啊,其實每隔一段時間我都會在工作之餘再讀一讀linux核心源 的關鍵部分,每次讀都有新的理解,然後就第一時間將心得記錄下來,今天又讀了cfs排程器,越來越發現其美妙了。這次配合了sched nice design.t...
CFS排程器中子程序被喚醒後的細節 實驗和理論
在我提交並自己打上child runs first補丁之前,我做了乙個實驗,目的是驗證一下我先前理論分析的結果,我覺得子程序無論如何搶占父程序的機率都會比不搶占要大些,當然前提是要有的,具體見下面的試驗。空有理論是沒有用的,理論上cfs排程器執行嚴格的歸一化,然而實際上卻不是那樣的,實踐結果永遠比理...