CPU 排程

飢餓(starvation)

想像一個自助餐,熱門的菜不斷被補上、被新來的人搶走,而後排一位有禮貌的人始終擠不到前面——他並非被任何規則擋住,只是一直被略過。排程中的飢餓正是如此:一個行程已就緒且能執行,但排程政策不斷選別人排在它前面,於是它無限期等待、可能永遠拿不到 CPU。

它從何而來:只要一個政策能無上限地系統性偏袒某些行程,飢餓就會發生。優先權排程是經典來源——一個低優先權行程永遠被一連串更高優先權的抵達者壓過。最短工作優先與最短剩餘時間優先若短工作不斷湧入,就可能餓死長工作。關鍵特徵是:被餓死的行程並非死結(它不是在等另一個行程持有的資源);它只是永遠沒被選中。換個時機它本可執行——它只是持續地倒楣。

為什麼重要、以及如何治療:飢餓破壞了好系統應提供的公平與有限等待保證,而它容易被忽略,因為當一個工作受苦時,平均指標可能看起來仍然不錯。標準療法是老化——隨時間慢慢提升一個等待行程的有效優先權,使它最終壓過所有人並執行。輪轉與多層回饋佇列的設計,有一部分就是為了一開始就防止飢餓發生。

一個夜間備份以最低優先權執行。在忙碌的白天,較高優先權的網頁與資料庫行程不斷抵達,於是備份始終拿不到 CPU、備份永遠不發生——直到老化最終把它的優先權提得夠高而執行,或負載終於下降。

被餓死的行程已就緒且願意執行,卻被永久略過——老化是常用的解法。

飢餓不是死結:被餓死的行程「若被排到就能跑」,只是始終沒被排到;死結的行程「無法跑」,因為它在等一個永遠不會被釋放的資源。問題不同,解法也不同。

又称
indefinite blocking無限期阻塞