约 807 个字 4 行代码 预计阅读时间 4 分钟 共被读过 次
lec16-缓存系统总结¶
1. 缓存术语与指标¶
术语 | 定义 |
---|---|
缓存命中 Hit | 目标数据在缓存中找到 |
缓存未命中 Miss | 目标数据不在缓存中,需从主存加载 |
命中率 Hit Rate | 命中次数 / 总访问次数 |
命中耗时 Hit Time | 命中时,从缓存加载数据的时间 |
缺失惩罚 Miss Penalty | 未命中时,从主存加载数据到缓存的额外时间 |
有效位 | 标识缓存行是否有效(1=有效,0=无效) |
脏位 | 标识缓存行是否被修改(写回策略中需同步到主存) |
2. 缓存行/块¶
- 缓存行/块大小:缓存加载的最小单位(如64Bytes)。
- 示例:访问字节地址
199
未命中时,加载整个块192-255
。 - 优势:利用空间局部性,减少频繁访问邻近地址的缺失。
3. 缓存策略¶
写策略¶
策略 | 行为 |
---|---|
Write-through | 同时更新缓存和主存,实现简单但增加内存流量。 |
Write-back | 仅更新缓存并标记脏位,替换时写回主存,减少内存流量。 |
写分配策略¶
策略 | 行为 |
---|---|
Write-allocate | 写未命中时加载块到缓存并更新。 |
No Write-allocate | 写未命中时直接更新主存,不加载块到缓存。 |
常见组合¶
- Write through, no write-allocate
- write hits 时,缓存和内存同时更新
- write misses 时,不加载块到缓存,直接更新内存
- read misses 时,加载块到缓存
- Write back, write-allocate
- write / read misses, 加载块到缓存
- write hits 时,只更新缓存与脏位
4. 驱逐策略(Evistion Policies)¶
近似LRU(时钟算法)¶
- 机制:
1. 每行包含一个引用位(Referenced Bit
)。
2. 未命中时,按顺序扫描行:- 引用位=1 → 置0,继续扫描。
- 引用位=0 → 替换该行。
其他策略¶
- MRU:替换最近使用的行(适合循环访问模式)。
- 随机替换:无需跟踪元数据,但命中率不稳定。
- 这两个策略优于 MRU 的例子
- 4 个缓存页,依次访问 5 个位于不同页的元素
- LRU 0% hit rate
- MRU 75% hit rate
- Random non-zero hit rate
5. 缓存类型¶
全相联缓存¶
- 特点:数据可存于任意缓存行,需复杂替换策略(如LRU)。
- 地址分解:
Text Only
全地址 = Tag | Byte Offset
前面每个 占1bit
#offset_bits = log2(块大小)
#tag_bits = 地址总位数 - #offset_bits
直接映射缓存¶
- 特点:数据只能存于固定索引位置,冲突率高。
- 地址分解:
组相联缓存¶
- 特点:数据存于固定索引的组内(组内多行),平衡冲突与复杂度。
- 地址分解:
6. 地址分解与硬件实现¶
示例:32位地址,4KB缓存,16B块¶
- 参数计算:
Text Only
#offset_bits = log2(16) = 4
#lines = 4KB / 16B = 256 → #index_bits = log2(256) = 8
#tag_bits = 32 - 8 - 4 = 20
- 地址格式:
硬件结构¶
- 直接映射缓存硬件:
7. 缺失类型¶
类型 | 原因 |
---|---|
强制缺失 | 首次访问某块,必然缺失。 |
容量缺失 | 缓存容量不足,替换后重新加载旧块。 |
冲突缺失 | 多块竞争同一索引(直接映射/组相联中特有)。 |