首页/计算机组成原理/存储器/Cache高速缓冲存储器 🔗 在 Obsidian 中打开
计算机组成原理 · 存储器

Cache高速缓冲存储器

重要度 ⭐⭐存储器层次结构Cache映射方式替换算法命中率存储器
速查
Cache 解决CPU 与主存速度不匹配,利用局部性;命中率通常 90% 以上;地址由 Tag + Index + Offset 三部分划分。平均访问时间 $T_a = H \cdot T_c + (1-H) \cdot T_m$。

速查

项目
作用解决 CPU 与主存速度不匹配
命中率通常 90% 以上
地址映射Tag + Index + Offset

核心概念

Cache 是位于 CPU 和主存之间的高速小容量存储器,利用局部性原理(时间局部性和空间局部性)来缓解 CPU 与主存之间的速度差异。

地址映射方式(主存块 → Cache 行)

  1. 直接映射:主存块只能映射到 Cache 的固定行。映射关系:Cache 行号 = 主存块号 mod Cache 行数。优点:硬件简单、查找快;缺点:冲突率高。
  2. 全相联映射:主存块可映射到 Cache 的任意行。优点:冲突率最低;缺点:比较电路复杂、成本高。
  3. 组相联映射:将 Cache 分为若干组,每组若干行。主存块映射到固定组,组内任意行。映射关系:Cache 组号 = 主存块号 mod Cache 组数。是直接映射和全相联映射的折中,n 路组相联表示每组 n 行。

替换算法(Cache 满时选择淘汰哪一行)

  • FIFO(先进先出):替换最早进入的行,可能抖动
  • LRU(最近最少使用):替换最久未被访问的行,命中率高,408 最常考
  • LFU(最不经常使用):替换访问次数最少的行
  • 随机替换:随机选择,实现简单但性能不稳定

写策略

  • 写命中:写回法(只修改 Cache,脏位标记,替换时写回主存)vs 全写法 / 写直达法(同时写 Cache 和主存)
  • 写不命中:写分配法(先调入 Cache 再写)vs 非写分配法(直接写主存不调入)

Cache 性能

$T_a = H \times T_c + (1-H) \times T_m$,其中 H 为命中率,$T_c$ 为 Cache 访问时间,$T_m$ 为主存访问时间。

关键定义

概念定义
命中率 HCPU 访问 Cache 命中的概率
Cache 行 / 块Cache 中存储数据的基本单位,通常与主存块等大
标记 Tag地址中用于标识主存块的高位部分
有效位标识 Cache 行中数据是否有效
脏位 / 修改位标识 Cache 行中的数据是否被修改过(写回法使用)
直接映射主存块只能映射到 Cache 中固定的一行
组相联映射主存块映射到固定组,组内可放任意行
全相联映射主存块可映射到 Cache 中任意一行
LRU最近最少使用替换算法
写回法仅在 Cache 行被替换时才写回主存
全写法每次写操作同时更新 Cache 和主存

常见考法

考点说明
地址划分给定 Cache 参数,划分标记 / 组号 / 块内地址的位数
映射分析给定地址序列,分析各块在 Cache 中的存放位置
命中率计算给定访问序列,统计 Cache 命中次数
平均访问时间利用公式计算考虑 Cache 后的等效访问时间
Cache 容量计算计算 Cache 总容量(数据 + 标记 + 有效位 + 脏位)
替换过程分析给定替换算法和访问序列,追踪 Cache 内容变化
写策略选择分析不同写策略对性能和一致性的影响

易错点

必记
  • 地址划分时,字节偏移的位数由块大小决定(如块大小 64B → 6 位偏移)
  • 组相联映射中,组号位数 = $\log_2(\text{组数})$,不是 $\log_2(\text{行数})$
  • Cache 总容量 $\neq$ 数据存储容量,还需加上标记阵列(标记位 + 有效位 + 脏位)
  • LRU 需要用计数器或栈来追踪访问顺序,n 路组相联每组需要 $\log_2(n!)$ 位
  • 写回法 + 写分配法是 Cache 常用的组合;全写法通常配合非写分配法
  • 直接映射的冲突失效(conflict miss)是最常考的场景

核心结论

  1. Cache 命中率对系统性能影响极大:当 $H=0.9$ 时加速约 5 倍,$H=0.99$ 时加速约 50 倍
  2. 增大 Cache 容量或增大块大小可提高命中率,但会增加命中时间和缺失代价
  3. 组相联度越高,冲突缺失越少,但比较硬件成本越大,通常 2~8 路组相联效果最佳
  4. LRU 在大多数实际访问模式下优于 FIFO,但实现复杂度更高
  5. 时间局部性解释了为什么 Cache 能提高命中率:最近访问的数据很可能会再次访问

记忆卡片

三种地址映射方式各有什么特点?
直接映射:硬件简单但冲突率高;全相联映射:冲突率最低但比较电路复杂;组相联映射:折中方案,n 路组相联每组 n 行。
平均访问时间公式是什么?
$T_a = H \times T_c + (1-H) \times T_m$,H 为命中率,$T_c$ 为 Cache 访问时间,$T_m$ 为主存访问时间。
写回法和全写法有什么区别?
写回法:只修改 Cache,设脏位,替换时写回主存(减少主存写次数);全写法:同时写 Cache 和主存(保证一致性但增加访存)。
Cache 总容量等于数据存储容量吗?
不等于。还需加上标记阵列:Tag 标记位 + 有效位 + 脏位(写回法)+ 替换算法位。
哪种映射方式最易产生抖动?
直接映射最容易发生"刚被替换出的数据又被访问"的情况;组相联通过多行缓存降低了冲突缺失。
408 最常考的替换算法?
LRU(最近最少使用),命中率高但实现较复杂。

交互动画 · Cache 访问过程逐步演示

手动模式
主存(8 块) Cache(4 行) B0 B1 B2 B3 B4 B5 B6 B7 Index = 块号 mod 4 L0 L1 L2 L3
直接映射:CPU 访问主存块 B 时,只能放在 Cache 的第 B mod 4 行;查该行标记是否等于 B 判断 命中/未命中。
访问序列:B4 → B4 → B1 → B1 → B0 → B0(逐步演示命中与未命中)
$T_a = H \times T_c + (1-H) \times T_m$
点击预设或输入参数后计算加速比;加速比 = $T_m/T_a$,命中率越高越接近 $T_c$。

相关知识点

virtual-memory virtual-memory-management

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。