Files
final-exam/计算机系统结构/重点复习/小题7-Cache不命中与3C模型.md

146 lines
5.8 KiB
Markdown
Raw Permalink 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
- 3C模型
create time: 2026-06-16 21:21
---
# 小题 7 — Cache 不命中与 3C 模型
## 概述
本题考查 Cache 不命中的 **3C 分类模型**(Compulsory、Capacity、Conflict)及其各自的特点和对策。3C 模型是理解 Cache 行为和指导 Cache 优化的核心分析框架。
> [!tip] 考试重点
> 需要熟记三种不命中的名称、英文、原因和解决方法。考试常以选择题或简答题出现,题目可能给出一个场景让你判断属于哪种不命中类型。
## 正文
### 一、3C 模型概述
Cache 不命中可以按**产生原因**分为三类,合称 **3C 模型**:
```mermaid
graph TD
ROOT["Cache Miss"] --> C1["Compulsory Miss"]
ROOT --> C2["Capacity Miss"]
ROOT --> C3["Conflict Miss"]
C1 --> C1R["First Access"]
C2 --> C2R["Cache Too Small"]
C3 --> C3R["Mapping Conflict"]
```
### 二、三种不命中详解
| 类型 | 英文名 | 原因 | 发生条件 | 解决方法 |
|:----:|--------|------|----------|----------|
| **强制性不命中** | Compulsory Miss (Cold Miss) | **首次访问**某数据块 | Cache 冷启动时 | 增大块大小、硬件预取 |
| **容量不命中** | Capacity Miss | Cache **容量不足** | 工作集超过 Cache 容量 | 增大 Cache 容量 |
| **冲突不命中** | Conflict Miss | 多个块**映射到同一位置** | 直接映像或组相联中冲突 | 提高相联度、Victim Cache |
#### 2.1 强制性不命中(Compulsory Miss)
**原因**:某个数据块**第一次**被访问时,Cache 中必然没有该块。
> [!note] 特点
> - 也叫**冷启动不命中**(Cold Miss)或**首次访问不命中**
> - 与 Cache 的容量和相联度**无关**——即使 Cache 无限大、全相联,第一次访问仍然不命中
> - 在程序执行过程中只发生**一次**(对每个数据块)
> - 在长时间运行的程序中,强制性不命中占总不命中的比例**很小**
**对策**:
| 方法 | 原理 |
|------|------|
| 增大块大小 | 一次调入更多相邻数据,减少后续访问的强制性不命中 |
| 硬件预取 | 在数据被需要之前就将其调入 Cache |
| 编译器预取 | 编译器插入预取指令,提前加载数据 |
#### 2.2 容量不命中(Capacity Miss)
**原因**:程序的**工作集**(频繁访问的数据集合)超过了 Cache 的总容量,导致刚被替换出的块很快又需要被访问。
> [!note] 特点
> - 与映射方式**无关**——即使是全相联 Cache,只要容量不够就会发生
> - 在程序执行过程中**持续发生**
> - 增大 Cache 容量可以直接减少容量不命中
**对策**:
| 方法 | 原理 |
|------|------|
| 增大 Cache 容量 | 直接扩大 Cache 以容纳更多工作集 |
| 编译器优化 | 优化数据访问模式,减少工作集大小(如分块算法) |
#### 2.3 冲突不命中(Conflict Miss)
**原因**:在直接映像或组相联 Cache 中,多个主存块竞争同一个 Cache 行/组位置,相互替换。
> [!note] 特点
> - **只有直接映像和组相联 Cache 才有**——全相联 Cache 没有冲突不命中
> - 即使 Cache 总容量足够,如果两个频繁访问的块映射到同一位置,也会反复冲突
> - 典型场景:地址 A 映射到行 X,地址 B 也映射到行 X,交替访问 A 和 B 导致颠簸
**对策**:
| 方法 | 原理 |
|------|------|
| 提高相联度 | 更多路意味着更多位置,减少冲突概率 |
| Victim Cache | 用小的全相联 Cache 保存最近被替换出的块 |
| 伪相联 Cache | 先查主位置,不命中时再查次位置 |
### 三、3C 模型对比表
| 维度 | 强制性 | 容量 | 冲突 |
|:----:|:------:|:----:|:----:|
| **英文** | Compulsory | Capacity | Conflict |
| **别名** | Cold Miss | - | Collision Miss |
| **发生时机** | 首次访问 | 工作集过大 | 映射冲突 |
| **全相联 Cache 中** | 有 | 有 | **无** |
| **直接映像 Cache 中** | 有 | 有 | 有 |
| **增大 Cache 容量** | 不影响 | **减少** | 减少 |
| **提高相联度** | 不影响 | 不影响 | **减少** |
| **增大块大小** | **减少** | 可能增加 | 可能增加 |
> [!question] 思考:三种不命中的优先级?
> 在优化 Cache 时,通常按以下优先级处理:
> 1. **先减少冲突不命中**——成本最低(提高相联度或加 Victim Cache)
> 2. **再减少容量不命中**——成本较高(增大 Cache 容量)
> 3. **最后减少强制性不命中**——通常占比最小,预取技术有一定开销
### 四、3C 模型的实验验证
> [!example] 判断不命中类型
>
> **场景**:直接映像 Cache,4 行,块大小 16B。访问序列:0, 16, 0, 16, 0, 16, ...
>
> - 地址 0 → 行 0(**强制性不命中**,首次访问)
> - 地址 16 → 行 1(**强制性不命中**,首次访问)
> - 地址 0 → 行 0(**命中**,还在 Cache 中)
> - 地址 16 → 行 1(**命中**)
>
> 现在改为:Cache 只有 **1 行**(直接映像),同样的访问序列:
> - 地址 0 → 行 0(**强制性不命中**)
> - 地址 16 → 行 0(**容量不命中** + **冲突不命中**——只有 1 行,0 被替换)
> - 地址 0 → 行 0(**冲突不命中**——16 又被替换)
> - ...
>
> 如果是 **全相联** 1 行 Cache:第一次是强制性不命中,第二次是**容量不命中**(全相联无冲突不命中)。
> [!abstract]- 答案
> Cache 不命中的 3C 模型:
>
> | 类型 | 原因 | 解决方法 |
> |------|------|----------|
> | **强制性**(Compulsory) | 首次访问 | 增大块大小、预取 |
> | **容量**(Capacity) | Cache 太小 | 增大 Cache 容量 |
> | **冲突**(Conflict) | 映射冲突 | 提高相联度、Victim Cache |
## 关联笔记
- [[计算机系统结构/复习文档/存储系统与Cache]]
- [[小题6-组相联映射与标识存储器]]
- [[大题4-Cache性能计算]]