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行:
- M(modified)位。M位为1表示当前cache有效,当前cache行中的数据跟处理其中的不一样,并且只有当前cache保存这个cache行数据,其他cache没有该副本。当对这个cache进行替换的时候,不要现将cache行中的数据协会到存储器中。
- E(exclusive)位。E位为1表示当前cache行有效,只在该cache中有副本,其他cache中没有该cache行副本。该cache行内容跟存储器中的一样。
- S(shared)位。S位为1表示当前cache行有效,cache行内容跟存储器一样,但有两个或者两个以上的cache有该cache行副本。
- I(invalid)位。I位为1表示当前cache行没有有效数据,或者cache行没有使能。
MOESI协议
MOESI协议引入O(owned)位,并且S位的含义跟MESI协议不一样:
- O(owned)位。当存在O位为1 的cache行的时候,该cache行数据一定在多个cache有副本,并且cache行中的内容跟存储器的内容不一样,各个cache行副本中的内容是一样的。
- 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协议,存储器写,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 协议 ,转载请注明出处!