Files
final-exam/计算机系统结构/复习文档/存储系统与Cache.md
T

141 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 计算机系统结构
- 复习
- Cache
create time: 2026-06-15 10:00
---
# 存储系统与 Cache
## 概述
本文档系统讲解存储层次结构、Cache 的工作原理(映像方式、替换策略、写策略)、命中率计算以及 17 种 Cache 优化技术。Cache 是计算机系统结构的核心考点,几乎每年都有大分值的计算和分析题。
> [!tip] 考试重点
> Cache 命中率计算、平均访存时间计算、分离 Cache vs 混合 Cache 的性能对比是必考内容。17 种优化技术的分类和代表性技术需熟记。
## 正文
### 一、存储层次结构
```mermaid
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 |
## 关联笔记
- [[计算机系统结构/复习文档/计算机系统结构基础与定量原理]]
- [[计算机系统结构/复习文档/总线与I/O系统]]
- [[计算机系统结构/index|试题册索引]]