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