重点#
- 知道分离数据 cache 和指令 cache 的作用和目的(考过,2014)
- 了解多级缓存的设计原理
1. 缓存设计时应该考虑的问题#
决定系统访存性能的重要因素之一是cache 命中率,命中率与关联度有关,同时也和 cache 容量有关。显然,cache 容量越大,命中率就越高。此外,命中率还与主存块大小有一定的关系。大的主存块能很好地利用空间局部性,但是,主存块越大,其缺失损失也越大。因此,主存块大小必须适中。
关联度:一个主存块映射到 cache 中时可能存放的位置个数,即每个主存块可被映射到多少个 cache 行。关联度越高,命中率越高。(因为 cache 冲突概率更小)
除上述提到的这些问题外,设计 cache 时还要考虑采用单级还是多级 cache,数据 cache 和指令 cache 是分开还是合在一起,主存—总线—cache—CPU 之间采用什么架构等,甚至 DRAM 芯片的内部结构、存储器总线的总线事务类型等也都与 cache 设计有关,都会影响系统总体性能。
考研时只靠”重点”里的内容
2. 分离 cache#
随着指令流水技术的发展,现代处理器通常将指令 Cache 和数据 Cache 分开设计,形成分离的 Cache 结构。
统一 Cache 的优点在于其设计和实现相对简单,但在流水线执行中,取指部件和执行部件同时访问同一 Cache 时容易产生冲突。
分离数据 cache 和指令 cache 的作用和目的:
通过采用分离 Cache 结构,不仅可以消除取指和执行的访存冲突,还能针对指令和数据的不同局部性特征进行优化,从而提升整体性能。
3. 多级 cache#
早期 CPU 采用的是单级片外 cache,现在一般是多级片内 cache 成为主流。目前 cache 都在 CPU 芯片内,且使用 L1 和 L2 cache,甚至有 L3 cache。通常 L1 cache 采用分离 cache,即数据 cache 和指令 cache 分开设置。L2 和 L3 cache 为联合式,即数据和指令放在一个 cache 中。
在一个采用两级 cache 的系统中,
- CPU 总是先访问 L1 cache,if L1 cache hit,则读取结束
- If L1 cache miss,再从 L2 cache 中找
- If L2 cache 包含所请求的信息(L2 cache hit),则缺失损失为 L2 cache 的访问时间,这比访问主存要快得多
- If L2 cache 访问缺失,则需从主存取信息并同时送 L1 cache 和 L2 cache,此时缺失损失较大。

一般来说,L1 离 CPU 最近,速度最快、容量较小;L2 则较远,速度较慢、容量较大。
通常情况下,L1 级采用分离指令 Cache 和数据 Cache 的设计,其中 L1 的数据 Cache 在写操作中采用写分配法(将主存块调入 cache 再写)与回写法(只写缓存,替换时回写)相结合的策略。
| 组合 | 作用 |
|---|---|
| 全写法 + 非写分配 | 命中时,同时写入 cache 和主存;缺失时,只写入主存,不放入 cache |
| 回写法 + 写分配 | 命中时,只写入 cache;缺失时,先把主存块送入 cache,再在 cache 里更新 |
下图展示一个典型的两级 Cache 系统。通常,L1 和 L2 Cache 均采用回写法,当 L1 发生写命中时,仅更新 L1;当 L1 块被替换时,若为脏块,则写回 L2;L2 同理,在替换时写回主存。
由于 L2 Cache 的访问速度远高于主存,L1 无须在写命中时访问主存,仅更新自身 Cache 行即可快速完成写操作;后续出现替换时,L1 的脏块写回由 L2 承接,从而有效避免因频繁写操作导致的写缓冲饱和或溢出问题。

为了减少写主存的开销,通常在 cache 和主存之间加一个写缓冲(write buffer)。在 CPU 写 cache 的同时,也将信息写入写缓冲,然后由存储控制器将写缓冲中的内容写人主存。写缓冲是一个 FIFO 队列,只有少量空间,CPU 只需将信息写写缓冲而无须写慢速的主存,因而效果较好。但如果写操作频繁发生,则会使写缓冲饱和而发生阻塞。
全局缺失率和局部缺失率#
在多级 cache 中,有全局缺失率和局部缺失率两种不同的概念。
- 全局缺失率:在所有级 cache 中都缺失的访问次数占总访问次数的比例
- 局部缺失率:在某级 cache 中缺失的访问次数占对该级 cache 的总访问次数的比例
例如,对于两级 cache,若 CPU 总的访存次数为 100,在 L1 cache 命中的次数为 94,剩下的 6 次中在 L2 cache 命中的次数为 5,只有 1 次需要访问主存,则全局缺失率为 ,L1 cache 和 L2 cache 的局部缺失率分别为 和 。