作業系統核心

行程排程器(process scheduler)

一臺電腦只有寥寥數個 CPU 核心,卻有數百個行程與執行緒全都想跑。行程排程器就是核心裡那個部分,它一刻接一刻地決定哪個工作得到 CPU、得到多久——這個交通管制員藉由在它們之間飛快切換 CPU,營造出一切同時在跑的錯覺。沒有它,一個程式可能永遠霸佔一個核心;有了它,瀏覽器、音樂播放器與編譯器都在同樣那幾個核心上推進。

核心機制如下。準備好可以跑(並非被阻塞、等待磁碟或網路)的工作,待在一個執行佇列(run queue)裡。排程器挑出一個、設好計時器,讓它跑一個時間片(一小片 CPU 時間,常是幾毫秒)。當時間片用盡,計時器中斷觸發,排程器儲存那個工作的暫存器與狀態(一次上下文切換)並載入另一個工作的——於是它們輪流。工作也會在阻塞時自願讓出 CPU(譬如呼叫一個尚無資料的 read())。優先順序與 nice 值讓你偏移這些決定:一個「更 nice」的行程(較高的 nice 值)更願意把 CPU 讓給別人,低優先順序的得到較少。一個可搶占式排程器能在更該執行的東西出現時,強制把 CPU 從執行中的工作奪走,而不必等它自願放棄——這正是讓一個失控迴圈不致凍結你機器的關鍵。

為何它重要、以及一個關鍵的誠實要點:排程是一個作業系統「手感」的核心——好的排程意味即便重載也回應靈敏的互動系統,壞的排程意味卡頓與延遲。但並不存在單一「最佳」的排程;它是在相互衝突的目標之間取得平衡——吞吐量(完成的總工作量)、延遲(互動工作回應得多快)與公平(無工作被餓死)——而你無法同時把它們全都最大化。這正是為何核心持續精煉其排程演算法,如 Linux 的完全公平排程器及其後繼者 EEVDF。

執行佇列:[瀏覽器, 編譯器, 音樂]。排程器讓瀏覽器跑一個時間片 -> 計時器中斷 -> 上下文切換儲存瀏覽器暫存器、載入編譯器 -> ...。可搶占式排程器能在失控迴圈執行中途把它從 CPU 上扯下來。

排程器透過時間片與上下文切換,讓就緒的工作輪流使用 CPU;搶占阻止任何單一工作霸佔核心。

並不存在普世最佳的排程:吞吐量、延遲與公平確實相互衝突,所以每個排程器都是在挑取捨,而非找出完美答案。此外,「nice」違反直覺——較高的 nice 值代表較低的優先順序(行程很 nice,在讓步),這常絆倒許多初學者。

又稱
process/thread schedulertask schedulerCPU scheduler排程器