完全公平排程

2021-10-13 22:38:54 字數 1218 閱讀 3827

cfs定義了一種新的模型,它給執行佇列中的每個程序都設定了乙個虛擬時鐘,即vruntime。如果乙個程序被排程器投入執行,隨著時間的增長,其vruntime將不斷增大,而沒有得到執行的程序vruntime則不會發生變化。排程器總是選擇vruntime最小的那個程序來執行,這就是所謂的「完全公平」。為了區分不同優先順序的程序,優先順序高的程序vruntime增長相對較慢,因此可以得到更多的執行機會。

cfs思路很簡單,就是根據各個程序的權重分配執行時間。

程序的執行時間計算公式為:分配給程序的執行時間 = 排程週期 * 程序權重 / 所有程序權重之和   (公式1)

排程週期很好理解,就是將所有處於task_running態的程序都排程一遍的時間。舉個例子,假如系統中只有兩個程序a, b處於task_running態,權重分別為1和2,排程週期為30ms,則分配給a的cpu時間為 30ms * (1/(1+2)) = 10ms;而分配給b的cpu時間為 30ms * (2/(1+2)) = 20ms。也就是說,在這30ms中a將執行10ms,b將執行20ms。

公平怎麼體現呢?它們的執行時間並不一樣阿?其實公平是體現在另外乙個量上面,叫做virtual runtime(vruntime),它記錄著程序已經執行的時間,但是並不是直接記錄,而是要根據程序的權重將執行時間放大或者縮小乙個比例。我們來看下從實際執行時間到vruntime的換算公式:vruntime = 實際執行時間 * 1024 / 程序權重 (公式2)

為了不把大家搞暈,這裡我直接寫的1024,實際上它就是nice優先順序為0的程序的權重,對應原始碼中為nice_0_load。也就是說,所有程序都以nice優先順序為0的程序的權重作為基準,計算自己的vruntime增長速度。還以上面a、b兩個程序為例,b的權重是a的2倍,那麼b的vruntime增長速度只有a的一半。現在我們把 (公式2) 中的實際執行時間用 (公式1) 替換,就可以得到這麼乙個結果:

vruntime = (排程週期 * 程序權重 / 所有程序總權重) * 1024 / 程序權重 = 排程週期 * 1024 / 所有程序總權重

看出什麼眉目沒有?沒錯,雖然程序的權重不同,但是它們的 vruntime增長速度應該是一樣的 ,與權重無關。好,既然所有程序的vruntime增長速度巨集觀上看應該是同時推進的,那麼就可以用這個vruntime來選擇執行的程序了。排程器認為,誰的vruntime值較小,就說明它以前占用cpu的時間較短,受到了「不公平」對待,因此下乙個被執行的程序就是它。這樣既能公平地選擇程序,又能保證高優先順序的程序獲得更多的執行時間。這就是cfs的主要思想了。

完全公平排程 cfs

現代os都會把時間用 當量quanta 來表示。這樣的單位有助於對不同任務的管理和排程。os version tick freqency linux2.4 100hz linux2.6 above 100,250,300 or1000hz 更高的os具有可選的tick頻率,這種配置一般在開始階段配置...

Linux 完全公平排程器

讀書筆記,linux 系統程式設計 第六章高階程序管理 linux排程器為完全公平排程器,簡稱為cfs。和最近華為鴻蒙提出的確定時延排程相反。完全公平排程器和傳統的unix排程器有很大的區別。在大多數unix系統中,包括引入cfs之前的linux系統,在程序排程中存在兩個基本的基於程序的因素 優先順...

linux程序排程 完全公平排程類

完全公平排程類是排程類的乙個例項 static const struct sched class fair sched class 在主排程器和週期排程器中會根據程序型別呼叫完全公平排程類或者實時排程類的函式。next,指向空閒排程類,而實時排程類的next則指向完全公平排程類。這個順序在編譯之前已...