1

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

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

4

2 回答 2

2

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

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

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

相关:我写了一个关于 x86 atomic RMW operations on Can num++ be atomic for 'int num' 的更一般的答案?

于 2021-07-24T06:42:42.403 回答
1

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

于 2021-08-02T03:14:22.423 回答