- 前言 :
- 1,cpu: 就是处理器
- 2,主存: 就是ram (随机存取存储器)
- 3,高速缓冲存储器(Cache),主要是解决cpu 和主存速度不匹配(通俗点:cpu 相当于在口述文章,而主存在用手写记录,Cache 相当于录音机)
MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。
M | E | S | I |
Modified(修改) | Exclusive(独享) | Shared(共享) | Invalid(无效) |
M(Modified【修改】):
该缓存行只缓存在该cpu的缓存中(谁的cpu 修改了这条数据,这条数据就缓存在谁的cpu中),和主存中的数据不一致,这条缓存的数据呢,需要在其他cpu读取主存对应的这条数据之前,将修改的数据写入到主存中,被写入到主存之后,这条数据就变成E(独享)状态了。
E(Exclusive【独享】):
该缓存行只缓存在该cpu的缓存中,但状态是独享的,因为在与主存的数据是一致的(因为在M状态之后,已经把这条修改的内存数据写入到主存中了),当有其他cpu核来读取这条数据时,它的状态就会变为S(共享状态),当该cpu修改这条数据时,它的状态又会变为 M(修改状态)
S(Shared【共享】):
该状态表示该条数据已经被多个cpu缓存,并且各个cpu的缓存与主存数据一致,但当有一个cpu修改这条缓存的数据时,其他的cpu中这条缓存数据则会变成I(无效)
I(Invalid【无效】):
该缓存是无效的,因为有其他的cpu修改了这条数据。
当前状态 | 事件 | 行为 | next_status |
I | Local Read | 1,如果其他Cache没有这份数据,本Cache从该内存中读取数据,Cache line 的状态变E 2,如果其他Cache有这份数据,且状态为M,则将数据更新到内存中,本Cache再从内从中读取,则所有的Cache line 的状态都变成S 3,如果其他Cache有这份数据,且状态为E/S,本Cache从内存中读取数据,则所有的Cache line 状态都变成 S | E/S |
I | Local Write | 1,从内存中读取数据,在Cache 中修改,状态改为M;但是如果其他Cache 中有这条数据,且状态为M,则先读取内存中的数据 2,如果其他Cache 有这条数据,则其他的Cache的Cache line 的状态变为I | M |
I | Remote Read | 别核操作,与本核无关,状态不变 | I |
I | Remote Write | 别核操作,与本核无关,状态不变 | I |
E | Loacal Read | 从cache中取数据,则状态不变 | E |
E | Local Write | 修改Cache中的数据,状态变为M | M |
E | Remote Read | 数据被其他核读取,状态变为S | S |
E | Remote Write | 数据被其他核修改,状态变为I | I |
S | Local Read | 从Cache 中取数据,状态不变 | S |
S | Local Write | 数据修改,状态变为M,则其他共享这条数据的Cache line 状态则变为I | M |
S | Remote Read | 状态不变 | S |
S | Remote Write | 数据被修改,此数据状态变为 I | I |
M | Local Read | 从Cache 中读取数据,状态不变 | M |
M | Local Write | 修改本数据,状态不变 | M |
M | Remote Read | 这时数据已经被写到主存中,有其他核读取,状态变为S | S |
M | Remote Write | 这时数据已经被写到主存中,有其他核使用最新数据,其他核对数据进行了修改,则数据状态变为I | I |
过程:
在一个典型系统中,可能会有几个缓存(在多核系统中,每个核心都会有自己的缓存)共享主存总线,每个相应的CPU
会发出读写请求,而缓存的目的是为了减少CPU
读写共享主存的次数。
一个缓存除在Invalid
状态外都可以满足cpu的读请求,一个Invalid
的缓存行必须从主存中读取(变成S
或者 E
状态)来满足该CPU
的读请求。
一个写请求只有在该缓存行是M或者E状态时才能被执行,如果缓存行处于S
状态,必须先将其它缓存中该缓存行变成Invalid
状态(也既是不允许不同CPU
同时修改同一缓存行,即使修改该缓存行中不同位置的数据也不允许)。该操作经常作用广播的方式来完成,例如:RequestFor Ownership
(RFO
)。
缓存可以随时将一个非M状态的缓存行作废,或者变成Invalid
状态,而一个M
状态的缓存行必须先被写回主存。
一个处于M
状态的缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。
一个处于S状态的缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid
)。
一个处于E状态的缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S
状态。
对于M
和E
状态而言总是精确的,他们在和该缓存行的真正状态是一致的。而S
状态可能是非一致的,如果一个缓存将处于S
状态的缓存行作废了,而另一个缓存实际上可能已经
独享了该缓存行,但是该缓存却不会将该缓存行升迁为E
状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy
的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。
从上面的意义看来E状态是一种投机性的优化:如果一个CPU
想修改一个处于S
状态的缓存行,总线事务需要将所有该缓存行的copy
变成Invalid
状态,而修改E
状态的缓存不需要使用总线事务。