MESI协议(多核CPU的cache内存一致性协议)

MESI协议

MESI是Midified(已修改),Exclusive(独占),Shared(共享),Invalidated(已失效)的缩写,对应Cache Line的四种状态。
多核CPU的cache和内存的构成可以简化为:每个CPU有自己的独有的cache,然后大家共享内存,当每个CPU从cache中读取数据时,如何保证所有cache和内存中数据的一致性,即使MESI协议要解决的问题。

四种状态

【已修改】 即脏标记,表示当前cache line中的数据已经被更新过,没有被写到内存中。【已失效】状态,表示这个cache line里的数据已经失效,是不可以读取的数据。
【独占】和【共享】状态都表示这个cache line中的数据是干净的(即与内存中的数据是一致的,共享同时也表示与其他cpu cache中的数据是一致的)。
【独占】是指当前这份数据只保存在当前cpu cache中,其他cpu cache中没有该数据(或者原本有的这份数据变成了已失效的)。所以这个时候更改独占的数据就可以直接自由写入,不需要通知其他的cpu cache(独占的数据更改写一次后,就会变成已修改的)。
而【独占】状态的数据,如果有其他cpu从内存读取相同的数据到各自的cache,那么这个数据就会变成【共享】状态。
进一步的,【共享】状态代表着相同一份数据在多个 CPU 的 Cache 里都有,所以当我们要更新 Cache 里面的数据的时候,不能直接修改,而是要先向所有的其他 CPU 核心广播一个请求,要求先把其他核心的 Cache 中对应的 Cache Line 标记为【无失效】状态,然后再更新当前 Cache 里面的数据(这时数据的状态就变为独占的,这时也会同时更新内存中的数据,下一次更改独占的数据,就可以直接更改,不急于更新内存的数据)。

状态转换

MESI 协议的四种状态之间的流转过程,可以汇总成下面的表格:


状态流转表.png

其中,本地读写是指当前cpu对于cache line的读写,远程读写是指其他cpu读写相同的数据(对于当前cpu cache line的影响)。

模拟工具

VivioJS MESI help (tcd.ie)
一个可以模拟MESI协议运行过程的网站,可以更好的理解协议的工作过程。
模拟的场景如下图:

MESI协议

主要分为三个部分:

  • 内存:显示的是内存地址和数据
  • CPU 缓存(Cache):显示的是cache line中的变量数据,以及MESI协议的状态信息,空白表示还没有数据。
  • CPU操作:通过点击可以控制每个CPU对于每个数据的读和写操作。
    内存和CPU 缓存之间有三个总线,分别是:
  • 数据总线:在CPU 缓存与内存之间传送需要处理或是需要储存的数据。
  • 地址总线:传送在内存之中储存的数据的地址。
  • shared:这个总线的作用是控制 Cache Line 的MESI状态。
    具体过程大家可以在网站中去操作,很好理解。

你可能感兴趣的:(MESI协议(多核CPU的cache内存一致性协议))