虛擬記憶體與記憶體映射

轉譯後備緩衝器(TLB)

/ TEE-EL-BEE /

在每一次記憶體存取時走訪多層分頁表,意味著每一次載入與儲存都要多做好幾次記憶體讀取——這會要命。TLB(translation lookaside buffer)是一個小而極快的快取,記住最近的「虛擬分頁對頁框」轉譯,於是反覆存取同幾頁時可以完全跳過走訪。它就是管理員把最近幾次「公寓對樓層」的查詢寫在便利貼上,而不是每次都翻開那本大通訊錄。

在機制上,TLB 位於 MMU 內,保存著少數幾筆最近的轉譯(常是幾百到幾千筆)。每次存取時,MMU 先用虛擬分頁號碼查 TLB:TLB 命中就立刻回傳頁框,幾乎不花額外時間;TLB 未命中則迫使緩慢的分頁表走訪,之後把新的轉譯存進 TLB 以備下次。因為程式傾向於一再碰觸同幾頁(區域性,locality of reference),命中率通常非常高,這也是分頁能快到處處可用的唯一原因。

TLB 有個值得知道的重要後果:它必須和分頁表保持一致。當作業系統更動一個對映時(釋放一頁、切換行程、複製一頁寫入時複製頁),陳舊的 TLB 表項會轉譯到錯誤的頁框,所以作業系統必須清空或使其失效——而在許多設計上,一次完整的上下文切換會清空大半個 TLB,這也是切換行程代價高昂的部分原因。TLB 未命中也是為什麼四處亂散、對快取不友善的存取樣式會比循序的慢,這超出單純 CPU 快取的範圍。

一個循序掃過陣列的迴圈,會一連碰觸每一頁很多次:對某頁的第一次存取是 TLB 未命中(緩慢走訪),但接下來對同一頁的上千次存取都是 TLB 命中。反之,在一個巨大陣列裡隨機跳躍,幾乎每次存取都造成一次 TLB 未命中。

區域性讓大多數存取變成便宜的 TLB 命中。

TLB 快取的是轉譯,不是資料——它和 CPU 的資料快取是分開的。陳舊表項是正確性的隱患,所以對映改變時作業系統必須使 TLB 失效;一次上下文切換常會清空它,增添切換成本。

又称
TLBaddress-translation cache轉譯快取