行程與行程抽象

環境切換(context switch)

想像一位廚師輪流烹調好幾道菜。要離開一道菜去接手另一道而不毀了任何一道,廚師必須記下每道菜當時的確切狀態(火力、計時、做到一半的部分),回來時再把那個狀態還原。環境切換就是作業系統為行程做這件事:把當前執行中行程的一切保存起來,並載入下一個行程的一切,好讓 CPU 從執行其一切換到執行另一個。

一步步來看,當作業系統決定切換時(因為時間配量用完、來了中斷、或執行中的行程阻塞了),它把執行中行程的環境——也就是它的 CPU 暫存器與程式計數器——存進該行程的 PCB;接著選出下一個行程,把它被保存的環境從它的 PCB 載回 CPU 暫存器,更新記憶體管理狀態(例如分頁表指標)指向那個行程的位址空間,並從那個行程被保存的程式計數器處恢復執行。離開的行程在半途凍結;到來的行程則在它先前停下的確切位置解凍。

環境切換正是讓單顆 CPU 上的多工成為可能的東西:靠著切換得夠快,作業系統營造出眾多行程同時執行的錯覺。但它並非免費。保存與還原的工作是純粹的額外負擔(其間沒有任何使用者運算發生),而切換到不同的位址空間可能清空快取與 TLB,使新行程「冷」啟動、短暫地跑得更慢。這正是為什麼切換太頻繁會傷害產出率,也是為什麼區分「有用的工作」與「切換的額外負擔」很重要。要注意,在同一行程的多條執行緒之間切換比較便宜,因為它們共用同一個位址空間。

行程 A 執行時計時器中斷觸發。作業系統把 A 的暫存器存進 A 的 PCB,從 B 的 PCB 載入 B 的暫存器,B 便恢復執行。花在保存與還原上的那幾微秒沒做任何有用的工作;那就是切換的額外負擔。

存 A、載 B:花掉的時間是額外負擔,不是運算。

環境切換是額外負擔,不是進展。切換太頻繁(或切到一個會清空 TLB 與快取的「冷」位址空間)會傷害整體產出率。

又稱
task switchprocess switch環境切換內容切換上下文切換