MESI(Modified Exclusive Shared Or Invalid)也称伊利诺斯协议(伊利诺斯州立大学提出),是一种广泛使用的支持写回策略的缓存一致性协议。Intel使用的协议。还有MSI,MOSI,FireFly等协议。
MESI协议中的状态
CPU中每个缓存行使用四种状态标记(2bit)
M: 被修改(Modified)。内容已不同于主存并且为此cache专有;
E: 独享的(Exclusive)。此cache行内容同于主存,但不出现于其它cache中;
S:共享的(Shared)。此cache行内容同于主存,但也出现于其它cache中;
I:无效的(Invalid)。此cache行内容无效。
当前状态为M:
Local Read 从cache中取数据,
状态不变
Local Write 修改cache中数据,
状态不变
注:本身就是M,不论是否对数据修改,这个cache line 始终处于被改变状态。Remote Read 先将数据写入内存,由于需要让其他核能拿到最新数据,
状态-->S
Remote Write 先将这条数据写入内存,由于之后其他Core会修改这条数据,
状态-->I
当前状态为E:
- Local Read 从cache中取数据,
状态不变
- Local Write 修改cache中数据,
状态-->M
- Remote Read 由于需要让其他核能拿到数据,
状态-->S
- Remote Write 数据被修改,本缓存行不能再使用,
状态-->I
当前状态为S:
Local Read 从cache中取数据,
状态不变
Local Write 修改cache中数据,在本CPU中
状态-->M
,在其他核共享的Cache line状态-->I
注:Local Write后,其他共享核在使用这个cache line前需要重新从内存中读取。Remote Read 已经处于共享态了,所以
状态不变
Remote Write 数据被修改,本cache line不能再使用,
状态-->I
当前状态为I:
- Local Read
如果其他Cache没有这份数据,本cache从该内存中读出数据,状态-->E
如果其他Cache有这份数据,状态为M,则将数据更新到内存,本Cache再从内存中读取数据,两个cache的cache line状态-->S
;
如果其他Cache有这份数据,状态为S或E,本cache从内存中取出数据,这些cache的cache line状态-->S
- Local Write 从内存中取数据,在Cache中修改,
状态-->M
。如果其他Cache有这份数据,它们的cache line状态-->I
;如果其他Cache有这份数据,切状态为M,要先将数据更新到内存。 - Remote Read 因为是Invalid,别的核操作与它无关
- Remote Write 因为是Invalid,别的核操作与它无关