虛擬記憶體與需求分頁

純需求分頁(pure demand paging)

想像你展開一趟長途公路旅行,事先完全沒有打包任何東西——你只在第一次真正伸手要某樣東西的那一刻才去買它。你從完全空著開始,而你的背包純粹因應當下的需要而逐漸填滿。純需求分頁就是需求分頁這種極端而徹底的版本:在程式真正第一次參考某一頁之前,絕不把任何頁帶進記憶體。啟動一個程式時,沒有任何一頁是常駐的。

具體來說,在純需求分頁中,一個行程開始執行時,每一個分頁表項目都被標記為無效——它的程式碼或資料沒有任何一頁被預先載入。CPU 試圖執行的第一道指令立刻就造成一次分頁錯誤,因為連那道指令所在的頁都不在記憶體裡;作業系統服務它、把那一頁帶進來。之後對每一個尚未載入之頁的參考,都依序發生錯誤,直到程式的工作集逐漸滴入 RAM。在這陣啟動時的錯誤爆發之後,程式安定下來、大致無錯誤地執行,因為區域性讓它停留在已經載入的那些頁之內。它與某些在啟動時預先載入若干頁的方案形成對比;純需求分頁不預載任何東西,讓每一頁都嚴格地在它第一次被使用時才被拉進來。

為什麼重要:純需求分頁是延遲載入原則最乾淨的陳述,也是衡量像預先分頁這類最佳化時所對照的基準。它最大的優點是:絕不會載入任何不必要的東西——一個只觸碰自己十分之一頁的程式,就只從磁碟讀十分之一。它的代價是啟動時那一叢錯誤,此時許多第一次觸碰擠在一起發生。真實系統通常用預先分頁(載入它們預測會需要的少數幾頁)來緩和這一點,好讓程式不必為它最初每一次參考都因錯誤而停頓,但底層的哲學仍是純需求分頁:預設就是依需求載入,而非預先載入。

一個程式啟動時,所有分頁表項目都是無效的。它最開頭的那道指令就發生錯誤(帶進程式碼頁),接著它第一次資料存取發生錯誤、再下一次,在或許十幾次錯誤的短暫爆發之中——之後它執行數百萬道指令卻幾乎再無錯誤。

從什麼都沒載入開始;每一頁都嚴格在第一次被參考時才到來。

純需求分頁是一個理想化的基準,而非大多數真實系統實際啟動每個程式的方式——它們通常會預先分頁少數幾頁,以避免最初每一次參考都發生錯誤。原則(依需求載入)成立;嚴格的「一開始什麼都不載入」規則通常會被放寬。

又称
start with zero pages純粹依需求分頁