缓存与持久内存
更新时间:2026-10-01。当内存本身可持久,“写进缓存”与“掉电不丢”变成两件需要显式保证的事。
本文要回答的问题
- 数据落进缓存为什么不代表已持久?
- 怎样保证崩溃后状态一致?
一、新层级与持久域
PMem 字节寻址、延迟介于 DRAM 与 SSD 之间且断电保留。普通写只到缓存/write-back,崩溃时未写回的内容会丢;需要缓存写回指令(clwb/clflushopt)把相关行推进持久域,并以 fence 保证顺序。
二、崩溃一致性
应用要用 undo/redo 日志等机制配合“分配—写回持久—再可见”的顺序,确保任意时刻崩溃都能恢复;要区分“对其它核可见”(缓存一致性)和“已持久”(持久域),二者的保证原语不同。
三、常见坑
- 以为 store 完成即持久。
- 回写后不 fence,顺序被打乱。
- 用一致性替代持久性保证。
小结
持久内存要求显式把脏行推进持久域并排序,软件需做崩溃一致性设计,缓存可见性不等于持久化。下一篇 缓存概念全景与速查。
总结
持久内存在 DRAM 与 SSD 之间插入了一个字节寻址、掉电保留的新层级,于是"数据已写进缓存/对其他核可见"和"数据已落进持久域、崩溃不丢"变成两件必须分别保证的事:需要用 clwb/clflushopt 把相关行回写、用 sfence 保证顺序,再配合 undo/redo 日志按"分配—回写持久—再可见"的次序做崩溃一致性设计。缓存一致性解决可见性,持久化原语解决掉电安全——拿前者替代后者,就是 PMem 程序丢数据的根因。