计算机组成与体系结构:缓存设计概述(Cache Design Overview)
目录
Block Placement(块放置)
Block Identification(块识别)
Block Replacement(块替换)
Write Strategy(写策略)
总结:
高速缓存设计包括四个基础核心概念,它们分别是:Block Placement(块放置)、Block Identification(块识别)、Block Replacement(块替换)以及Write Strategy(写策略)。这四者共同构成了高速缓存的基本工作机制,理解它们是深入学习缓存设计 的前提。
Block Placement(块放置)
这是指主存中的数据块应该被放置到 Cache 的哪个位置。
核心问题:
一个主存块可以放在 Cache 的哪些位置?
📚 三种主要的映射方式:
直接映射(Direct-Mapped)
-
每个主存块只能映射到 Cache 中的一个特定位置。
-
优点:实现简单,访问速度快
-
缺点:冲突率高,多个主存块可能争用同一个位置
全相联映射(Fully Associative)
-
主存中的任意数据块都可以放入 Cache 的任意位置。
-
优点:冲突最小化
-
缺点:硬件复杂,查找开销大
组相联映射(Set-Associative)
-
Cache 分成多个集合(Set),每个集合中有多个行(Way)。
-
每个主存块映射到一个集合,再在集合中任意位置放置。
-
常见形式如:2-way, 4-way 等
-
折中方案:在冲突率和复杂度之间取得平衡
Block Identification(块识别)
当我们访问某个内存地址时,Cache 必须判断这个地址是否在 Cache 中。
核心问题:
如何在 Cache 中识别这个块是否存在?如果存在,是哪一块?
🧱 Cache 的地址划分:
-
Tag(标记位):用于识别主存块是否和 Cache 中的块匹配
-
Index(索引位):用于定位块应该在哪个集合或位置
-
Block Offset:用于在块内部定位具体的字节
匹配流程:
对于一个内存访问,系统会从地址中提取出:
-
Index:找到对应的 Set(或直接映射的位置)
-
Tag:与 Set 中每个块的 Tag 比较(比较命中即是命中)
-
若命中,使用 Offset 访问数据;否则触发缺失(Miss)
直接映射
组相联映射
全相联映射
Block Replacement(块替换)
当 Cache 中的目标位置已经被占用,而新的主存块又必须装入 Cache 时,我们需要替换掉某个已经存在的块。
核心问题:
如果缓存满了,哪一个块应该被替换掉?
⚙️ 替换动作的标准流程:
-
判断是否命中(如果命中则直接访问);
-
如果不命中,判断 Cache 是否有空位(组或全相联中);
-
若无空位 → 触发 Block Replacement 策略:
-
找到最“合适”被淘汰的块;
-
若该块为“脏块” → 写回到主存;
-
装载新的主存块进入该位置。
-
🤖 替换策略:
-
LRU(Least Recently Used):替换最近最少使用的数据块(常用)
-
FIFO(First-In First-Out):替换最早进入缓存的块(简单但可能非最优)
-
Random Replacement:随机选择一个块替换(实现简单)
-
Pseudo-LRU:近似 LRU,用于减少硬件实现的复杂性
策略选择的影响:
-
替换策略直接影响 命中率(Hit Rate) 和 系统性能
-
LRU 在局部性较强的访问模式中表现良好,但实现开销高
Write Strategy(写策略)
Cache 设计中必须明确:当数据被写入时,主存和 Cache 的一致性如何保证。
核心问题:
写操作是直接修改主存,还是只修改 Cache?是否需要同步?
📝 两大类策略:
✅ 写命中策略(Write Hit Policy):
-
Write-Through(直写)
-
同时写 Cache 和主存
-
简单但会产生大量主存写操作
-
-
Write-Back(回写)
-
只写 Cache,并标记为“脏块”
-
仅在块被替换时才写回主存
-
减少主存访问次数,但需要写回控制逻辑
-
❌ 写缺失策略(Write Miss Policy):
-
Write Allocate(写分配)
-
缺失时先将块读入 Cache,然后写入 Cache(常用于 Write-Back)
-
-
No Write Allocate(非写分配)
-
缺失时直接写主存,不将数据加载到 Cache(常用于 Write-Through)
-
总结:
这四部分实际上是一个闭环的机制:
-
块放置决定了一个主存块被映射到 Cache 的哪个位置;
-
块识别决定我们如何判断一个内存访问是否命中 Cache;
-
块替换决定当位置冲突时该替换谁;
-
写策略决定了写入数据时 Cache 和主存的一致性如何维护。
它们密切关联,共同定义了 Cache 的工作行为和性能表现。
有了以上四个基础组成部分的理解,我们就可以正式迈入 Cache Design 的大门了。Cache
Design 是对这些策略的组合与优化,使得 Cache 在访问速度、能效、硬件成本和命中率之间达成
平衡。一个好的设计往往结合特定应用场景,对上述四大机制做出权衡和创新。