CPU 排程

多層回饋佇列(multilevel feedback queue)

/ MLFQ /

想像一個班級,老師事先不知道哪些學生需要快速確認、哪些需要長時間專注,於是老師觀察行為並調整:一個總是很快做完的學生得到短而頻繁的輪流;一個需要長段不被打斷的學生則被調到較慢的軌道。多層回饋佇列對行程做的就是這件事——它依觀察到的行為把行程分類,並讓它們隨時間在佇列間移動,逐漸摸清每個是什麼樣子。

它的運作方式:有好幾個優先權遞減的佇列,而較高優先權的佇列用較短的時間配量。新行程從最上層佇列開始。若它用完整個配量都沒阻塞(這是 CPU 密集的徵兆),就被降級到一個配量較長的較低優先權佇列。若它提早讓出 CPU 去做 I/O(這是互動的徵兆),就留在高處或被升級。排程器先服務較高的佇列。淨效果是:短而互動的工作自然浮到頂端、得到快速反應,而長而 CPU 密集的工作沉到底部、在沒有更緊急者就緒時以大而高效的區塊執行——而且不需要任何人事先預測爆發長度。

為什麼重要:這是經典排程器中最一般、影響最廣的,它僅憑觀察到的過去行為來逼近最短工作優先。為防止底部的長工作飢餓,真實的 MLFQ 設計會加入老化——週期性地把所有人都拉回最上層佇列。調校它很繁複(佇列數目、各配量、降級與升級規則),這是它誠實的缺點;但其核心想法——讓行程的優先權適應它實際的行為——是許多真實作業系統中排程器的底層基礎。

佇列 0(配量 8 毫秒)、佇列 1(16 毫秒)、佇列 2(FCFS)。新工作進入佇列 0;若它跑滿 8 毫秒都沒阻塞就掉到佇列 1;若它又用滿它的時間片就掉到佇列 2。一個按 1 毫秒後就為等鍵盤輸入而阻塞的編輯器,會留在佇列 0、保持它靈敏的反應。

MLFQ 從行為摸清每個工作的本性,把互動工作浮上去、把 CPU 密集的沉下來。

若沒有老化,MLFQ 可能餓死底層佇列,而行程也能耍它(在配量快結束前做一下短暫 I/O 以留在高處)。真實設計會加入老化與週期性優先權重設來補上這些漏洞。

又稱
MLFQmultilevel feedback queue scheduling多級回饋佇列