步骤 6 / 9
TLB 与大页:让翻译变快
TLB 缓存最近的翻译结果;大页让一次翻译覆盖更多内存。
每次访问内存都去查页表会很慢,所以 CPU 里有个小缓存 TLB,记住最近的翻译。 程序访问往往集中在附近,绝大多数翻译都能直接命中,就像浏览器缓存让重复请求不用走网络。 对数据库这类大内存程序,Linux 支持大页(如 2MB),同样大小的 TLB 能覆盖更多内存。
操作系统
每个程序都以为自己独占一大片内存,其实背后有一层翻译。
以 Linux 上一个程序读取自己内存中的一个变量为例,只讲概念。
步骤 6 / 9
TLB 缓存最近的翻译结果;大页让一次翻译覆盖更多内存。
每次访问内存都去查页表会很慢,所以 CPU 里有个小缓存 TLB,记住最近的翻译。 程序访问往往集中在附近,绝大多数翻译都能直接命中,就像浏览器缓存让重复请求不用走网络。 对数据库这类大内存程序,Linux 支持大页(如 2MB),同样大小的 TLB 能覆盖更多内存。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 程序想读取一个变量 |
| 用户态 | 地址落在“堆”区域 |
| 用户态 | 查页表,得到物理地址 |
| 翻译中 | 逐级查找页表 |
| 动手实验 | 地址被拆成 4 个 9 位下标和 12 位偏移 |
| 用户态 | TLB 命中,翻译几乎零开销 |