CPU 排程

分派延遲(dispatch latency)

想像一場接力賽,一名跑者必須停下、交出接力棒,下一名跑者必須接過棒並開始衝刺。交棒那段手忙腳亂的瞬間——兩名跑者都沒有向前推進——就是浪費掉的時間。分派延遲就是 CPU 的這個交接成本:從一個行程停下,到下一個行程真正開始執行有用指令之間所花的時間。

這段延遲從何而來?主要兩部分。第一,作業系統必須停下正在執行的東西並化解任何衝突——例如完成或延後核心工作,且在可先佔核心中釋放鎖,好讓更高優先權的行程能繼續。第二,分派器必須做環境切換:存下舊行程的狀態、載入新行程的狀態。這一切都是額外開銷——CPU 把它花在記帳上,而不是程式真正的工作上。

為什麼重要:分派延遲為系統能多快反應設下了底線。對互動式桌面而言,幾微秒是看不見的。但對控制馬達或安全氣囊的即時系統而言,最壞情況的分派延遲必須又小又可預測,因為遲到的反應可能就是一次失敗。它也解釋了為何極小的時間配量很浪費——若你每幾分之一毫秒就切換一次,每一段配量的很大一部分都被延遲吃掉、而非用於運算。

當一個低優先權的記錄器正在執行時,一個高優先權的警報處理執行緒變為就緒。分派延遲就是從那一刻到警報執行緒執行它第一條指令之間的空檔:核心必須先佔記錄器、可能釋放它持有的鎖、並做環境切換。若一段配量是 100 微秒而分派延遲是 10 微秒,那整整一成的 CPU 都是額外開銷。

配量越小,分派延遲佔有用工作的比例就越被放大;即時系統在意的是它的最壞情況。

分派延遲是一種你要盡量縮小卻永遠到不了零的開銷——每一次切換都有代價,這正是輪轉排程的配量不能無限縮小的真正原因。