分頁與位址轉換

TLB 命中與失誤(TLB hit and miss)

回到電話旁那張寫著最常用號碼的便利貼。要打號碼時,你先瞄一眼便利貼。若號碼寫在上面,幸運——這是命中,你立刻撥號。若不在便利貼上,你就得翻遍整本電話簿去找——失誤,比較慢,事後你通常會把那號碼補進便利貼以備下次。TLB 命中與失誤就是一次位址轉譯的這兩種結果。

精確地說:每次記憶體存取時,硬體在 TLB 裡查頁號。TLB 命中表示(頁 → 頁框)的轉譯早已快取,於是頁框號立刻回傳、完全不查分頁表——快路徑。TLB 失誤表示轉譯不在 TLB 裡,於是硬體(或在軟體管理的 TLB 上由作業系統)必須去走訪記憶體中的分頁表找出頁框,這得付一次或多次額外的記憶體存取;找到的新轉譯隨後被載入 TLB,若 TLB 已滿則逐出某個現有項目。命中的存取比例稱為命中率,通常很高——往往遠超過 95% 或 99%——因為程式展現區域性。

命中與失誤之所以重要,是因為它們主宰位址轉譯的真實成本,進而主宰整體記憶體速度;有效存取時間就是直接由命中率與每條路徑的成本算出。兩個誠實的重點:TLB 失誤不是錯誤、也不是分頁錯誤——它只表示轉譯沒被快取;那一頁可能好端端地在記憶體裡。(相對地,分頁錯誤表示該頁根本不在記憶體裡,那是另一種、昂貴得多的事件。)還有,環境切換之後,若 TLB 被清空,新行程會以一陣「強制失誤」開場,直到它工作集的轉譯被載入——切換無可避免的小小代價。

假設一次 TLB 命中花 1 個時間單位(記憶體存取本身),失誤花 2 個單位(一次走表、一次取資料)。命中率為 99% 時,平均而言 99% 的存取付 1 單位、1% 付 2 單位,於是平均為 0.99 * 1 + 0.01 * 2 = 1.01 單位——幾乎快得像分頁表不存在一樣。

高命中率讓平均轉譯成本貼近快路徑;失誤稀少,只把它稍微拉高一點。

TLB 失誤「不是」分頁錯誤:失誤表示轉譯沒被快取(該頁可能仍在記憶體裡),而分頁錯誤表示該頁根本不在記憶體裡。把兩者搞混會導致成本估算離譜地錯誤。

又稱
TLB hitTLB missTLB 命中TLB 失誤TLB 未命中