我了解到MESI协议可以成功保证不同内核的内存(缓存)视图相同。我的问题来自这样一个事实,即在写入过程中,MESI保证高速缓存由CPU独占,然后原子CMPXCHG只是原子地比较和交换值。那么,为什么已经有了MESI协议的保证,为什么需要使用LOCK指令来锁定高速缓存行呢?
答案 0 :(得分:5)
原子CMPXCHG只是原子地比较和交换值
否,缓存访问硬件不会将CMPXCHG实现为单周期固有原子操作。它是由多个oups合成而成的,这些oups分别加载和存储。
如果这是常规CMPXCHG的工作方式,那么您的推理将是正确的。但是常规CMPXCHG并不是原子的(对于其他内核的观察者而言)。
lock cmpxchg
解码为多个微指令,以使高速缓存行从加载到存储的位置保持“锁定”状态,将其变成单个原子事务,以使系统中的其他任何观察者都可以看到。 (即延迟响应MESI使该行无效或共享该请求,直到存储落实为止)。它还使它成为了完整的内存屏障。
没有lock
的情况下,CMPXCHG解码为多个加载的uops,检查是否相等,然后根据比较结果存储或不存储新值。 就原子性而言,它与add [mem], edx
相同,后者使用ALU在加载和存储操作之间进行加法运算。也就是说,它是不是原子,除了关于中断的同一内核之外(因为中断只能在指令边界发生)。
加载和存储分别是原子原子,但它们不是单个原子RMW事务。如果另一个内核使我们的缓存行副本无效并存储了一个在我们的负载和商店之间建立新的价值后,我们的商店将踏上其他商店。并且该其他存储将在我们的加载和存储之间的缓存行上以全局操作顺序显示,这违反了“原子” =不可分割的定义。
add [mem], edx
不是原子的,以及lock
如何使其原子化。cmpxchg
用例,没有lock
:单处理器机器。