x86-64架构下无缓存数据写入时的缓存行加载延迟问题
x86-64下纯原子写入的缓存行为分析
场景代码
#include <stdatomic.h> _Atomic int x; void g(int a) { atomic_store_explicit(&x, a, memory_order_relaxed); }
针对上述场景(仅对不在缓存中的原子变量x执行memory_order_relaxed语义的纯写入,无任何读取操作),x86-64架构下的缓存行为可以明确如下:
- 必须加载目标缓存行,且需等待加载完成:x86遵循MESI缓存一致性协议,CPU要写入某缓存行时,必须先获取该行的独占(Exclusive)或修改(Modified)状态。而获取这两种状态的前提,是先将对应缓存行从内存或其他CPU的缓存加载到本地缓存中——这个加载流程无法跳过。
- 不存在“即发即弃”式写入:x86架构不支持绕开缓存层次的直接内存写入,所有存储操作都必须经过缓存。哪怕是纯写入操作,硬件层面也必须完成缓存行的加载、状态获取后,才能执行写入动作。
- 延迟的实际感知:虽然缓存行加载的流程不可避免,但x86的存储缓冲区(Store Buffer)可以部分隐藏延迟:CPU会先将写入指令放入存储缓冲区,然后异步执行缓存行的加载和状态获取,后续无关指令可以继续推进。不过这只是硬件层面的异步优化,并不意味着不需要等待缓存行加载完成——当存储缓冲区中的写入操作要提交到缓存时,依然要等待缓存行准备就绪。
- 内存序的影响:
memory_order_relaxed仅约束内存可见性的同步规则,不会改变x86底层的缓存行为逻辑——无论使用哪种内存序,存储操作的缓存行加载要求都是一致的。
内容的提问来源于stack exchange,提问作者Kevin Meier
相关产品推荐
相关产品推荐

