0

假设我们有以下情况:2 个 CPU 和写入缓冲区,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(modified) 是否正确?如果不是,让我们走得更远。

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

4

1 回答 1

1

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

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

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

于 2015-04-16T07:03:51.283 回答