对 MESI 诱导的消息写入缓冲区反应

Write buffer reaction on MESI-induced messages

假设我们有以下情况: 2 CPU wtih 写缓冲区和 MESI 用作缓存一致性协议。我们在 CPU 之间有一个共享缓存行:

CPU1个缓存:|I|I|S|I|I|

CPU2缓存:|I|I|S|I|I|

现在CPU1 决定修改共享线路。它将更改记录放入其写入缓冲区并将无效消息发送到 CPU2。 CPU2 收到并发送确认:

CPU1 缓存:|I|I|S|I|I|,CPU1 写入缓冲区:change for the 3rd cache line

CPU2缓存:|I|I|I|I|I|

收到确认后 CPU1 不必刷新写入缓冲区并将缓存行状态更改为 M(已修改)是否正确?如果不是,让我们走得更远。

假设现在CPU2 想再次读取这个缓存行。 snooping CPU1 是否应该拦截此读取请求,并且 flush buffer->flush cache line->send the last value of the cache line to CPU2?或者它可能会忽略它并且 CPU2 通过询问 RAM(尚未更改)仍然具有旧值?

在标准的MESI协议中,没有对无效交易的确认。在您的示例中,缓存行在 CPU1 中转换为 M 状态,写入从写入缓冲区中退出。

当 CPU2 进行读取时,CPU1 将修改后的行写入内存。 CPU2 可以从 CPU1 或内存中获取值(仅在 CPU1 的写入完成后)。需要写入内存,因为没有 O(拥有)状态。

Dragon protocol 这样的协议确实使用信号来指示缓存行是否共享。