在作業系統的缺頁置換算法中,FIFO(先進先出)算法存在一個著名的反直觀現象:當分配的物理頁框數量增加時,缺頁次數不減反增。這種異常現象被稱為 Belady Anomaly(Belady 異常)。雖然這個概念源於虛擬記憶體管理,但在實際的緩存系統設計中,同樣會遇到「增加緩存容量,緩存命中率反而下降」的情況。本文將通過具體例子、詳細分析及理論結論,帶你徹底搞懂這一現象的成因與避免之道。
假設頁面訪問序列為 dcbadcedcbae,採用 FIFO 算法,分別模擬 3 個頁框與 4 個頁框的情況:

從圖中可以清晰看到:3 個頁框時發生 9 次缺頁,而增加到 4 個頁框後,缺頁次數反而變成了 10 次。這就是典型的 Belady 異常。
關鍵在於兩種容量下的內存頁面集合之間不再保持子集關係。
FIFO 算法在淘汰最老頁面時,無法保證大容量緩存的內容始終包含小容量緩存的所有內容,導致「包含關係」破裂,從而引發異常。
如果一種置換算法滿足:任意時刻,較小容量的內存頁面集合始終是較大容量內存頁面集合的子集,則該算法稱為 Stack Algorithm(棧算法)。
在實際工程中,應優先選擇 LRU 等棧類算法,或在使用 FIFO 時謹慎評估容量變更的影響。