【多线程】MESI--CPU缓存一致问题

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,别的核操作与它无关