Skip to content

Cache 综合大题:映射+LRU+写策略一题打通

考情分析

Cache 是统考计组第一高频考点,大题最爱"一题串多点":2010 年第 44 题(映射 + 写策略)、2018 年第 44 题(映射 + 虚存 + 写策略)、2020 年第 44 题(映射 + 写策略)都是这个形态。前面四篇分别讲了概念、映射、替换、写策略,本篇把它们拼成一道完整大题,按真题的设问节奏走一遍。

题目

某计算机主存地址 32 位、按字节编址。数据 Cache 大小 4 KB,2 路组相联,块大小 32 B,LRU 替换,写回 + 写分配策略,初始 Cache 为空。

  1. 写出主存地址划分(tag / 组号 / 块内偏移各多少位)
  2. 计算 Cache 的总存储容量(含全部开销位)
  3. 访问地址 0x00012C84,它落在哪一组?tag 是多少?
  4. 程序依次访问同一组的三个主存块 A、B、C(顺序:读 A → 读 B → 写 A → 读 C → 写 B),统计命中情况与主存块传送次数
  5. 若改为写直达 + 非写分配,第 4 问的主存访问发生什么变化?

(1) 地址划分

  • 块内偏移:块大小 32 B → log232=5
  • 行数:4 KB ÷ 32 B = 128 行;组数:128 ÷ 2 路 = 64 组 → 组号 log264=6
  • tag:3265=21
tag21 | 6 | 5

(2) 总容量(含开销位)

每行需要的位:

位数
数据32 B = 256
tag21
有效位1
脏位(写回策略才有)1
LRU 位(2 路一组,每行 1 位够用)1
合计280

总容量 = 128×280=35840 位 = 4480 B(数据 4096 B + 开销 384 B,开销约 9.4%)。

两个高频小坑

脏位是写回策略才需要的——题目若给写直达,每行少 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

检验:地址=(0x25×64+36)×32+4=(37×64+36)×32+4=2404×32+4=76932=0x12C84

(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),所以两种策略不能只比次数,真题通常会给出块传送时间和单字写时间让你算总开销——口径以题给为准。

答题套路

  1. 地址划分永远从低位往高位切:先偏移、再组号、剩下全是 tag
  2. 总容量 = 行数 ×(数据位 + tag + 有效位 + 脏位 + 替换算法位),逐项列表不漏项
  3. 走查题先算字段值,再用"(tag×+)×+"反向检验
  4. 模拟题逐次画组内容,每一步标 MRU/LRU 和脏位,替换时先看脏位决定要不要写回