CPU 排程
等待時間(waiting time)
站在咖啡店排隊:唯一感覺像在等的,是你站在那裡無事可做的時間,而不是咖啡師真正在做你飲料的時間。排程裡的等待時間正是這段「在隊伍中閒置」的部分:一個行程在它的一生中,待在就緒佇列、已準備好可執行卻沒被選中的總時間。
確切地說,等待時間只計算在就緒佇列中的時間——不算行程在 CPU 上執行的時間,也不算它因做 I/O 而阻塞的時間。對一個只有一段 CPU 爆發的簡單工作,等待時間 = 完成時間減去爆發長度。當一個工作分成好幾段爆發執行(被先佔或 I/O 打斷)時,你要把它所有「已就緒卻沒在跑」的零散時段全部加總。排程器常以平均等待時間來評判,因為它分離出了延遲中真正由排程器負責的那一部分。
為什麼重要:從工作的角度看,等待時間是排程開銷最直接的量度——CPU 的工作量本身是固定的,所以好政策就是能把總等待壓小、且最好是公平分配的政策。這正是最短工作優先在平均上所最小化的量,也是護航效應(短工作卡在長工作後面)之所以這麼傷的原因:它膨脹了每個人的等待時間。
三個長度為 6、8、7 毫秒的工作依此順序執行、無 I/O。工作 1 等 0、工作 2 等 6(排在工作 1 後)、工作 3 等 6 + 8 = 14。平均等待時間 = (0 + 6 + 14)/3 = 6.67 毫秒。改成最短優先(6、7、8)後便降到 (0 + 6 + 13)/3 = 6.33 毫秒。
等待時間就是就緒佇列中的閒置時間;重新排序工作會直接改變它。
等待時間不包含因 I/O 而阻塞的時間——那段延遲是裝置的責任,不是排程器的。把 I/O 等待算進等待時間是常見的錯誤,會讓排程器看起來比實際更差。
另见