Appearance
基本分页(地址变换)
考情分析
分页是内存管理的核心考点,地址变换过程和 TLB 的计算是大题常客。属于 🔥🔥🔥 高频核心。
连续分配浪费严重,分页的思路很直接:把进程和内存都切成固定大小的小块,哪里有空就往哪里塞,再用一张页表记住谁放在了哪里。
基本概念
| 概念 | 说明 |
|---|---|
| 页面(Page) | 将进程的逻辑地址空间分成大小相等的块 |
| 页框(Frame) | 将物理内存分成与页面大小相同的块 |
| 页表(Page Table) | 记录页面到页框的映射关系——就像一本通讯录,用页号查到对应的物理块号,就知道数据实际住在哪 |
页面大小通常为 4KB(
逻辑地址结构
逻辑地址 = 页号 P + 页内偏移 W
|← ── 页号 P ── →|← 页内偏移 W →|
高位部分 低位部分- 页面大小为
→ 页内偏移占 k 位 - 页号 $= $ 逻辑地址
页面大小 - 页内偏移 $= $ 逻辑地址
页面大小
示例:页面大小 4KB =
- 页内偏移占 12 位:0xA1F
- 页号:0x2(第 2 页)
- 查页表得到第 2 页对应的页框号,假设为 8
- 物理地址
地址变换过程
基本分页需要两次内存访问:
- 第一次:访问页表(查页框号)
- 第二次:访问实际数据
快表 TLB
为了减少访存次数,引入快表(TLB, Translation Lookaside Buffer)——一个高速缓存,存放最近访问过的页表项。快表相当于你手机里的"最近通话"——大部分时候你要找的人就在里面,不用翻整本通讯录。
带 TLB 的地址变换
| 情况 | 访存次数 |
|---|---|
| TLB 命中 | 1 次(只访问数据) |
| TLB 未命中 | 2 次(访问页表 + 访问数据) |
有效访存时间计算
设 TLB 命中率为
示例:
若没有 TLB:每次都需 2 次访存 = 400ns。引入 TLB 后降低到 240ns。
多级页表
当逻辑地址空间很大时(如 32 位地址),页表本身也很大。解决方案:多级页表。
二级页表
将页表再分页,建立页目录表指向各个页表页:
逻辑地址: |一级页号|二级页号|页内偏移|
页目录表 → 页表页 → 页框号二级页表需要 3 次访存(TLB 未命中时):页目录 → 页表 → 数据
n 级页表需要 n+1 次访存(TLB 未命中时)。
交互可视化
页表项大小的计算
示例:物理内存 4GB,页面大小 4KB。
- 页框数
个 - 页框号需要 20 位
- 页表项至少 20 位 → 实际通常取 4B(对齐到字节边界)
易错
TLB 相关的访存次数是计算题高频陷阱:
- TLB 命中:1 次访存(只访问数据)——TLB 本身是高速缓存,访问 TLB 不算访存
- TLB 未命中:2 次访存(查页表 + 访问数据)
- 如果是 n 级页表 + TLB 未命中:n+1 次访存
常见错误:把 TLB 访问时间算成一次访存。TLB 是寄存器/Cache 级别的硬件,比内存快得多,EAT 公式中
考研高频考点
- 🔥🔥🔥 逻辑地址到物理地址的变换过程(手算)
- 🔥🔥🔥 TLB 命中和未命中时的访存次数
- 🔥🔥🔥 有效访存时间 EAT 的计算
- 🔥🔥 多级页表的访存次数(n 级 = n+1 次)
- 🔥🔥 页表项大小的计算
- 🔥 分页系统有内碎片(最后一页可能不满)无外碎片
分页从系统管理角度出发,把一切切成固定大小。但程序员写代码时想的是"代码段""数据段"这样的逻辑结构——下篇来看以用户视角划分的基本分段。