常用概念
映射方式
假设 cache 有 M 个 cache 块 ,对于块号为 k (主存号 / 块大小) 的 主存块:
- 直接映射 :被映射到块号
k % M的 cache 块 - 全相连映射 :可能被映射到任意一个 cache 块
- 组相连映射 :对于 m 路组相连,被映射到组号为
k % (M / m)的 cache 组 中的任意一个 cache 块
cache 写策略
如果某次地址查询命中 cache,可以使用如下策略:
- 直写法-写主存 (Write Through):
- 每次写操作都会同时更新缓存和主存。
- 这种写策略是 同步的 ,每次更新 缓存 时要同步地更新 主存。
- 回写法-写cache (Write Back):
- 当数据被修改时,它首先被缓存在 cache 中,只有当 cache 块被替换时才写入对应的主存块。
- 这种写策略是异步的,并不是写入 cache 后立马就要写入主存,可以多次写入 cache 后在另一个时刻再将cache 块写入主存。
如果 没有命中 cache,有如下策略:
- 写分配法-写cache (Write Allocate):
- 物理地址对应主存块被 加载 到 cache 块中(先执行一次对应主存块的读操作),然后更新 cache 块
- 非写分配法-写主存 (Not Write Allocate):
- 不加载 主存块至 cache 中,直接更新主存块,只有当执行读操作时才将主存块加载进入 cache 块
cache 地址结构
cache 存储结构(数据)

- 有效位 (valid):
- 该 cache 行 是否存储有缓存数据,位数为 1 位。
- 标记 (tag):
- 根据物理地址中的 tag 字段(通常为高t位)与该字段匹配,以判断是否命中。
- 直接映射位数:t = m(log2主存地址数) - c(log2cache行数)
- 全相连映射位数:t = m(log2主存地址数)
- 组相连映射位数:t = m(log2主存地址数) - q(log2cache组数)
- 脏位 (dirty)- 非必须 :
- 标记该 cache 是否修改过,与 写策略 相关。
- 如果采用 直写法,则无需设置 脏位。
- 如果采用 回写法,设置 1 位 脏位。
- 该字段也常被称为 修改位。
- 标记该 cache 是否修改过,与 写策略 相关。
- 访问位 (reference)- 非必须 :
- 用于记录访问信息,服务于 块替换算法,其位数取决于替换算法。
- 如果采用 LRU 替换算法,则 访问位 的位数为 log2(主存快对应的缓存块数量)log2(主存快对应的缓存块数量) 。
- 数据块 (block):
- 缓存的数据块,为 主存块 的一个副本。
公式
命中率 = 命中次数 / 访存总次数
缺失率 = 未命中次数 / 访存总次数
例题
例1 某存储系统中,主存容量是 Cache 容量的 4096 倍,Cache 被分为 64 个块,当主存地址和 Cache 地址采用直接映像方式时,地址映射表的大小应为( )(假设不考虑一致维护和替换算法位。)
A. 6x4097bit
B.64x12bit
C.6x4096bit
D.64x13bit
答: D
由于主存容量是 Cache 的 4096 倍,主存地址比 Cache 地址多 12 位,直接映射下,每行需存 12 位标记加 1 位有效位,因此地址映射表大小为 64 × 13 位。
例2 有效容量为128KB的Cache,每块16B,采用8路组相联。字节地址为1234567H的单元调入该 Cache,则其Tag 应为( ).
A.1234H
B.2468H
C.048DH
D.12345H
答: C
主存2^24块, cache一共2^10组,故标记字段为14 位,页内地址4位, 组号10位, 将 1234567H (0001 0010 0011 0100 0101 0110 0111)转为二进制后取其高 28位~14 位,得到 Tag = 048DH。
例3有一主存-Cache 层次的存储器,其主存容量为 1MB,Cache 容量为 16KB,每块有8个字, 每字 32 位, 采用直接地址映像方式, Cache起始字块为第0块, 若主存地址为 35301H, 且 CPU 访问Cache 命中,则在 Cache 的第()(十进制表示)字块中。
A. 152
B. 153
C. 154
D. 151
答: A
先将主存地址写成二进制0011 0101 0011 0000 0001,再按直接映射地址结构划分:低 5 位为块内地址,高 6 位为主存字块标记[20(主存位数)-5(块容量位数)-9(块数位数)=6],其余位为 Cache 字块地址,98H对应十进制为 152。
例4 某计算机的 Cache 有 16 行,块大小为 16B,其映射方式可配置为直接映射或 2-路组相联映射,主存按字节编址,主存单元从0开始编号。若依次访问下列主存单元,则不论采取上述哪种映射方式都可能引起Cache 冲突的是()
A.52 号和 102 号单元
B.48 号和 308 号单元
C.60号和160号单元
D.46 号和 236 号单元
答: B
块大小 16B ⇒ 块内地址 4 位,直接映射时 Cache 行号 = ⌊主存地址 / 16⌋ % 16,48 和 308 计算结果均为 3
例5 假设主存按字节编址,Cache 共有64 行,采用四路组相联映射方式,主存块大小为 32字节,所有编号都从0开始。则第 2593号存储单元所在主存块的Cache组号是
A.1
B. 15
C. 14
D. 4
答案: A
块大小 32B 得块内地址 5 位,64 行四路组相联划分为 16 组得组号 4 位,由地址 2593 的主存地址(2048+512+32+1=101 | 0001 | 00001)可知其所在主存块映射到 Cache 的第 0001 组。
例6 【2021统考真题】若计算机主存地址为 32 位,按字节编址,Cache 数据区大小为 32KB,主存块大小为 32B,采用直接映射方式和回写(Write Back)策略,则 Cache 行的位数至少是( )。
A.275
B.274
C.258
D.257
答: A
1(有效位) + 1(脏位) + 17(Tag) + 32*8(数据位) = 275
例7【2022 统考真题】若计算机主存地址为 32 位,按字节编址,某 Cache 的数据区容量为32KB,主存块大小为64B,采用8路组相联映射方式,该Cache 中比较器的个数和位数分别为()
A. 8, 20
B. 8, 23
C. 64, 20
D. 64, 23
答: A
8路 ->8个比较器
Tag20位 -> 20位比较器
