首页 > 代码库 > MESI协议

MESI协议

目录(?)[-]

  1. Cache的写策略
    1. 1Write through写通
    2. 2 Write back写回
  2. Cache一致性
    1. 1一致性问题的产生-信息不对称导致的问题
    2. 2Cache一致性的底层操作
    3. 3 Cache一致性协议

 

 

 

 

 

 

1.Cache的写策略:

1)Write through(写通)

每次CPU修改了cache中的内容,Cache立即更新内存的内容

2) Write back(写回)

内核修改cache的内容后,cache并不会立即更新内存中的内容,而是等到这个cache line因为某种原因需要从

cache中移除时,cache才会更新内存中的内容。

 

Write through(写通)由于有大量的访问内存的操作,效率太低,大多数处理器都使用Writeback(写回)策略。

Cache如何知道这行有没有被修改?需要一个标志-dirty标志。Dirty标志为1,表示cache的内容被修改,和内存的

内容不一致,当该cache line被移除时,数据需要被更新到内存,dirty标志位0(称为clean),表示cache的内容

和内存的内容一致。


有dirty标志的cache结构:

技术分享

程序cache不会被修改,不需要dirty标志,数据cache需要dirty标志。

 

2.Cache一致性

1)一致性问题的产生-信息不对称导致的问题

在多核处理器中,内存中有一个数据x,值为3,被缓存到core0和core1中,如果core0将x修改为5,而core1

不知道x被修改,还在使用旧事,就会导致程序出错,这就是cache的不一致。

2)Cache一致性的底层操作

为了保证cache的一致性,处理器提供了两个保证cache一致性的底层操作:Writeinvalidate和Write update。

Write invalidate(置无效):当一个内核修改了一份数据,其他内核上如果有这份数据的复制,就置成无效。


技术分享

Write update(写更新):当一个内核修改了一份数据,其他地方如果有这份数据的复制,就都更新到最新值。

技术分享

 

Write invalidate是一种简单的方式,不需要更新数据,如果core1和core2以后不再使用变量x,这时候采用

write invalidate就非常有效,不过由于一个valid标志对应一个Cache line,将valid标志置成invalid后,这个

cache line中其他的有效的数据也不能使用了。Write upodate策略会产生大量的数据更新操作,不过只用更

新修改的数据,如果core1和core2会使用变量x,那么writeupdate就比较有效。由于Writeinvalidate简单,

大多数处理器都是用Writeinvalidate策略。

 

3) Cache一致性协议

在MESI协议中,每个Cacheline有4个状态,可用两个bit表示,它们分别是:

状态

描述

M(Modified)

这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本cache中

E(Exclusive)

这行数据有效,数据和内存中的数据一致,数据只存在于本cache中。

S(Shared)

这行数据有效,数据和内存中的数据一致,数据存在于很多cache中

I(Invalid)

这行数据无效

 

E状态(独占):

技术分享



S状态(共享):

技术分享


M状态和I状态:

技术分享


MESI协议状态迁移图:

技术分享


Local Read表示本内核读本Cache的值,Local Write表示本内核写Cache中的值,Remote Read表示其他内核

读其他Cache中的值,Remote write 表示其他内核写其他Cache的值,箭头表示本Cache line状态的迁移,唤

醒箭头表示状态不变。

 

MESI状态之间的迁移过程如下:

当前状态

事件

行为

下一个状态

I(Invalid)

Local Read

如果其他Cache没有这份数据,本Cache从该内存中取数据,Cache line状态变成E;

如果其他Cache有这份数据,且状态为M,则将数据更新到内存,本Cache再从内存中取数据,两个Cache的Cache line状态都变成S;

如果其他Cache有这份数据,且状态为S或者E,本Cache从内存中取数据,这些Cache的Cache line状态都变成S。

E/S

Local Write

从内存中取数据,在Cache中修改,状态变成M;如果其他Cache有这份数据,切状态为M,则要先将数据更新到内存;

如果其他Cache有这份数据,则其他Cache的Cache line状态变成1

M

Remote Read

既然是invalid,别的核的操作与它无关

I

Remote Write

既然是invalid,别的核的操作与它无关

I

E(Exclusive)

Local Read

从Cache中取数据,状态不变

E

Local Write

修改Cache的数据,状态为M

M

Remote Read

数据和其他核共用,状态变成了S

S

Remote Write

数据被修改,本Cache line不能再使用,状态变成I

I

S(Shared)

Local Read

从Cache中取数据,状态不变

S

Local Write

修改Cache中的数据,状态变成M,其他核共享的Cache line状态变成I

M

Remote Read

状态不变

S

Remote Write

数据被修改,本Cache line不能再使用,状态变成I

I

M(Modified)

Local Read

从Cache中取数据,状态不变

M

Local Write

修改Cache中的数据,状态不变

M

Remote Read

这行数据被写到内存中,使其他核能使用到最新的数据,状态变成S

S

Remote Write

这行数据被写到内存中,使其他核能使用到最新的数据,由于其它核会修改这行数据,状态变成I

I


参考资料:

1.《大话处理器》

MESI协议