MESI协议 - 如何处理INVALID?

时间:2013-12-17 15:00:59

标签: java multithreading caching processor bus

我正在尝试实现具有两级缓存(回写)的示例MESI缓存模拟器。我已将MESI状态位添加到两个缓存级别。由于它是写回缓存,因此仅在刷新缓存行时才将缓存行更新为L2。我的怀疑是

  1. 当从L1缓存中刷新具有INVALID状态的缓存行时应该是什么行为。它会忽略交易吗?这似乎是唯一的可能性..但它似乎不对。

  2. 考虑处理器1(P1)修改处理器2(P2)共享的高速缓存行。然后P2中的缓存行将获得状态INVALID。如果P2将来必须更新同一个缓存行并且看到状态为INVALID,它应该读取更新的值,如果它在P1中仍处于修改状态(尚未写回L2 /主存储器)?< / p>

  3. 当核心请求不在其高速缓存中的地址时,它会尝试从其他L1高速缓存中检索高速缓存行。如果在另一个缓存中发现它是MODIFIED,它应该在检索之前首先在主存或L2中更新吗?

  4. 所有状态转换都是一次一个地发生的吗?我的意思是当一个进程像队列一样进行时,所有其他缓存写入/读取是否停止?否则,错误的状态转换有很多机会。这不会造成巨大的瓶颈吗?

1 个答案:

答案 0 :(得分:1)

  1. 无效状态意味着那里没有缓存行,数据是垃圾,您可以忽略它。在稳定状态下(当缓存处于暖机状态时),当某条线被某些刷新指令强制输出或被无效的窥探命中时(例如,另一个核心想要修改它),就会发生这种情况。

  2. 与上一节一样 - 一旦该行在P1中失效,它就不再存在了。最新的数据不在P2中并且包括修改 - 该行将接收M状态,表明它由P2拥有并且是脏的。如果P2将来更新该行,它可能会在M中点击它,如果它仍在那里(这意味着它不能在其他任何地方,不需要检查P1),或者它可能已经驱逐了该行到那时,要么将修改转移到L2,要么转移到内存。到那时该行可以在任何地方,所以它需要从L2或内存中取出,如果它可能在那里窥探P1(如果你知道P1没有收到该行,大多数CPU都会实现一个监听过滤器来减少这个监听因为)。

  3. 这是一个设计决定 - 你可以选择直接“转移”M状态,虽然它并不常见且有警告。大多数CPU中的常见解决方案是将线路写回到共享L2(由于它仍未在内存中更新而不能丢失,因此将其赋予M状态),或者(如果L2不包含且线路不是'那里,你没有实现写分配) - 一直写到内存。无论哪种方式,请求核心都可以在该过程中接收更新的行。

  4. 请求通常是缓冲的,因为您必须在处理时将它们保留在某处。但是,它们不必在等待来自内存的响应时排队(它们确实需要排队以提交和解决排序问题和转发情况,但这是由排序/执行逻辑处理而不是作为缓存的一部分)。实际上,缓冲区允许您并行保存多个请求,并以先来先服务的方式等待数据,假设您的执行硬件可以处理(例如,如果您有无序引擎),所以它远非限制因素 - 瓶颈可能来自内存延迟或缺乏足够的缓冲区。 同时更新两行没有固有的问题(尽管如果您正在处理存储并且需要维护内存排序(如顺序一致性或TSO),则交换顺序很糟糕),但通常您会遇到物理限制,例如读取端口或数据的数量总线,只允许您在一定程度上对缓存进行多次访问,并且只有在缓存正确存储的情况下才能访问。 Coherency并不是一个真正的问题,因为它通常在内存单元之前很久就解决了(包括存储到负载的转发,阻塞等)。