MESI协议:多核CPU是如何同步高速缓存的

193 阅读2分钟

从缓存和内存的更新关系看,写策略分为写回和写直达;

  • 写回,对缓存的修改不会立刻传播到主存,只有当缓存块被替换时,这些被修改的缓存块,才会写回并覆盖内存中过时的数据;
  • 写直达,缓存中任何一个字节的修改,都会立刻传播到内存

从写缓存时 CPU 之间的更新策略来看,写策略分为写更新和写无效;

  • 写更新策略,每次它的缓存写入新的值,该 CPU 都必须发起一次总线请求,通知其他 CPU 将它们的缓存值更新为刚写入的值。

  • 写无效,如果在一个 CPU 修改缓存时,将其他 CPU 中的缓存全部设置为无效。

从写缓存时数据是否被加载来看,写策略又分为写分配和写不分配。

  • 写分配,在写入数据前将数据读入缓存
  • 写不分配,在写入数据时,直接将要写入的数据传播内存,而并不将数据块读入缓存

MESI

缓存块的状态分为 4 种,也是 MESI 协议名字的由来:

  1. Modified(M):缓存块有效,但是是“脏”的,其数据与主存中的原始数据不同,同时还表示处理器对于该缓存块的唯一所有权,表示数据只在这个处理器的缓存上是有效的;
  2. Exclusive(E):缓存块是干净有效且唯一的;
  3. Shared(S):缓存块是有效且干净的,有多个处理器持有相同的缓存副本;
  4. Invalid(I):缓存块无效。

image.png

处理器对缓存的请求:

  • PrRd:处理器请求从缓存块中读出;
  • PrWr:处理器请求向缓存块写入。

总线对缓存的请求,分别是:

  • BusRd:总线侦听到一个来自另一个处理器的读出缓存请求;
  • BusRdX:总线侦听到来自另一个尚未取得该缓存块所有权的处理器读独占(或者写)缓存的请求;
  • BusUpgr:侦听到一个其他处理器要写入本地缓存块上的数据的请求;
  • Flush:总线侦听到一个缓存块被另一个处理器写回到主存的请求;
  • FlushOpt:侦听到一个缓存块被放置在总线以提供给另一个处理器的请求,和 Flush 类似,但只不过是从缓存到缓存的传输请求。

MESI 协议通过引入了 Modified 和 Exclusive 两种状态,并且引入了处理器缓存之间可以相互同步的机制,非常有效地降低了 CPU 核间带宽。它是当前设计中进行 CPU 核间通讯的主流协议,被广泛地使用在各种 CPU 中。


此文章为7月Day15学习笔记,内容来源于极客时间《编程高手必学的内存知识》