MESI和MOESI Cache一致性协议

Cache简介

Cache是处理器结构中重要的组成部分,特别是现代处理器基本上都是采用冯诺依曼架构中存储程序的概念,CPU需要先从存储器中取到对应的指令和数据之后,才能执行指令。但是从存储器(一般是DDR)中取数据这个操作相对于CPU的工作频率来说,延迟很大。这时候cache的作用就体现出来了,cache在数据通路上位于存储器和CPU之间,数据和指令先从DDR中取出来,缓存到cache中,CPU再从cache中取。因为cache靠近CPU摆放,并且cache一般都是SRAM结构,访问速度快,所以CPU访问cache相比访问存储器,快很多。

现代处理器中,一般是多级cache结构,并且第一级cache是每个CPU核私有的,为了区分指令和数据,第一级cache又分成指令cache和数据cache,指令cache专门存放指令,数据cache存放指令执行需要的数据。第二级cache可能是私有的,也可能是多个core共享的。当然也可以设计三级cache。

对于每个CPU的私有cache来说,可能存储器中的某段数据,在多个CPU cache中都有备份,当存在这种情况的时候,要保证每一个CPU拿到的数据备份是存储器中最新的数据。如果一个CPU修改了共享数据,其他CPU要知道。这就是cache一致性。

MESI协议

MESI协议是处理多个CPU之间cache一致性常用的协议,该协议中有四个状态位来描述每一个cache行:

  1. M(modified)位。M位为1表示当前cache有效,当前cache行中的数据跟处理其中的不一样,并且只有当前cache保存这个cache行数据,其他cache没有该副本。当对这个cache进行替换的时候,不要现将cache行中的数据协会到存储器中。
  2. E(exclusive)位。E位为1表示当前cache行有效,只在该cache中有副本,其他cache中没有该cache行副本。该cache行内容跟存储器中的一样。
  3. S(shared)位。S位为1表示当前cache行有效,cache行内容跟存储器一样,但有两个或者两个以上的cache有该cache行副本。
  4. I(invalid)位。I位为1表示当前cache行没有有效数据,或者cache行没有使能。

MOESI协议

MOESI协议引入O(owned)位,并且S位的含义跟MESI协议不一样:

  1. O(owned)位。当存在O位为1 的cache行的时候,该cache行数据一定在多个cache有副本,并且cache行中的内容跟存储器的内容不一样,各个cache行副本中的内容是一样的。
  2. S(shared)位,S位为1表示该cache行在多个cache中存在副本,但是cache行内容是否跟存储器内容一样要视情况而定,如果该cache行存在O位为1的副本,那么cache行内容跟存储器内容不同,如果不存在O位为1的副本,cache行内容跟存储器内容一致。

MOESI状态图

MOESI状态图如下所示,这两个图的内容是一样的,一个是我自己画的,一个是拍的书上的。

Read/Write : CPU向自己的cache发起读写操作

Probe Read:cache收到其他CPU的读数据请求,读数据是为了读操作。

Probe Write:cache收到其他CPU的读数据请求,读数据是为了写操作。都是读数据请求。

自己画的MOESI状态图

书里面MOESI状态图

MOESI协议,存储器写,cache命中

写命中的时候,cache行的状态可能是M, O, E, S四种:

  • 为M和E时候,直接将数据写入cache行,cache行的状态变为M。
  • 为S时候,直接将数据写入cache行,cache行状态改为M,并且其他cache中保存该副本的cache行,从S或O改为I。
  • 为O时候,直接将数据写入cache行,cache行状态改为M,并且其他cache中保存该副本的cache行,从S改为I。

MOESI协议,存储写,cache未命中

如果CPU A对存储器的写操作没有在本地cache中命中,而是在其他CPU,比如CPU B中命中,那么CPU B 中该cache行的状态可能是M, O, E, S四种:

  • 当为M时候,CPU B将cache 行数据写会存储器,当且将cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。

  • 当为O时候,CPU B将将cache 行数据写回存储器,当且将该cache行和其他保存该副本的cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。

  • 当为E时候,CPU B中cache行状态改为I,CPU A从存储器中取数据,并在本地cache申请一个cache行保存数据,cache行状态为M。

  • 当为S时候,将CPU B中该cache行和其他cache中保存该副本的cache行状态改为I,CPU A从存储器中取数据,保存在本地cache行中,状态为M。

MOESI协议,存储器读,cache命中

如果CPU在本地cache中命中,那么直接从本地cache中读取。

MOESI协议,存储器读,cache未命中

如果CPU A没有在本地cache中命中,而是在CPU B cache中命中,CPU B cache行状态可以是M, O, E, S:

  • 为M时候,CPU B cache行状态改为O,CPU B将数据传给CPU A新申请的cache行中。CPU B不需要将数据写会存储器。这是MOESI比MESI最大的优点,提高了cache利用率。
  • 为O时候,CPU B cache状态不变,CPU B将数据传给CPU A新申请的cache行中。
  • 为E时候,CPU B cache行状态变为S,CPU B将数据传给CPU A新申请的cache行中。
  • 为S时候,CPU B cache状态不变,CPU B将数据传给CPU A新申请的cache行中。

MOESI协议优点

MOESI协议相比于MESI协议的优点是,当在其他CPU cache中发生Read hit时候,不需要将数据写回存储器,而是将数据从一个CPU直接传到另一个CPU,提高了cache利用率。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!