MESI 协议 - 在原子操作期间保持高速缓存行处于独占模式的原因
MESI protocol - what keeps cache line in exclusive mode during atomic operations
我正在阅读一些关于缓存一致性的 MESI 协议。我读过 x86-64 中的原子操作(例如 XCHG)以独占模式获取缓存行。
但是根据协议,如果另一个核心读取或写入该缓存行中的内存位置,则缓存行可以转换为共享或无效状态。那么当核心执行原子操作时会发生这种情况吗?它是如何预防的?
拥有该行的 CPU 核心只是选择在原子 RMW 操作完成之前不处理和响应共享或使该行无效的请求。
现代 CPUs 中的详细机制可能基于微代码:xchg [mem], reg
的一个 uops 可能会执行一种特殊类型的加载,“锁定”该缓存行(一旦它被独占如果它还没有的话,在这个核心 L1d 中拥有),最后的一个微指令做了一种特殊的存储,它也“解锁”它,因为这种内部锁定机制只能由微代码使用。
(将x86指令的锁定和解锁分开,可能会造成系统死锁。将其置于一条指令的微码内部可以确保最大锁定时间非常短且不会被破坏中断。)
相关:我在
上写了一个关于 x86 原子 RMW 操作的更一般的答案
除了 MESI 状态之外,所有(?)缓存一致性协议都具有“瞬态”状态,这些状态在 MESI 状态之间发生转换时使用。例如,当缓存请求 S 到 M 转换时,请求缓存必须等到所有其他缓存(或等效目录)确认它们已使缓存行无效,然后才能授予 M 状态。在此间隔期间,必须推迟引用瞬态缓存行的其他事务——否则缓存将永远无法在其他内核正在读取的缓存行上完成“升级”事务。原子操作需要对同一行进行读取和更新,而不允许任何其他代理在事务中间进行操作。也许最直接的实现方式是扩展一个或多个瞬态以在读+写事务期间“保护”缓存行。
我正在阅读一些关于缓存一致性的 MESI 协议。我读过 x86-64 中的原子操作(例如 XCHG)以独占模式获取缓存行。
但是根据协议,如果另一个核心读取或写入该缓存行中的内存位置,则缓存行可以转换为共享或无效状态。那么当核心执行原子操作时会发生这种情况吗?它是如何预防的?
拥有该行的 CPU 核心只是选择在原子 RMW 操作完成之前不处理和响应共享或使该行无效的请求。
现代 CPUs 中的详细机制可能基于微代码:xchg [mem], reg
的一个 uops 可能会执行一种特殊类型的加载,“锁定”该缓存行(一旦它被独占如果它还没有的话,在这个核心 L1d 中拥有),最后的一个微指令做了一种特殊的存储,它也“解锁”它,因为这种内部锁定机制只能由微代码使用。
(将x86指令的锁定和解锁分开,可能会造成系统死锁。将其置于一条指令的微码内部可以确保最大锁定时间非常短且不会被破坏中断。)
相关:我在
除了 MESI 状态之外,所有(?)缓存一致性协议都具有“瞬态”状态,这些状态在 MESI 状态之间发生转换时使用。例如,当缓存请求 S 到 M 转换时,请求缓存必须等到所有其他缓存(或等效目录)确认它们已使缓存行无效,然后才能授予 M 状态。在此间隔期间,必须推迟引用瞬态缓存行的其他事务——否则缓存将永远无法在其他内核正在读取的缓存行上完成“升级”事务。原子操作需要对同一行进行读取和更新,而不允许任何其他代理在事务中间进行操作。也许最直接的实现方式是扩展一个或多个瞬态以在读+写事务期间“保护”缓存行。