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

5.8 KiB
Raw Blame History

tags, create time
tags create time
计算机系统结构
重点复习
Cache
3C模型
2026-06-16 21:21

小题 7 — Cache 不命中与 3C 模型

概述

本题考查 Cache 不命中的 3C 分类模型(Compulsory、Capacity、Conflict)及其各自的特点和对策。3C 模型是理解 Cache 行为和指导 Cache 优化的核心分析框架。

[!tip] 考试重点 需要熟记三种不命中的名称、英文、原因和解决方法。考试常以选择题或简答题出现,题目可能给出一个场景让你判断属于哪种不命中类型。

正文

一、3C 模型概述

Cache 不命中可以按产生原因分为三类,合称 3C 模型:

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

关联笔记