介紹
頁缺失(英語:Page fault,又名 硬錯誤、 硬中斷、 分頁錯誤、 尋頁缺失、 缺頁中斷、 頁故障等)指的是當軟體試圖訪問已映射在虛擬地址空間中,但是目前並未被載入在物理記憶體中的一個分頁時,由中央處理器的記憶體管理單元所發出的中斷。
通常情況下,用於處理此中斷的程式是作業系統的一部分。如果作業系統判斷此次訪問是有效的,那么作業系統會嘗試將相關的分頁從硬碟上的虛擬記憶體檔案中調入記憶體。而如果訪問是不被允許的,那么作業系統通常會結束相關的進程。
雖然其名為“頁缺失”錯誤,但實際上這並不一定是一種錯誤。而且這一機制對於利用虛擬記憶體來增加程式可用記憶體空間的作業系統(比如Microsoft Windows和各種類Unix系統)中都是常見且有必要的。
微軟在較新版Windows的資源監視器中使用“ 硬錯誤”(Windows Vista及以上)、“ 硬中斷”(Windows 8及以上)這一術語來指代“頁缺失”。
分類
軟性
軟性頁缺失指頁缺失發生時,相關的頁已經被載入進記憶體,但是沒有向MMU註冊的情況。作業系統只需要在MMU中註冊相關頁對應的物理地址即可。
發生這種情況的可能性之一,是一塊物理記憶體被兩個或多個程式共享,作業系統已經為其中的一個裝載並註冊了相應的頁,但是沒有為另一個程式註冊。
可能性之二,是該頁已被從CPU的工作集中移除,但是尚未被交換到磁碟上。比如OpenVMS這樣的使用次級頁快取的系統,就有可能會在工作集過大的情況下,將某頁從工作集中去除,但是不寫入硬碟也不擦除(比如說這一頁被讀出硬碟後沒被修改過),只是放入空閒頁表。除非有其他程式需要,導致這一頁被分配出去了,不然這一頁的內容不會被修改。當原程式再次需要該頁內的數據時,如果這一頁確實沒有被分配出去,那么系統只需要重新為該頁在MMU內註冊映射即可。
硬性
與軟性頁缺失相反, 硬性頁缺失是指相關的頁在頁缺失發生時未被載入進記憶體的情況。這時作業系統需要:
尋找到一個空閒的頁。或者把另外一個使用中的頁寫到磁碟上(如果其在最後一次寫入後發生了變化的話),並註銷在MMU內的記錄;
將數據讀入被選定的頁;
向MMU註冊該頁。
1.尋找到一個空閒的頁。或者把另外一個使用中的頁寫到磁碟上(如果其在最後一次寫入後發生了變化的話),並註銷在MMU內的記錄;
2.將數據讀入被選定的頁;
3.向MMU註冊該頁。
硬性頁缺失導致的性能損失是很大的。以一塊7200rpm的主流機械硬碟為例,其平均尋道時間為8.5毫秒,讀入記憶體需要0.05毫秒。相對的,DDR3記憶體的訪問延遲通常在數十到100納秒之間,性能差距可能會達到8萬到22萬倍。
另外,有些作業系統會將程式的一部分延遲到需要使用的時候再載入入記憶體執行,以此來提升性能。這一特性也是通過捕獲硬性頁缺失達到的。
當硬性頁缺失過於頻繁的發生時,稱發生系統顛簸。
無效
當程式訪問的虛擬地址是不存在於虛擬地址空間內的時候,則發生 無效頁缺失。一般來說這是個軟體問題,但是也不排除硬體可能,比如因為記憶體故障而損壞了一個正確的指針。
具體動作與所使用的作業系統有關,比如Windows會使用異常機制向程式報告,而類Unix系統則會使用信號機制。如果程式未處理相關問題,那么作業系統會執行默認處理方式,通常是轉儲記憶體、終止相關的程式,然後向用戶報告。