Appearance
题目
采用指令 Cache 与数据 Cache 分离的主要目的是( )。
错因
A
缺失损失(miss penalty)是 Cache 未命中时去下一级(L2 / 主存)取数据的代价,由下一级存储的访问时间决定,与 I-Cache / D-Cache 是否分离无直接关系。把所有 Cache 性能指标混作一谈是这题的最大陷阱。
B
命中率主要由 Cache 容量、组织方式(关联度)和替换策略决定。把一个统一 Cache 拆成大小相加相等的 I/D 两个 Cache,每个的容量反而变小,命中率很可能降低。所以分离的目的肯定不是为了提命中率。
C
平均访存时间 。三个因子都不是 I/D 分离的直接获益——分离主要是为了带宽(同周期取指 + 访存),而不是降低这条公式里的任何一项。
总解析
为什么要分离 I-Cache 与 D-Cache?
回到流水线一个时钟周期内的访存需求——在经典 5 段流水线里:
| 阶段 | 访存动作 |
|---|---|
| IF(取指) | 读指令 |
| ID(译码) | — |
| EX(执行) | — |
| MEM(访存) | 读 / 写数据(仅 load/store 指令) |
| WB(写回) | — |
关键观察:在某一时刻,流水线里前后多条指令同时存在——比如第 周期,I1 处于 MEM 阶段(要访问数据),同时 I4 处于 IF 阶段(要取指)。
如果只有一个统一 Cache,I1 和 I4 同时争用同一份 Cache 端口 → 这是典型的结构冒险(资源冲突),必须让其中一个等一拍。
分离方案:
- I-Cache 专给 IF 阶段用
- D-Cache 专给 MEM 阶段用
- 两者物理上独立、各有端口,可在同一周期并行被访问
→ 流水线的 IF 与 MEM 不再争用资源,结构冒险消失。
这正是 哈佛结构(指令和数据分离)的体现。冯·诺依曼结构(指令数据共用)在流水线场景下天然存在这种结构冒险,所以现代 CPU 的 L1 都是 I/D 分离的。
最终答案是 D(减少指令流水线资源冲突)。
同类陷阱辨析:
| 想到的"目的" | 是否成立? | 原因 |
|---|---|---|
| 降低缺失损失 | ✗ | miss penalty 由下一级速度决定 |
| 提高命中率 | ✗ | 拆分反而可能降命中率(容量被分割) |
| 降低平均访存时间 | ✗ | 不是直接因果 |
| 减少结构冒险(资源冲突) | ✓ | 哈佛结构服务流水线的核心动机 |