Skip to main content

27 MESI协议

缓存一致性问题​

需要有一种机制,同步两个不同核心里面的缓存数据:

  1. 写传播(Write Propagation):在一个 CPU 核心里,Cache 数据更新必须能够传播到其他的对应节点的 Cache Line 里。
  2. 事务的串行化(Transaction Serialization):在一个 CPU 核心里面的读取和写入,在其他的节点看起来顺序是一样的。

实现该机制的要点:

  1. 一个 CPU 核心对于数据的操作,需要同步通信给到其他 CPU 核心。
  2. 如果两个 CPU 核心里有同一个数据的 Cache,对这个 Cache 数据的更新需要有一个锁的概念。

总线嗅探机制和 MESI 协议​

总线嗅探(Bus Snooping)​

把所有的读写请求都通过总线(Bus)广播给所有的 CPU 核心,然后让各个核心去嗅探这些请求,再根据本地的情况进行响应。

写失效(Write Invalidate)​

只有一个 CPU 核心负责写入数据,其他的核心只是同步读取到这个写入。在这个 CPU 核心写入 Cache 之后,它会去广播一个失效请求告诉所有其他的 CPU 核心。其他的 CPU 核心,只是去判断自己是否也有一个失效版本的 Cache Block,然后把这个也标记成失效的。

写广播(Write Broadcast)​

一个写入请求广播到所有的 CPU 核心,同时更新各个核心里的 Cache。

写失效写广播

MESI 协议​

对 Cache Line 有四个不同的标记:

  1. M:代表已修改(Modified)

Cache Block 里面的内容我们已经更新过了,但是还没有写回到主内存里面。

  1. E:代表独占(Exclusive)

独占状态下,对应的 Cache Line 只加载到了当前 CPU 核所拥有的 Cache 里。其他的 CPU 核并没有加载对应的数据到自己的 Cache 里。这时如果要向独占的 Cache Block 写入数据,可以自由地写入数据,而不需要告知其他 CPU 核。

  1. S:代表共享(Shared)

在独占状态下的数据,如果收到了一个来自于总线的读取对应缓存的请求,它就会变成共享状态。这时另外一个 CPU 核心,也把对应的 Cache Block,从内存里面加载到了自己的 Cache 里来。

当我们想要更新 Cache 里面的数据的时候,不能直接修改,而是要先向所有的其他 CPU 核心广播一个请求,要求先把其他 CPU 核心里面的 Cache,都变成无效的状态,然后再更新当前 Cache 里面的数据。

  1. I:代表已失效(Invalidated)

这个 Cache Block 里面的数据已经失效了,不可以相信这个 Cache Block 里面的数据。

加载中...