虚拟内存 / 缺页中断 / TLB
局部性、请求分页、页表/快表、缺页中断流程、抖动/工作集。
#resource / operating-system
#type / concept
#status / growing
虚拟内存 / 缺页中断 / TLB
速记结论(背就够用)
- 虚拟内存的基础:局部性原理
- 请求分页最常见
- 缺页中断属于异常(由当前指令引起)
- 无 TLB 时地址转换常见“两次访存”
1) 虚拟内存是什么
基于局部性原理:程序不必全部装入内存,只装入当前需要的页/段。
2) 局部性原理
- 时间局部性:刚访问过的很可能再次访问
- 空间局部性:刚访问过的附近地址很可能被访问
3) 页表与 TLB(快表)
- 页表:页号 -> 页框号 + 权限/存在位/修改位/引用位…
- TLB:页表缓存,加速地址转换
笔试高频:两次访存
- 无 TLB:访问页表一次 + 访问数据一次
- 有 TLB:命中通常可视为一次主存访问(忽略 TLB 代价);未命中仍需查页表
TLB 命中/未命中的访存次数题型
常见简化假设:忽略 TLB 访问时间。
- TLB 命中:只访问一次主存(直接拿到页框号并访问数据)
- TLB 未命中:访问页表一次 + 访问数据一次(两次主存访问)
如果题目要求计算有效访存时间(EAT),通常形式是:
EAT = hitRate * (TLBHitCost) + (1-hitRate) * (TLBMissCost)
按题目给的“TLB 查找时间/主存访问时间”代入即可。
3.5) 分页 / 分段 / 段页式(对比表)
| 对比项 | 分页 | 分段 | 段页式 |
|---|---|---|---|
| 划分依据 | 固定大小(物理单位) | 按逻辑模块(大小不定) | 先分段再分页 |
| 用户可感知 | 通常不可感知 | 可感知(段号/段表) | 部分可感知 |
| 碎片 | 可能内部碎片 | 可能外部碎片 | 内部碎片为主 |
| 地址结构 | 页号 + 页内偏移 | 段号 + 段内偏移 | 段号 + 页号 + 页内偏移 |
| 访存次数(朴素) | 2 次(页表 + 数据) | 2 次(段表 + 数据) | 3 次(段表 + 页表 + 数据) |
| 常见加速 | TLB | TLB | TLB |
4) 缺页中断(异常)
访问页不在内存 -> 缺页中断:
- 判断是否在外存
- 找空闲页框或置换
- 调入目标页
- 更新页表/TLB
- 重新执行指令
易错点:缺页中断属于异常(由当前指令引起),不是外设中断。
5) 抖动(颠簸)
页框太少导致频繁缺页,大部分时间都在换页,CPU 利用率下降。
例题(速记)
例 1:两次访存(无 TLB)
在请求分页中,一次逻辑地址访问通常需要:
- 查页表得到页框号
- 访问目标数据
所以常见结论是“两次访存”。
例 2:EAT 计算(有 TLB)
假设:主存访问 100ns,TLB 查找 10ns,TLB 命中率 90%。
- 命中:10 + 100 = 110ns
- 未命中:10 + 100(查页表)+ 100(取数据)= 210ns
EAT = 0.9110 + 0.1210 = 120ns