CPU 排程

最短工作優先排程(shortest-job-first)

/ SJF /

如果你在影印機前,好幾個人在等,讓只印一頁的人先於要印五百頁的人,能讓大家的平均等待變短。最短工作優先(SJF)排程把這個直覺套用到 CPU 上:在就緒行程中,先執行下一段 CPU 爆發最短的那個。

它為何特別:在非先佔的情況下,對一組給定的工作,SJF 在最小化平均等待時間(因而也包括平均完成時間)上是可以被證明為最佳的。理由很簡單——把短工作排在長工作之前,能大幅減少短工作的等待,卻只稍微延後長工作,而這筆交易總是拉低平均。所以沒有其他非先佔排序能在平均等待時間上勝過 SJF。

癥結是個致命傷:SJF 需要在工作執行前就知道它下一段 CPU 爆發的長度——而你無法預知未來。實務上作業系統會根據過去行為來估計下一段爆發,通常用指數平均:一個滾動的猜測,把最近一次實際爆發與舊估計值混合,所以一個一直短暫爆發的行程會被預測為又會短暫爆發。SJF 也有餓死長工作的風險:若短工作不斷抵達,一個長工作可能永遠排不到最前面。它與其說是字面上的日常排程器,不如說是一個基準與構件。

四個工作同時就緒,爆發長度為 6、8、7、3。SJF 以最短優先執行它們:3、6、7、8。等待時間為 0、3、9、16,平均 7 毫秒——低於任何其他順序。若依抵達順序(FCFS)執行則平均更差;SJF 是這個指標的最佳解。

SJF 給出可證明的最低平均等待時間——前提是你事先就知道各爆發長度。

SJF 只在「紙面上」最佳,因為它需要知道下一段爆發長度,而那是無從得知的;真實系統只能靠預測爆發來逼近它,而即便如此它仍可能餓死長工作。

又称
SJFshortest-next-CPU-burst最短工作優先