此question的扩展名。计算机体系结构如何围绕两个线程同时写入到映射在物理内存中非常接近的缓存行的工作?似乎存在竞争的情况,其中两个线程在完全相同的时钟周期向同一高速缓存行发出写操作。双方都可以成功写入,然后才能将另一个缓存的行标记为过时吗?如何解决此问题以使其在功能上是正确的?
答案 0 :(得分:2)
您应该研究诸如MESI及其扩展名MOESI和MESIF之类的缓存一致性协议。
在这些协议中,每个高速缓存行本质上都是一个状态机,它根据自己的处理器正在执行的操作以及在总线上监听的消息从一个状态转换到下一个状态。高速缓存控制器监视内存总线事务并相应地更新高速缓存行的状态,因此命名为“史努比高速缓存”。
在MESI中,缓存行可以具有四个状态:已修改,独占,共享和无效。< / p>
我们可以遍历您的示例,其中两个内核要写入同一高速缓存行,并从非常高级的角度查看为什么该协议不会导致错误的结果。
假设两个内核都从没有缓存行开始,并且在修改它之前先读取了缓存行。
1)核心1想要读取缓存行,因此它广播 BusRd ,从内存中接收缓存行并转换为 Exclusive 。
2)核心2还希望读取缓存行,以便广播 BusRd 。核心1在 FlushOpt 中以缓存行进行响应,并且两个核心都转换为 Shared 。
3)核心1要写入高速缓存行,因此它广播 BusUpgr 并过渡到 Modified 。 Core 2看到 BusUpgr 并转换为 Invalid 。
4)Core 2想要写入高速缓存行,但是它是无效,因此它发出 BusRdX 并过渡到 Modified 。内核1侦听 BusRdX 并广播 Flush ,然后转换为 Invalid 。内核2和内存控制器会观察 Flush ,该控制器会将值写回内存。
由于一个内核上的写入操作会使其他内核上的缓存行副本无效,因此必须使用最新值重新获取缓存行。因此,没有比赛条件。 :)