【 Cache 写策略学习笔记】
🚀 Cache 写策略学习笔记:从写不命中到多级缓存的精细控制
🧠 为什么需要 Cache 写策略?
在现代计算机体系中,Cache(高速缓存) 承担着 CPU 与主存之间的“加速器”角色。读操作可以通过缓存机制提高命中率,减少主存访问时间,但 写操作就没那么简单:
- 写是数据更新操作,涉及一致性维护;
- 写操作存在“命中”和“不命中”两种情况,行为不同;
- 在多级 Cache 中,不同层之间的数据传输策略也不一样。
因此,为了提高效率、降低主存带宽压力并维持一致性,必须设计合适的写策略(Write Policy)。
📌 基础术语说明
- 写命中(Write Hit):要写入的数据地址已存在于 Cache 中。
- 写不命中(Write Miss):要写入的地址在 Cache 中不存在。
- 写直达(Write Through):数据同时写入 Cache 和主存。
- 写回(Write Back):先只写入 Cache,延迟写入主存,需设置“脏位”。
- 写分配(Write Allocate):写不命中时,将块从主存加载入 Cache,然后写入 Cache。
- 非写分配(No Write Allocate):写不命中时,不加载块入 Cache,直接写主存。
📘 我的提问与探索过程整理如下:
✅ 1. 写不命中是什么意思?写什么?
我的问题:
“CPU 写不命中是什么意思,写什么?”
学习成果总结:
写不命中(Write Miss)指的是 CPU 要写入某地址,但这个地址所对应的数据块不在 Cache 中。此时系统必须选择是把这块数据从主存调入 Cache(写分配),还是直接写主存(非写分配),这由写策略决定。
✅ 2. 我这样理解对吗?
我的问题:
“现在我需要写入一个地址,可以是存入一个数字吗?那么这个过程就是 CPU 需要向 Cache 写入这个数字,但地址不在 Cache 中,就用写分配法将主存单元找出写入 Cache,使用写回法将原 Cache 地址写回主存,然后再将新的地址写入 Cache,这样理解对吗?”
学习成果总结:
这个逻辑大体是对的,但顺序要理清:
- CPU 要写入地址 A,但发生写不命中;
- 使用写分配策略:把地址 A 所在块从主存加载到 Cache;
- 此时 Cache 若满,需替换一块;
- 如果被替换的块是脏的(被修改过) → 写回主存;
- 然后再将块 A 写入 Cache,并执行写入;
- 写回策略意味着只更新 Cache,不立即写主存,延迟到块被替换时再写。
✅ 3. 替换时才触发写回是对的吗?
我的问题:
“写入 Cache 之前不是 Cache 已经满了吗?如果原来被替换的块使用了写回法,那是不是在替换时才将原始块写回主存?”
学习成果总结:
✅ 正确!写回策略的精髓就是延迟写主存,只有当该块被替换时,如果它是“脏的”,才将其整个块写回主存。这么做是为了减少主存写入次数,提高效率。
✅ 4. 非写分配时如何更新主存?我理解对吗?
我的问题:
“全写法(写直达)是写命中时同时写 Cache 和主存;非写分配法是写不命中时直接写主存,不更新 Cache。这里写不命中是如何更新主存单元的?是不是 CPU 没在 Cache 中找到目标块,就直接写主存,但不更新 Cache?”
学习成果总结:
✔ 是的,你理解是准确的。
**非写分配(No Write Allocate)**策略下:
- 写不命中时不会调块进 Cache;
- 直接把数据写到主存中;
- Cache 结构不发生变化;
- 下一次再访问同一地址时仍会 miss。
✅ 5. 多级 Cache 中策略为什么不同?
我的问题:
“为什么在多级 Cache 中,L1 和 L2 之间使用写直达 + 非写分配;而 L2 和主存之间使用写回 + 写分配?这与我前面说的写回和写分配搭配是否一致?如果不一致,它们是怎么实现的?”
学习成果总结:
这不是矛盾,而是有层次性设计考虑:
🔹 L1 ↔ L2:写直达(Write Through)+ 非写分配
- L1 小而快,设计目标是响应速度快 → 避免污染、降低复杂性;
- 写直达 → 写操作立即反映在 L2;
- 非写分配 → 写 miss 直接落到 L2,不拉数据入 L1。
🔹 L2 ↔ 主存:写回(Write Back)+ 写分配
- L2 容量更大,适合长期缓存 → 利用局部性;
- 写回 → 降低主存带宽压力;
- 写分配 → 写 miss 时拉块入 L2,优化后续访问。
所以,它们并非异或,而是按功能分层优化设计的体现。
✅ 总结:我的写策略知识图谱
类别 | 策略类型 | 说明 |
---|---|---|
写命中时 | Write Through | 同时写入 Cache 和主存 |
写命中时 | Write Back | 只写 Cache,标脏位,延迟写主存 |
写不命中时 | Write Allocate | 把目标块从主存加载到 Cache,再写入 |
写不命中时 | No Write Allocate | 不加载块,直接写主存,不更新 Cache |
多级 Cache | L1–L2 用 WT+NWA | 保持 L1 简洁、高速 |
多级 Cache | L2–主存用 WB+WA | 提高整体性能和局部性 |
📝 学习建议
- 区分写命中策略与写不命中策略
- 多级 Cache 中要理解层级功能不同→策略不同
- 建议多用图表模拟访问流程,帮助深化理解