首页/操作系统/03-memory/TLB快表详解 🔗 在 Obsidian 中打开
操作系统 · 03-memory

TLB快表详解

重要度 ⭐⭐⭐⭐⭐ 难度 ⭐⭐⭐考查频率 低 操作系统/内存管理快表地址转换页表缓存命中率
速查
TLB 是页表的高速缓存,缓存 VPN → PFN 映射。命中则地址转换只需 1 次访存;未命中需遍历 $n$ 级页表($n+1$ 次访存)。$\text{物理地址} = \text{PFN} + \text{Offset}$

速查

项目
核心概念TLB 快表 —— 页表的高速缓存
关键公式 / 性质$\text{物理地址} = \text{PFN} + \text{Offset}$
考试频率⭐⭐⭐⭐

一、基本概念

TLB(Translation Lookaside Buffer,旁路转换缓存 / 快表)是页表的高速缓存,存储最近使用的虚拟页号到物理页框号的映射。

为什么需要 TLB

  • 多级页表遍历需要多次内存访问(x86-64 四级页表需 4 次)。
  • 每次内存访问都需要地址转换。
  • TLB 命中可避免页表遍历,极大提升性能。
一句话 TLB 之于页表,正如 Cache 之于内存 —— 都是利用局部性原理,用小而快的存储缓存大而慢的存储中的热点内容。区别在于 TLB 缓存的是页表项,Cache 缓存的是数据 / 指令

二、TLB 结构

有效位虚拟页号 VPNPFN标志ASID其他控制位
10x1230x456R/W0x1
10x7890xABCR0x1
0

关键字段

  • 有效位:该 TLB 条目是否有效。
  • 虚拟页号(VPN):查询的
  • 物理页框号(PFN):映射的结果
  • 标志位:权限、脏位等。
  • ASID:地址空间标识符(区分不同进程)。

三、TLB 工作过程

查找流程

  1. CPU 发出虚拟地址,拆分为 VPN | Offset
  2. 用 VPN(连同 ASID)在 TLB 中并行比对(全相联 / 组相联)。
  3. 命中:直接取出 PFN。
  4. 未命中:遍历页表;若页表项有效则取 PFN 并更新 TLB,无效则触发缺页中断
  5. $\text{物理地址} = \text{PFN} + \text{Offset}$。

完整流程可在下方 交互动画 中逐步演示。

时间对比

场景访存次数
TLB 命中1 次(TLB 查找 + 内存访问)
TLB 未命中,页表有效$1+n$ 次($n$ 级页表遍历 + 内存访问)
缺页磁盘 I/O + $n+1$ 次

四、TLB 组织方式

1. 全相联(Fully Associative)

  • 任何条目可放在任何位置。
  • 查找时并行比较所有条目
  • 命中率高,但硬件成本高。
  • 条目数通常较少(64 ~ 512)。

2. 组相联(Set Associative)

  • 分为若干组,每组若干路。
  • 条目按 VPN 的低位分组。
  • 每组内并行比较。
  • 典型:4 路、8 路组相联。
VPN → [组索引] → 在该组内并行比较所有路

3. 直接映射(Direct Mapped)

  • 每个 VPN 只能映射到一个固定位置。
  • 硬件简单,但冲突率高。
  • 实际很少使用。

五、TLB 刷新策略

进程切换时

策略说明优缺点
全部刷新切换时清空 TLB简单但新进程冷启动
ASID 标记每个条目标记进程 ID不用刷新,但需额外硬件
部分刷新只刷新全局页折中方案

ASID(地址空间标识符)

  • 每个 TLB 条目附带 ASID。
  • 不同进程可以共存于 TLB 中。
  • 查找时同时匹配 VPN 和 ASID。
  • 减少进程切换时的 TLB 失效。

六、TLB 命中率分析

命中率的重要性

假设 TLB 命中率 99%,TLB 访问 1 周期,内存访问 100 周期(四级页表):

  • 有效访问时间 $= 0.99 \times (1+100) + 0.01 \times (1+4\times100+100)$
    $= 0.99\times101 + 0.01\times501 = 99.99 + 5.01 =$ 105 周期
  • 若无 TLB(四级页表):$4\times100+100 = 500$ 周期

TLB 命中率 99% 可将访存时间降低约 80%

列式技巧 $EAT = \alpha\times(t_{TLB}+t_{mem}) + (1-\alpha)\times(t_{TLB}+n\cdot t_{mem}+t_{mem})$,其中 $\alpha$ 为命中率、$n$ 为页表级数。不要漏掉未命中时那 1 次 TLB 查找时间(先查 TLB 才知道未命中)。

提高 TLB 命中率的方法

  1. 增大 TLB 条目数。
  2. 使用大页(覆盖更大地址范围)。
  3. 局部性好的程序。
  4. ASID 避免不必要的刷新。

七、TLB 与页表的关系

CPU / MMU TLB(快表) 命中率 > 99% 内存 PML4 PDPT PD PT 多级页表 未命中 回填 PFN
图:TLB 在 CPU 内,页表在 内存中;未命中时 MMU 遍历多级页表,取得 PFN 后回填 TLB。
  • TLB 是页表的缓存
  • 页表在内存中,TLB 在 CPU 内。
  • TLB 命中率通常 > 99%。

八、软 TLB vs 硬 TLB

类型实现特点
硬 TLB硬件实现速度快,但条目数有限
软 TLB软件维护灵活,但速度慢

现代 x86 使用硬 TLB,MIPS 等 RISC 架构支持软 TLB

记忆卡片

TLB 是什么?为什么需要它?
TLB 是页表的高速缓存,存储 VPN → PFN 映射。因为多级页表遍历需要多次访存,TLB 命中可将地址转换时间从 $O(n)$ 降为 $O(1)$。
TLB 的三种组织方式各有什么特点?
全相联:任何位置可放,命中率高但成本高;组相联:按组分配,折中方案;直接映射:固定位置,简单但冲突率高。
进程切换时如何处理 TLB?ASID 的作用是什么?
可以全刷新(简单但冷启动)或用 ASID 标记(不用刷新)。ASID 在 TLB 条目标记进程 ID,不同进程可共存于 TLB。
TLB 命中率 99%、TLB 1 周期、内存 100 周期、四级页表,EAT ≈ ?
$0.99\times(1+100) + 0.01\times(1+400+100) \approx 105$ 周期。无 TLB 则需 500 周期。

交互动画 · TLB 查找流程

虚拟地址 VA 虚拟页号 VPN查 TLB 的键 页内偏移 Offset原样保留 TLB 并行比对VPN + ASID · 全相联 / 组相联 命中 → 取出 PFN无需访问页表 遍历多级页表PML4 → PDPT → PD → PT(4 次访存) 取得 PFN → 回填 TLB页表项无效则触发缺页中断 物理地址 = PFN + Offset
CPU 发出虚拟地址:VPN 用于查表,Offset 原样保留
当前路径:TLB 命中(共 1 次访存)
切换「命中 / 未命中」可对比两条路径的访存次数差异:1 次 vs 5 次(四级页表)。

相关知识点

page-table-structure virtual-memory-management cache-mapping-methods

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。