我正在阅读一些关于高速缓存一致性的MESI协议的内容。我已经读取了x86-64中原子操作,例如XCHG在独占模式下访问缓存线。
但是根据该协议,如果另一个内核对该高速缓存线中的存储器位置进行读取或写入,则该高速缓存线可以转变为共享或无效状态。那么,当内核执行原子操作时,这种情况会发生吗?它是如何预防的?
发布于 2021-07-24 14:42:42
拥有该行的CPU核心简单地选择在原子RMW操作完成之前不处理和响应共享或使该行无效的请求。
现代CPU中的详细机制可能是基于微码的:xchg [mem], reg的一个uop可能会执行一种特殊类型的加载,“锁定”该缓存行(一旦它被这个核心L1d独占,如果它还不是),而最后一个uop执行一种特殊类型的存储,它也会“解锁”它,用于这种仅由微码使用的内部锁定机制。
(打开它以分离x86指令锁定和解锁将会造成系统死锁的可能性。将其设置为指令的微代码内部可以确保最大锁保持时间非常低,并且不会被中断所破坏。)
相关:我写了一个关于Can num++ be atomic for 'int num'?上的x86原子RMW操作的更一般的答案
发布于 2021-08-02 03:14:22
除了MESI状态外,所有的(?)高速缓存一致性协议具有在MESI状态之间发生转换时使用的“瞬态”状态。例如,当高速缓存请求S到M转换时,请求高速缓存必须等待,直到所有其它高速缓存(或等效目录)确认它们已使高速缓存线无效,才能准予M状态。在此间隔期间,必须延迟引用临时高速缓存线的其他事务--否则高速缓存将永远不能在其他内核正在读取的高速缓存线上完成“升级”事务。原子操作需要对同一行进行读取和更新,而不允许任何其他代理在事务中间操作。也许实现这一点的最直接方法是在read+write事务期间扩展一个或多个瞬时状态以“保护”高速缓存线。
https://stackoverflow.com/questions/68507443
复制相似问题