虛擬記憶體

分頁(paging)

假設你得把許多人的物品存進一座共用倉庫。如果讓每個人預留任意形狀的連續空間,很快就會出現一堆太小而無法再利用的尷尬縫隙。乾淨的解法是把一切都切成一模一樣的箱子:把每個人的東西切成等大的箱子,把倉庫切成等大的架位,於是任何箱子都能放進任何架位。分頁(paging)正是這樣:記憶體被切成固定大小的片段,於是程式空間與真實記憶體之間的對應,變成一個簡單、無縫隙的「箱對架」指派。

具體來說,虛擬位址空間被切成固定大小的分頁(常見為 4 KiB),實體記憶體則切成同樣大小的頁框。程式的某一頁可以放進任何空閒的頁框、以任何順序——分頁 0 可能放在頁框 90,而分頁 1 放在頁框 12。一張分頁表記錄每個虛擬分頁由哪個頁框存放(或標示它不在記憶體中)。因為分頁與頁框大小相同,沒有任何虛擬分頁會「太大」放不進頁框,也不會有外部碎裂:每個空閒頁框都能被任何分頁使用。唯一的浪費是內部碎裂——最後一個只用了一部分的分頁裡剩下的零頭。

為何重要:分頁是讓虛擬記憶體切實可行的基礎。固定大小的單位讓配置變得簡單(維護一份空閒頁框清單)、讓重定位免費(只要改分頁對應到哪個頁框)、讓保護乾淨(每頁一組權限位元)、也讓需求載入成為可能(只把真正用到的分頁載入)。誠實的取捨:小分頁意味著大分頁表與更大的 TLB 壓力;大分頁縮小表的大小與 TLB 未命中,卻因內部碎裂浪費更多記憶體。真實系統提供多種分頁大小來平衡這點。

一個 12 KiB 的程式在 4 KiB 分頁下有 3 頁。作業系統可能把它們放進頁框 90、12、51——散落且亂序——但程式仍看到一塊連續的 0 到 12 KiB 空間,因為轉換把這份散落藏了起來。

散落的頁框、連續的錯覺:分頁讓程式的視角與實體擺放脫鉤。

分頁消除了外部碎裂,卻引入內部碎裂。較早的替代方案——分段(segmentation)——使用可變大小的片段,反而受相反問題之苦;多數現代系統採用分頁,有時在其上再疊一層簡單的分段。

又称
paged memory分頁機制