首页 >后端开发 >C++ >x86 架构上如何保证加载和存储的原子性?

x86 架构上如何保证加载和存储的原子性?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-21 13:58:14336浏览

How is Atomicity of Loads and Stores Guaranteed on x86 Architectures?

x86 上加载和存储的原子性

内存上的原子操作不需要直接在 RAM 上执行,因为只要满足以下条件,它们就可以在缓存中执行:所有观察者都将它们视为原子。内核之间缓存的一致性确保了 DMA 操作也遵循这种原子性。

原子性的实现

对于最多 64 位的对齐加载或存储,原子性为当操作在系统的数据路径(包括内核、内存和 PCIe 之间)内完成时,实现了“免费”。这意味着 CPU 硬件可以保证操作的原子性,无需任何额外的硬件或阻塞其他请求。

Cache 中的原子操作

修改L1 缓存原子性足以实现原子性,因为任何其他核心或 DMA 访问都将观察到单个操作的变化。由于无序执行,此修改可能会晚于初始存储发生。

未对齐访问

除了性能优化之外,跨缓存行边界访问数据可能导致非原子行为。在 x86 上,最多 8 字节的对齐访问是原子的,这意味着即使数据路径较窄,整个缓存行(通常为 64B)也会以原子方式传输。然而,更广泛的访问需要锁来防止并发访问。

原子读-修改-写

原子读-修改-写操作带来了更大的挑战。为了保持原子性,核心必须将缓存行维持在已修改状态,并在操作进行时阻止外部修改。对于未对齐的操作,可能需要总线锁以确保其他核心以原子方式观察到更改。

以上是x86 架构上如何保证加载和存储的原子性?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn