--- 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性能计算]]