轉譯後備緩衝區(TLB)
/ TEE-ell-BEE /
想像那位櫃台人員,他不再每一次都翻整本目錄,而是在桌上貼一張便利貼,記著最近做過的幾筆「房間對位置」查找——因為訪客一直問同樣那幾間房。轉譯後備緩衝區(TLB)正是這張便利貼:一個小而極快的硬體快取,記住最近的「虛擬分頁對實體頁框」轉換,好讓多數存取完全跳過緩慢的分頁表查找。
具體來說,TLB 是位於 MMU 內部的一個小型關聯式快取(通常只有幾十到幾千項)。每次記憶體存取時,硬體把虛擬分頁號呈給 TLB。若有符合——TLB 命中——實體頁框號與保護位元在一兩個週期內就回來,轉換基本上免費。若沒符合——TLB 未命中——硬體(或作業系統)就得走訪記憶體中的分頁表找出轉換,再把它裝進 TLB 供下次使用。因為程式具有區域性,同樣那些分頁被一再碰到,所以 TLB 命中率通常非常高(遠高於 99%)。
為何重要:沒有 TLB,每一次記憶體參考光是讀分頁表就需要額外的記憶體參考,輕易讓記憶體流量加倍或加三倍——轉換會主宰一切。TLB 正是讓虛擬記憶體在實務上負擔得起的關鍵。誠實的提醒:TLB 的覆蓋範圍有限(項目數乘以分頁大小),所以足跡龐大或散落的程式會遭遇許多 TLB 未命中;情境切換可能清空 TLB(或靠位址空間標籤避免清空);而一次 TLB 未命中雖遠比分頁錯誤便宜,仍是真實、可量測的代價,好的程式碼會設法將它最小化。
一個迴圈在一個 4 KiB 分頁中掃過 1000 次。第一次存取 TLB 未命中、走訪分頁表;接下來 999 次全都 TLB 命中、在一兩個週期內完成轉換——區域性化為速度。
第一次碰未命中;重複碰同一頁則 TLB 命中、近乎免費地轉換。
大分頁(例如 2 MiB 的「巨型分頁」)部分存在的理由就是延伸 TLB 覆蓋範圍:一項涵蓋多得多的記憶體,於是龐大的資料結構造成較少的 TLB 未命中——這是高效能程式碼一個真實的調校旋鈕。