MESI 协议 - 在原子操作期间保持缓存行处于独占模式的原因

问题描述

我正在阅读有关缓存一致性的 MESI 协议的一些内容。我已经读过 x86-64 中的原子操作,例如 XCHG 以独占模式获取缓存行。

但根据协议,如果另一个内核读取或写入该缓存线中的内存位置,则该缓存线可以转换为共享或无效状态。那么这会在内核执行原子操作时发生吗?以及如何预防?

解决方法

拥有该行的 CPU 内核只是选择不处理和响应共享或使该行无效的请求,直到原子 RMW 操作完成。

现代 CPU 中的详细机制可能基于微码:xchg [mem],reg 的一个 uops 可能执行一种特殊类型的加载,“锁定”该缓存行(一旦它在该内核中独占,如果它还没有),最后一个 uops 做了一种特殊的存储,也可以“解锁”它,因为这种内部锁定机制只能由微码使用。

(将其打开到单独的 x86 指令锁定和解锁会产生系统死锁的可能性。将其置于一条指令的微代码内部可以确保最大锁定保持时间非常低,并且不会被一个中断。)

相关:我在 Can num++ be atomic for 'int num'?

上写了一个关于 x86 原子 RMW 操作的更一般的答案 ,

除了 MESI 状态之外,所有 (?) 缓存一致性协议都具有在 MESI 状态之间发生转换时使用的“瞬态”状态。例如,当缓存请求从 S 到 M 的转换时,请求缓存必须等到所有其他缓存(或等效目录)确认它们已使缓存行无效,然后才能授予 M 状态。在此间隔期间,必须推迟引用临时缓存行的其他事务——否则缓存将永远无法在其他内核正在读取的缓存行上完成“升级”事务。原子操作需要对同一行进行读取和更新,而不允许任何其他代理在事务中间进行操作。或许实现这一点的最直接的方法是在读+写事务期间扩展一个或多个瞬态以“保护”缓存行。