虛擬記憶體

需求分頁(demand paging)

想像搬進一棟大房子,但只在真正需要某箱東西的那一刻才拆那一箱,而不是第一天就把一百箱全拆開。多數箱子你從不打開。需求分頁(demand paging)正是這種對記憶體的懶惰策略:與其在程式執行前把整支程式載入 RAM,系統只在程式第一次碰到某一頁時才載入那一頁——按需載入。

具體來說,程式啟動時,它的分頁在分頁表中大多標示為不存在(有效位元 0);程式內容躺在儲存裝置上的執行檔或交換區裡。程式立刻開始執行。它第一次存取某一頁時,缺席的有效位元觸發分頁錯誤,作業系統只把那一頁讀進一個頁框、標示為有效、然後繼續。從不被碰到的分頁根本不會被載入。這正是為何一支巨大的程式能幾乎瞬間啟動,也是為何一個行程能有遠大於實體 RAM 的虛擬位址空間——只有正在使用的分頁才會佔用頁框。

為何重要:需求分頁讓「跑得比實體記憶體還大的程式」成真,並大幅縮短啟動時間與記憶體佔用,因為程式通常只用到位址空間的一小部分。誠實的陷阱是:每一頁的第一次存取都要付分頁錯誤的代價,而若需要的分頁集合超過可用頁框,系統就會開始逐出它很快又會用到的分頁——輾轉。所以需求分頁是對區域性的一場賭注:它之所以划算,正是因為程式在任一時刻都把存取集中在一小組工作集合上。

在一台 1 GiB 的機器上啟動一支 2 GiB 的應用程式。它立刻啟動,因為只有啟動所需的分頁被載入;那幾 GiB 你從不使用的功能根本不會離開儲存裝置。

碰到才載入:分頁一次一個錯誤地到來,僅在需要時。

需求分頁靠區域性才划算。沒有它——若程式隨機且均勻地碰各頁——就會不斷引發錯誤而輾轉,這時一次全部載入反而較好。真實程式具有區域性,所以需求分頁幾乎總是划算。

又称
lazy loading of pages按需分頁