x86 上加载和存储的原子性
尽管 std::atomic 中的内存操作仅依赖于总线锁定,但原子操作的印象实际上是在缓存中执行的。
缓存一致性
缓存一致性可确保所有内核具有一致的内存视图。缓存行以原子块的形式在核心和内存之间传输。这允许原子操作在缓存内发生,而不依赖于外部总线锁定。
对齐操作
保证最多 64 位的对齐加载和存储操作x86 处理器上的原子。这是因为对齐的访问可以通过足够宽以容纳整个操作的数据路径进行传输。
未对齐的操作
未对齐的加载和存储可以成为非原子的,因为它们可能需要多次访问才能完成。例如,跨越缓存行边界的加载或存储必须在两个单独的访问中执行,使其成为非原子的。
原子读-修改-写操作
原子读-修改-写操作,例如lock add [mem]、eax,实现起来比简单的加载或存储更复杂。这些操作要求核心将受影响的缓存行保持在修改状态,并防止任何外部修改,直到操作完成。未对齐的读取-修改-写入操作可能需要断言 LOCK# 信号来锁定总线并防止其他内核访问受影响的内存。
编译器优化
编译器可能通过省略 mfence 指令来优化 seq_cst 加载,因为 x86 内存排序会阻止 LoadLoad 和 LoadStore 重新排序。然而,seq_cst 存储仍然需要栅栏来防止 StoreLoad 重新排序。
总之,x86 处理器上的原子性是通过缓存一致性、对齐操作和未对齐读-修改-写操作的总线锁定的组合来实现的。这使得原子操作能够高效地进行,并且不会影响整体系统性能。
以上是x86 加载和存储是原子的吗?的详细内容。更多信息请关注PHP中文网其他相关文章!