虛擬記憶體

反轉分頁表(inverted page table)

一般分頁表問的是「對這個虛擬分頁,哪個頁框存放它?」於是它的大小隨著(可能龐大的)虛擬位址空間成長,再乘上每一個行程。反轉分頁表(inverted page table)把問題反過來問「對這個實體頁框,目前哪個虛擬分頁坐在這裡?」——於是它每個真實頁框只有一項。想像一本全大樓共用的帳冊,每個真實櫃子一列、寫著誰在用它,而不是每位住戶一本各自的大目錄。

具體來說,反轉分頁表的項目數量恰好等於實體頁框的數量,與虛擬位址空間有多大、有多少個無關。每一項記錄目前是哪個行程、哪個虛擬分頁佔用那個頁框。要轉換時,硬體不能再用虛擬分頁直接索引(表並非那樣組織),所以它把(行程識別碼、虛擬分頁號)這一對雜湊一下找出候選項目、再加以檢查——用一個帶鏈結的雜湊表來處理碰撞。符合時就得出頁框號(也就是該項目的索引)。

為何重要:反轉分頁表把分頁表大小約束在實體記憶體而非虛擬記憶體,這在位址空間龐大而實體記憶體相對較小時很吸引人。誠實的取捨很真實:轉換需要一次雜湊查找(較複雜,還有碰撞鏈)而非直接索引;行程間共享一個頁框很彆扭,因為每個頁框只有一項;要表示一個在磁碟上的分頁也較難。由於這些麻煩,多數主流系統改用多層的正向分頁表,而反轉表出現在特定架構中——它是一個真實的設計選項,不是預設。

在一台有 100 萬個頁框的機器上,反轉分頁表恰有 100 萬項——無論在跑的是一個還是一百個行程,也無論每個行程的 64 位元虛擬空間有多龐大。

大小由實體頁框數而非虛擬分頁數決定——代價是雜湊查找而非直接索引。

反轉分頁表是例外而非常規。它們優雅地解決了表大小的問題,卻使轉換與共享變複雜,所以你今天用到的多數 CPU 改採多層正向分頁表。

又称
IPT倒置分頁表