CPU 排程

分派器(dispatcher)

如果排程器是決定誰下一個上場的裁判,那分派器就是真正帶那個人走上舞台的引導員。一旦短期排程器選好了一個行程,分派器就是核心中那個小而底層、實際把 CPU 交給它的部分。

用淺白的步驟走一遍分派器做的事:它執行環境切換——把離開的行程的暫存器與程式計數器存進它的行程控制區塊,再載入被選中行程已儲存的暫存器與程式計數器。它切換到使用者模式(離開核心的特權模式)。它跳到新行程程式碼中正確的位置,讓執行從那個行程上次停下的地方繼續。完成後,被選中的行程就像從未停過一樣在執行。

為什麼它值得有自己的名字:分派器在每一次環境切換時都會被呼叫,所以它必須精簡。它增加的延遲——從停下一個行程到跑下一個之間的時間——稱為分派延遲,那是純粹的額外開銷。作業系統切換得越頻繁(例如用一個非常小的時間配量),花在分派器而非真正工作上的總時間就越多。

排程器挑中行程 B。分派器接著把 A 的暫存器存進 A 的行程控制區塊、從 B 的行程控制區塊載入 B 的暫存器、還原 B 儲存的程式計數器、切換到使用者模式,CPU 便在指令流中途接續執行 B。對 A 與 B 而言這是看不見的;它們各自只覺得自己一直連續在跑。

分派器是把排程器的選擇變成一個正在執行的行程的機制。

分派器會執行環境切換,但兩者並不相同——環境切換是儲存暫存器的機制(屬於行程管理概念);分派器是呼叫它並接續執行被選中行程的那段排程程式碼。