Appearance
Cache 综合大题:映射+LRU+写策略一题打通
考情分析
Cache 是统考计组第一高频考点,大题最爱"一题串多点":2010 年第 44 题(映射 + 写策略)、2018 年第 44 题(映射 + 虚存 + 写策略)、2020 年第 44 题(映射 + 写策略)都是这个形态。前面四篇分别讲了概念、映射、替换、写策略,本篇把它们拼成一道完整大题,按真题的设问节奏走一遍。
题目
某计算机主存地址 32 位、按字节编址。数据 Cache 大小 4 KB,2 路组相联,块大小 32 B,LRU 替换,写回 + 写分配策略,初始 Cache 为空。
- 写出主存地址划分(tag / 组号 / 块内偏移各多少位)
- 计算 Cache 的总存储容量(含全部开销位)
- 访问地址
0x00012C84,它落在哪一组?tag 是多少? - 程序依次访问同一组的三个主存块 A、B、C(顺序:读 A → 读 B → 写 A → 读 C → 写 B),统计命中情况与主存块传送次数
- 若改为写直达 + 非写分配,第 4 问的主存访问发生什么变化?
(1) 地址划分
- 块内偏移:块大小 32 B →
位 - 行数:4 KB ÷ 32 B = 128 行;组数:128 ÷ 2 路 = 64 组 → 组号
位 - tag:
位
(2) 总容量(含开销位)
每行需要的位:
| 项 | 位数 |
|---|---|
| 数据 | 32 B = 256 |
| tag | 21 |
| 有效位 | 1 |
| 脏位(写回策略才有) | 1 |
| LRU 位(2 路一组,每行 1 位够用) | 1 |
| 合计 | 280 |
总容量 =
两个高频小坑
脏位是写回策略才需要的——题目若给写直达,每行少 1 位。LRU 位数与路数有关:2 路每行 1 位即可,4 路及以上需要更多位(408 一般只考 2 路的 1 位或直接给定)。
(3) 具体地址走查
0x00012C84 展开成二进制(32 位):
0000 0000 0000 0001 0010 1100 1000 0100
└──────── tag(21) ────────┘└─组号(6)─┘└偏移(5)┘从低位往高位切:
- 块内偏移 = 低 5 位
00100= 4 - 组号 = 次 6 位
100100= 36 号组 - tag = 剩余高 21 位 =
0 0000 0000 0000 0010 0101= 0x25
检验:
(4) LRU + 写回的访问模拟
A、B、C 映射到同一组(2 路,即该组只有 2 个槽位)。逐次模拟,每行写出该组内容(左为 MRU、右为 LRU)和脏位:
| 访问 | 结果 | 组内变化 | 脏位/写回 |
|---|---|---|---|
| 读 A | 缺失,调入 A | [A] | A 干净 |
| 读 B | 缺失,调入 B | [B, A] | B 干净 |
| 写 A | 命中(写回策略:只写 Cache) | [A, B] | A 置脏 |
| 读 C | 缺失,替换 LRU = B(干净,直接丢弃) | [C, A] | |
| 写 B | 缺失(写分配:先调入 B),替换 LRU = A,A 是脏块要写回 | [B, C] | B 置脏,写回 A 一次 |
统计:
- 命中 1 次 / 访问 5 次,命中率 20%
- 主存块传送 = 调入 4 次(A、B、C、B)+ 脏块写回 1 次(A)= 5 次
最容易错的两处:第 3 次访问"写 A"在写回策略下不访问主存;最后替换 A 时必须先检查脏位——A 被写过,要先写回再腾位置。
(5) 换成写直达 + 非写分配
- 写 A(命中):写 Cache 的同时写主存 1 次(按字写)
- 写 B(缺失):非写分配——直接写主存,不调块,Cache 内容不变
- 读缺失仍要调块:A、B、C 共 3 次块调入
主存交互变成:3 次块调入 + 2 次字写。注意"块传送"和"字写入"开销不同(一个块 32 B),所以两种策略不能只比次数,真题通常会给出块传送时间和单字写时间让你算总开销——口径以题给为准。
答题套路
- 地址划分永远从低位往高位切:先偏移、再组号、剩下全是 tag
- 总容量 = 行数 ×(数据位 + tag + 有效位 + 脏位 + 替换算法位),逐项列表不漏项
- 走查题先算字段值,再用"
"反向检验 - 模拟题逐次画组内容,每一步标 MRU/LRU 和脏位,替换时先看脏位决定要不要写回