当前位置: 首页 > news >正文

【 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
多级 CacheL1–L2 用 WT+NWA保持 L1 简洁、高速
多级 CacheL2–主存用 WB+WA提高整体性能和局部性

📝 学习建议

  • 区分写命中策略写不命中策略
  • 多级 Cache 中要理解层级功能不同→策略不同
  • 建议多用图表模拟访问流程,帮助深化理解

http://www.dtcms.com/a/280036.html

相关文章:

  • 编程项目选择思考点以及项目包装的关键点
  • linux系统------LVS+KeepAlived+Nginx高可用方案
  • 优雅的Java:01.数据更新如何更优雅
  • Rocky Linux 9 源码包安装php8
  • 基于按键开源MultiButton框架深入理解代码框架(一)(指针的深入理解与应用)
  • 开源AI Agent开发平台Dify源码剖析系列(二)
  • HTTP 协议
  • 微信小程序进度条cavans
  • 【电脑】显卡(GPU)的基础知识
  • Golang Channel与协程的完美配合指南
  • CAU数据挖掘 第五章 聚类问题
  • vscode里面怎么配置ssh步骤
  • Python+Selenium自动化爬取携程动态加载游记
  • python实现自动化sql布尔盲注(二分查找)
  • js最简单的解密分析
  • 分支战略论:Git版本森林中的生存法则
  • document.documentElement详解
  • Webshell连接工具原理
  • 渗透笔记1-4
  • html js express 连接数据库mysql
  • 【算法训练营Day12】二叉树part2
  • 进程---基础知识+命令+函数(fork+getpid+exit+wait+exec)
  • 100道K8S面试题
  • LVS初步学习
  • google浏览器::-webkit-scrollbar-thumb设置容器滚动条滑块不生效
  • langflow搭建带记忆功能的机器人
  • 【React Native】环境变量和封装 fetch
  • Knife4j快速入门
  • 【深度学习:进阶篇】--4.4.集束搜索(Beam Search)
  • 深入探索ZYNQ网络通信:四大实现方案与创新应用