141 lines
6.1 KiB
Markdown
141 lines
6.1 KiB
Markdown
---
|
||
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|试题册索引]]
|