0

我有一个 MESI 协议问题。假设我有两个核心(核心 1 和 2),每个核心都有自己的二级缓存。当两个内核具有相同的数据并且缓存线处于状态 S 时,这意味着它们都具有干净且相同的数据。在 t=0 时,核心 1 写入缓存行,核心 1 将切换到 M(已修改),核心 2 最终将处于 I(无效)状态。在物理世界中,此交易需要时间才能完成。假设缓存 2 需要 5 秒才能知道缓存 1 更新了缓存行。

假设在 t=2 时,核心 2 写入相同的缓存行并切换到 M 状态。来自核心 2 的写入操作将在 t=7 (2+5) 时通知核心 1。然后核心 2 需要在 t=5 时使缓存 2 无效,而核心 1 在 t=7 时使该行无效。现在两条线都失效了,核心1和核心2写入的数据丢失了。这显然不遵循协议。我的逻辑有什么问题以及如何防止这种废话?

4

1 回答 1

1

两个核心必须相互同意才能更新。您可以通过 snoopy 或基于目录的协议来执行此操作。因此,在您的示例中,缓存无法更改其状态,而是请求更改。然后赢得仲裁的一方将更改为已修改,而另一方则无效。

这些幻灯片似乎总结得很好。您想查看幻灯片 20 之后的 snoopy 协议作为示例。

于 2019-02-14T23:04:09.183 回答