一、MESI 协议中的 writeback 消息从何处来,又到何处去?
writeback 消息来自特定的 CPU,或在某些设计中来自特定的 CPU cache,甚至来自可能被多个 CPU 共享的 cache。关键在于,给定的 cache 没有空间容纳指定的数据项,因此必须从此 cache 中淘汰其他数据腾出空间。如果此 cache 中有数据在其他 cache 或内存中有副本,则可直接丢弃该数据,无需 writeback 信息。
另一方面,如果可能被淘汰的每一条数据都被修改过,那就意味着存放在此 cache 中的数据是最新有效的,而且独此一份,所以必须被复制到其他地方。这种复制操作是通过 writeback 消息进行的。
writeback 消息的目的地必须是能存储数据新值的地方。这可能是主内存,也可能是其他 cache。如果是 cache,通常是同一 CPU 的更高级别 cache。例如,L1 cache 可能会 writeback 到 L2 cache。不过,有些硬件设计允许跨 CPU writeback,因此 CPU0 的 cache 可能会向 CPU1 发送 writeback 消息。通常情况下,这只有在 CPU1 以某种方式表达出对这份数据有兴趣时才会发生,例如,CPU1 最近发出过读请求。
简而言之,writeback 消息是从系统中空间不足的某些部分发出的,然后由系统中可以容纳这些数据的其他部分接收。
二、如果两个 CPU 同时尝试去 invalidate 相同的 cache line 会发生什么?
其中一个 CPU 先访问共享总线,该 CPU 胜出。另一个 CPU 必须 invalidate 自己的 cache line 副本,并向另一个 CPU 发送 invalidate acknowledge 消息。
当然,败者 CPU 可能会立即发起 read invalidate 事务,因此胜者 CPU 的胜利只是昙花一现。
三、当大型多处理器中出现一个 invalidate 消息时,每个 CPU 都必须给以 invalidate acknowledge 响应。由此产生的 invalidate acknowledge 响应风暴难道不会使系统总线完全饱和吗?
如果大型多处理器确实是这样实现的,那就有可能。大型多处理器,尤其是 NUMA 机器,往往使用所谓的 directory-based 的 cache-coherence 协议,以避免上述问题和其他问题。
四、如果 SMP 机器真的使用消息传递,那又何必使用 SMP 呢?
在过去的几十年里,关于这个话题的争议相当多。一方观点是,cache-coherence 协议非常简单,因此可以直接在硬件中实现,从而获得软件消息传递无法达到的带宽和延迟。另一方观点是,真正的真相在于大型 SMP 机器和小型 SMP 机器集群的相对价格。第三种观点是,SMP 编程模型比分布式系统的编程模型更容易使用。但反驳者可能会拿 HPC 集群和 MPI 的出现说事,因此争论还在继续。
本文为系列文章,未完待续。。。