Linux核心 CFS 完全公平排程演算法

2021-10-24 06:20:42 字數 2106 閱讀 3759

1. cfs的原理

cfs給每乙個程序安排乙個虛擬執行時鐘vruntime,當乙個程序得以執行,隨著時間的推移,vruntime的值不斷的增大。而沒有執行的程序的vruntime的是不會改變的。而排程器總是選擇程序佇列中vrutime最小的程序執行,這就體現了「完全公平性」。那如何區分不同程序之間的優先順序呢?就是說優先順序高的程序vruntime增長的速度會比較慢,因此會得到更多的執行機會。

2. cfs的設計思路

cfs的思路比較簡單,就是根據每個程序的權重分配執行時間,則程序的執行時間的計算公式如下:

分配給程序的時間 = 排程週期*程序權重/(所有程序權重之和)        (1)

排程週期就相當於將所有處於task_runing的程序排程一次執行時間,也相當於在o(1)排程演算法中執行佇列和過期佇列切換一次的時間。假如有兩個執行緒a和b,它們的群眾分別是1和2,排程週期是30ms。那麼程序a的執行時間是 30*(1)/(1+2) = 10ms, 程序b的執行時間是30*(2)/(1+2) = 20ms。

請注意上述的例子中,執行時間是不一樣的,那如何體現公平性?公平性是體現在vruntime中的,vruntime中記錄的是程序的執行時間,但並不是直接去記錄執行時間,而是根據的程序的權重進行相應的調整。我們給出實際執行時間到vruntime的計算公式:

vruntime = 程序的執行時間 * 1024 / 程序的權重                     (2)

公式2中1024是nice為0的程序權重,**中是nice_0_load。也就是說所有的程序都是以nice為0的程序權重1024來計算自己的vruntime的增長速度。現在我們將公式(2)中的程序的執行時間用公式(1)代替:

vruntime = 排程週期*程序權重/(所有程序權重之和) * 1024 / 程序的權重  = 排程週期*1024/(所有程序權重之和) (3)

可以看出所以的程序的權重雖然不同,但是他們的vrutime的增長速度是相同的,與權重無關。那麼我們就可以根據vruntime來選擇要執行的程序,誰的vruntime比較小,那說明他的cpu執行時間就比較小,下乙個需要執行的程序就是它。這樣既可以公平的選擇程序,又可以保證更高優先順序的程序可以獲得更多的執行時間。就是cfs的主要思想。

cfs的思想就是讓每個排程實體(沒有組排程的情形下就是程序,以後就說程序了)的vruntime互相追趕,而每個排程實體的vruntime增加速度不同,權重越大的增加的越慢,這樣就能獲得更多的cpu執行時間。 再補充一下權重的**,權重跟程序nice值之間有一一對應的關係,可以通過全域性陣列prio_to_weight來轉換,nice值越大,權重越低。

3. cfs的資料結構

首先是排程實體sched_entity,sched_entity是乙個排程單位,在組排程關閉的時候,它等同於乙個程序。每乙個task_struct中都包含乙個sched_entity,權重以及vruntime都儲存在裡面。使用紅黑樹將所有的sched_entity組織在一起,sched_entity以vruntime為key值插入到紅黑樹中(實際上是以vruntime-min_vruntime為key,是為了防止溢位),同時快取最左側結點同時也是vruntime的最小值結點,這樣就可以選中vruntime最小的程序。其中只有等待cpu就緒狀態的程序在這顆樹上,睡眠程序以及正在執行的程序都不在這顆樹上。

4. vruntime溢位問題

作為紅黑樹的key不是vruntime而是vruntime-min_vruntime。min_vruntime是紅黑樹中最小的key。這是因為vruntime的值是unsigned long型別的,vruntime的值隨著程序的執行不斷變大,而他會有乙個上限,當達到unsinged long表示的最大值的時候就會溢位了。如果vruntime溢位了就會回滾到0,這樣會導致一些問題。可是程序的vruntime怎麼用unsigned long型別而不處理溢位問題呢?因為這個vruntime的作用就是推進虛擬時鐘,並沒有別的用處,它可以不在乎,然而在計算紅黑樹的key的時候就不能不在乎了,於是減去乙個最小的vruntime將所有程序的key圍繞在最小vruntime的周圍,這樣更加容易追蹤。執行佇列的min_vruntime的作用就是處理溢位問題的。

6. cfs小結

cfs還有乙個重要的特點,即排程粒度小。cfs之前的排程器中,除了程序呼叫某些函式主動參與排程之外,每個程序都在用完時間片或被搶占。cfs會在每個tick的時候都會檢查,

完全公平排程 cfs

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

完全公平排程

cfs定義了一種新的模型,它給執行佇列中的每個程序都設定了乙個虛擬時鐘,即vruntime。如果乙個程序被排程器投入執行,隨著時間的增長,其vruntime將不斷增大,而沒有得到執行的程序vruntime則不會發生變化。排程器總是選擇vruntime最小的那個程序來執行,這就是所謂的 完全公平 為了...

Linux 完全公平排程器

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