CPU 排程

優先權排程(priority scheduling)

想像醫院急診室:病患不是依抵達順序看診,而是依緊急程度——心臟病發作會插到扭傷腳踝之前。優先權排程對行程做的是同一件事:每個行程被指派一個優先權數值,CPU 總是交給就緒行程中優先權最高的那個,不論它何時抵達。

它的運作方式:優先權可以由外部設定(依使用者、依重要性、依付了多少錢)或由內部計算(依記憶體需求或預期爆發長度等項目算出)。排程器把就緒行程依優先權排序,並分派最上面那個。優先權排程有兩種風味:非先佔式,較低優先權的工作一旦開始就執行到完成;以及先佔式,一個更高優先權行程的抵達會立刻擠掉正在執行的。事實上,最短工作優先就只是「以預測爆發長度的倒數作為優先權」的優先權排程。

它的核心缺點是飢餓:源源不絕的高優先權行程能讓一個低優先權行程無限期等待——它永遠成不了最重要的,所以永遠跑不到。經典故事是一個 1967 年送出的低優先權工作,據說多年後機器關機時才終於執行。標準的解法是老化:逐漸提高任何已等候許久之行程的優先權,好讓即使是卑微的工作也終究升到頂端、輪到它。

四個就緒工作,優先權為 3、1、4、2(此處數字越小優先權越高)。先佔式優先權排程先跑優先權 1 的工作,再跑優先權 2、3、4。若優先權 1 的工作不斷抵達,優先權 4 的工作可能根本永遠跑不到——這就是飢餓,而老化正是為了防止它而設計的。

優先權排程先服務最重要的工作——代價是可能餓死最不重要的那個。

優先權「數字」較小或較大代表較緊急,是因系統而異的慣例(Unix 的 nice 值:數字越小優先權越高)——務必確認,因為這個慣例在教科書與真實作業系統之間會反過來。