6.1 KiB
6.1 KiB
tags, create time
| tags | create time | |||
|---|---|---|---|---|
|
2026-06-15 10:00 |
存储系统与 Cache
概述
本文档系统讲解存储层次结构、Cache 的工作原理(映像方式、替换策略、写策略)、命中率计算以及 17 种 Cache 优化技术。Cache 是计算机系统结构的核心考点,几乎每年都有大分值的计算和分析题。
[!tip] 考试重点 Cache 命中率计算、平均访存时间计算、分离 Cache vs 混合 Cache 的性能对比是必考内容。17 种优化技术的分类和代表性技术需熟记。
正文
一、存储层次结构
graph TD
A["Register"] --> B["L1 Cache"]
B --> C["L2 Cache"]
C --> D["Main Memory"]
D --> E["Disk/SSD"]
style A fill:#ff8a80
style B fill:#ff80ab
style C fill:#ea80fc
style D fill:#82b1ff
style E fill:#80d8ff
| 层次 | 容量 | 速度 | 价格/位 | 管理方式 |
|---|---|---|---|---|
| 寄存器 | KB | 最快 | 最贵 | 编译器 |
| L1 Cache | 32~64 KB | ~1 ns | 较贵 | 硬件 |
| L2 Cache | 256 KB~1 MB | ~5 ns | 中等 | 硬件 |
| 主存 | 4~64 GB | ~100 ns | 便宜 | OS+硬件 |
| 磁盘 | TB 级 | ~10 ms | 最便宜 | OS |
[!question] 为什么存储系统要分层? 单一存储器无法同时满足"大容量、高速度、低价格"的要求。分层设计利用局部性原理,将频繁访问的数据放在快速但小的上层,不常用的放在慢速但大的下层,以较低成本获得接近最快速度的平均性能。
二、Cache 基本原理
2.1 映像方式
| 映像方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 直接映像 | 主存块只能映射到 Cache 的固定位置 | 简单、命中时间短 | 冲突不命中率高 |
| 全相联 | 主存块可映射到 Cache 任意位置 | 冲突不命中率最低 | 硬件开销大、查找慢 |
| 组相联 | 折中方案,分为 2^n 组,组内全相联 |
平衡性能和开销 | 复杂度适中 |
[!note] 组相联 Cache 的命名 "
n路组相联"表示每组有n个 Cache 行。2 路组相联 = 每组 2 行,4 路组相联 = 每组 4 行。
2.2 替换策略
| 策略 | 原理 | 特点 |
|---|---|---|
| LRU(最近最少使用) | 替换最久未被访问的块 | 最常用,效果好 |
| FIFO | 替换最早进入的块 | 简单,但可能替换活跃块 |
| 随机 | 随机选择替换块 | 实现简单,效果尚可 |
2.3 写策略
| 策略 | 命中时 | 不命中时 | 一致性 |
|---|---|---|---|
| 写直达 | 同时写 Cache 和主存 | Write-Allocate 或 No-Write-Allocate | 简单但总线流量大 |
| 写回 | 只写 Cache,标记为脏 | Write-Allocate | 复杂但总线流量小 |
三、Cache 性能计算
3.1 命中率与不命中率
\text{不命中率} = w_I \times mr_I + w_D \times mr_D
其中 $w_I$、w_D 分别为指令和数据的访问占比,$mr_I$、mr_D 为各自的不命中率。
3.2 平均访存时间
\text{平均访存时间} = \text{命中时间} + \text{不命中率} \times \text{不命中开销}
[!example] 分离 Cache vs 混合 Cache
分离 Cache(指令 16KB + 数据 16KB):
- 指令不命中率 1%,数据不命中率 5%
- 命中时间均为 1 周期,不命中开销 40 周期
- 平均访存时间
= 78\% \times (1 + 1\% \times 40) + 22\% \times (1 + 5\% \times 40) = 1.752周期混合 Cache(32KB):
- 不命中率 1.5%,但 load/store 命中时间 +1 周期
- 平均访存时间
= 78\% \times (1 + 1.5\% \times 40) + 22\% \times (2 + 1.5\% \times 40) = 1.782周期结论:分离 Cache 更优(1.752 < 1.782)
3.3 CPU 时间与 Cache 的关系
CPU 时间 = IC \times (CPI_{exe} + \frac{\text{访存次数}}{指令} \times mr) \times \tau
四、17 种 Cache 优化技术
| 分类 | 技术 | 基本思想 | 影响 |
|---|---|---|---|
| 降低不命中率(8种) | 增大块大小 | 利用空间局部性 | 块过大会增加不命中开销 |
| 增大 Cache 容量 | 利用时间局部性 | 增加命中时间 | |
| 提高相联度 | 减少冲突不命中 | 增加命中时间 | |
| 伪相联 Cache | 降低冲突不命中 | 复杂度适中 | |
| 硬件预取 | 提前调入数据 | 增加总线流量 | |
| 编译器控制预取 | 编译器插入预取指令 | 增加指令开销 | |
| 编译优化 | 优化访问模式 | 依赖编译器能力 | |
| Victim Cache | 小全相联 Cache 保存替换出的块 | 减少冲突不命中 | |
| 减少不命中开销(5种) | 非阻塞 Cache | 不命中时允许后续请求 | 提高流水线效率 |
| 写合并 | 合并多次写操作 | 减少写缓冲区占用 | |
| 请求字优先 | 优先传输请求的字 | 减少等待时间 | |
| 写缓冲 | 写操作进入缓冲区异步执行 | 减少写延迟 | |
| 早重启 | 不命中时尽早返回请求字 | 减少等待时间 | |
| 减少命中时间(4种) | 小容量简单 Cache | 降低命中时间 | 适用于 L1 Cache |
| 虚拟 Cache | 用虚拟地址直接索引 | 增加别名问题 | |
| 流水化 Cache 访问 | Cache 访问分段流水化 | 提高时钟频率 | |
| 路预测 | 预测 Cache 行所在路 | 预测错误时需重取 |
[!warning] 优化技术的权衡 几乎每种优化技术都存在"收益-代价"权衡。例如增大块大小降低了强制性不命中,但增加了不命中开销;提高相联度降低了冲突不命中,但增加了命中时间。设计时需要根据具体场景权衡。
五、不命中的三种类型
| 类型 | 原因 | 解决方法 |
|---|---|---|
| 强制性不命中(Compulsory) | 首次访问某块 | 增大块大小、预取 |
| 容量不命中(Capacity) | Cache 容量不足 | 增大 Cache 容量 |
| 冲突不命中(Conflict) | 映射冲突 | 提高相联度、Victim Cache |