x86 - 为什么MESI协议(protocol)不能保证没有LOCK前缀的x86上CMPXCHG的原子性?

标签 x86 atomic cpu-architecture compare-and-swap mesi

我了解 MESI 协议(protocol)成功地保证了不同内核的内存(缓存) View 相同。我的问题来自这样一个事实,即在编写过程中,MESI 保证缓存由 CPU 独占,然后原子 CMPXCHG 只是原子地比较和交换值。那么,当我们已经获得 MESI 协议(protocol)的保证时,为什么还要使用 LOCK 指令来锁定缓存行呢?

最佳答案

atomic CMPXCHG just compares and exchanges values atomically



不,缓存访问硬件不会将 CMPXCHG 实现为单周期固有原子操作 .它是由多个加载和单独存储的微指令合成的。

如果这就是常规 CMPXCHG 的工作方式,那么您的推理将是正确的。但是常规的 CMPXCHG 不是原子的(对于其他内核上的观察者)。
lock cmpxchg解码为多个微指令,使高速缓存行“锁定”从加载到存储,将其转换为系统中任何其他观察者可以看到的单个原子事务。 (即延迟响应 MESI 无效或共享该行的请求,直到存储提交之后)。它也使它成为一个完整的内存屏障。

没有 lock , CMPXCHG 解码为多个微指令,这些微指令加载、检查是否相等,然后根据比较结果存储或不存储新值。 就原子性而言,它与 add [mem], edx 相同。 ,它使用 ALU 在加载和存储微指令之间进行加法运算。即它不是原子的,除了关于中断的同一个核心(因为中断只能发生在指令边界)。

加载和存储分别是原子的,但它们不是单个原子 RMW 事务。 如果另一个核心使我们的缓存行副本无效并在我们的负载和我们的存储之间存储了一个新值,我们的存储将踩到另一个存储。而另一个存储将出现在我们加载和存储之间的缓存行上的全局操作顺序中,违反了“原子”=不可分割的定义。
  • Can num++ be atomic for 'int num'?为什么add [mem], edx不是原子的,如何 lock努力使其原子化。
  • Is x86 CMPXCHG atomic, if so why does it need LOCK? cmpxchg 的用例没有 lock : 单处理器机器。
  • 关于x86 - 为什么MESI协议(protocol)不能保证没有LOCK前缀的x86上CMPXCHG的原子性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995722/

    相关文章:

    multithreading - 在这种特殊情况下,C++ 11的内存顺序保证是什么?

    x86 - 当 Skylake CPU 错误预测分支时究竟会发生什么?

    c++ - ffmpeg Bmp 到 yuv : Crash at sws_scale

    visual-studio-2010 - Fermi GPU 错误 : identifier "atomicAdd" is undefined under visual studio 2010 & cuda 4. 2

    linux - perl sysopen 可以打开文件进行原子写入吗?

    c++ - 无效异常展开导致的崩溃?

    windows - 检测另一个进程的位数(在 Windows 中)

    multithreading - 多核处理器的关键部分

    MIPS 管道停顿 : SW after LW