我有一个 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写入的数据丢失了。这显然不遵循协议。我的逻辑有什么问题以及如何防止这种废话?