内存上的原子操作不需要直接在 RAM 上执行,因为只要满足以下条件,它们就可以在缓存中执行:所有观察者都将它们视为原子。内核之间缓存的一致性确保了 DMA 操作也遵循这种原子性。
对于最多 64 位的对齐加载或存储,原子性为当操作在系统的数据路径(包括内核、内存和 PCIe 之间)内完成时,实现了“免费”。这意味着 CPU 硬件可以保证操作的原子性,无需任何额外的硬件或阻塞其他请求。
修改L1 缓存原子性足以实现原子性,因为任何其他核心或 DMA 访问都将观察到单个操作的变化。由于无序执行,此修改可能会晚于初始存储发生。
除了性能优化之外,跨缓存行边界访问数据可能导致非原子行为。在 x86 上,最多 8 字节的对齐访问是原子的,这意味着即使数据路径较窄,整个缓存行(通常为 64B)也会以原子方式传输。然而,更广泛的访问需要锁来防止并发访问。
原子读-修改-写操作带来了更大的挑战。为了保持原子性,核心必须将缓存行维持在已修改状态,并在操作进行时阻止外部修改。对于未对齐的操作,可能需要总线锁以确保其他核心以原子方式观察到更改。
以上是x86 架构上如何保证加载和存储的原子性?的详细内容。更多信息请关注PHP中文网其他相关文章!