CPU 排程

完全公平排程器(Completely Fair Scheduler)

/ CFS /

想像一位完全公平的家長在好幾個孩子間分配注意力:理想上每個孩子在每一刻都應分到完全相等的份。你無法真的把自己切開,但你可以仔細記錄到目前為止誰得到的注意力最少,並總是接下來轉向那個孩子。完全公平排程器(CFS)——長期作為 Linux 核心預設的排程器——正是依這個原則運轉 CPU:接下來把 CPU 給到目前為止得到最少的那個。

它的運作方式:CFS 給每個可執行的任務一個叫虛擬執行時間(virtual runtime)的數值——大致是它用了多少 CPU 時間,但依優先權加權,使較高優先權(較低 nice 值)的任務累積虛擬執行時間較慢、因而被偏袒。CFS 不用固定時間片,而是總挑可執行任務中虛擬執行時間最小的那個接著跑,然後讓它跑到它的虛擬執行時間追上其他人為止。為了即使在任務很多時也能快速找到那個最小值,CFS 把任務依虛擬執行時間排在一棵平衡二元樹(紅黑樹)中,所以挑下一個任務很快。其結果逼近一個理想化的處理器:以分數速度同時執行所有任務,按權重比例分享時間。

為什麼重要與誠實的細節:CFS 展示了這個領域的經典想法——公平、優先權、反應時間、多核心平衡——如何在一個真實、廣泛部署的系統中聚合在一起,而非教科書範例。它並非完美或永恆:調校互動性、群組排程(透過控制群組在使用者或容器之間公平分享)、以及多核心負載平衡都增添了真實的複雜度,而事實上近期的 Linux 核心已開始改用一個更新的排程器(EEVDF),它精煉了同樣的公平目標。CFS 最好被理解為對「如何公平且高效地分享一顆處理器」這個整個領域核心問題的一個具體、有影響力的答案。

三個同優先權的任務 A、B、C 都以虛擬執行時間 0 開始。CFS 先跑 A;A 的虛擬執行時間增長,於是現在 B 與 C 較小,其中一個接著跑。隨時間推移,三者都以相同速率累積虛擬執行時間,所以各自最終分到約三分之一的 CPU。給 A 較高優先權,它的虛擬執行時間增長較慢,於是它分到較大的份額。

CFS 永遠執行虛擬執行時間最少的任務,逼近依優先權加權的完全公平分享。

CFS 不是即時排程器——完全公平分享與趕上硬截止期限恰恰相反,所以 Linux 以另外的政策執行即時任務。此外,近期的 Linux 版本正以 EEVDF 取代 CFS,所以「完全公平」是一個快照,而非定論。

又称
CFSLinux CFSLinux 完全公平排程器