Appearance
题目
下列命中组合情况中,一次访存过程中不可能发生的是( )。
错因
A
直觉觉得"三个全没命中太罕见",于是选 A。但这恰好对应首次访问某个新地址的常见场景:TLB 没缓存这个映射、页表里这页还没装入主存(刚启动或被换出)、Cache 自然也没有这块——三层全 miss,触发缺页中断 + Cache miss 处理,完全可能。
B
可能觉得"TLB 没命中怎么 Cache 能命中"——错在认为 TLB miss 就意味着 Cache 也得 miss。TLB 和 Cache 是独立的两个缓存:TLB 缓存"虚→实地址映射",Cache 缓存"内存数据"。一个虚地址哪怕第一次访问 TLB(miss)、走页表得到物理地址后,物理地址可能恰好命中 Cache(之前别的虚地址映射过来同物理位置)。所以 B 完全可能。
C
误以为"Cache miss 一定意味着 Page miss"。但 Page 在主存里 ≠ 数据在 Cache 里——Cache 容量远小于主存,主存的某页存在,但其内容不一定正好被装进 Cache。日常访存里"页在主存、Cache miss"是非常普通的情况(Cache 替换、初次访问等)。
总解析
核心结论:TLB 命中 → Page 必然命中。所以"TLB 命中 + Page 未命中"自相矛盾,D 不可能。
为什么 TLB 命中蕴含 Page 命中?
TLB(Translation Lookaside Buffer)是页表的高速缓存,缓存的是"已经成功映射且当前有效"的页表项。一个 TLB 表项存在 ≠ 它过期——当主存中对应的页被换出时,操作系统会同步把 TLB 中相应表项失效(invalidate)。所以:
- TLB 中能查到 → 该页表项有效 → 该页正在主存中
如果有人不及时同步失效,那是 OS 设计 bug,不是题目讨论的范围。
三个层次的关系图:
| 层次 | 缓存的内容 | 失效后退路 |
|---|---|---|
| TLB | 最近用过的"页表项"(虚→实映射) | 查页表(在主存) |
| Cache | 最近用过的"主存数据块" | 访问主存 |
| Page | 当前进程虚地址空间中已装入主存的页 | 缺页中断,从磁盘换入 |
TLB / Cache / Page 的全部 8 种组合 与可能性:
| TLB | Page | Cache | 可能性 | 说明 |
|---|---|---|---|---|
| miss | miss | miss | ✓ A | 首次访问/缺页 |
| miss | miss | hit | ✗ | 页都缺了,Cache 不可能命中(Cache 装的是主存的副本) |
| miss | hit | miss | ✓ | TLB 第一次见,但页在内存、Cache 未缓存 |
| miss | hit | hit | ✓ B | TLB 第一次见,但页和 Cache 都已就绪 |
| hit | miss | * | ✗ D | 自相矛盾——TLB 有效 ⇒ 页必然在主存 |
| hit | hit | miss | ✓ C | 映射有缓存、页在主存、Cache 没装 |
| hit | hit | hit | ✓ | 全命中(最快路径) |
结论:D 那一行不可能存在。
最终答案是 D(TLB 命中,Cache 命中,Page 未命中)。
记忆口诀:
- "TLB 是页表的子集,页表项必须有效才入 TLB" —— 所以 TLB 命中 ⇒ Page 命中
- Cache 与 TLB / Page 都独立 —— Cache 命中与否和 TLB / Page 是否命中可以任意组合(除了"页都没装进主存,Cache 却有"那种自我矛盾的)
- 这道题的"反向措辞"是"不可能发生"——审题时圈出来,避免选成"可能发生但少见"的 A