缓存一致性(MESI)
MESI是一种协议,用于保证多个CPU cache之间缓存共享数据的一致。
MESI表示了缓存的4种状态。
M:被修改。指该缓存行只被缓存在该cpu的缓存中并且是被修改过的,与主存中的数据不一致。该缓存行内容将在未来某个时间点写回主存。
E:独享。M状态被写回主存后进入E状态,其缓存行只被缓存在该cpu的缓存中,未被修改过,与主存中数据一致。这个状态可以在任何时候当有其他cpu读取该缓存时进入共享状态。当cpu修改缓存内容时会变成M状态。
S:共享。意味着该缓存行被多个cpu进行缓存,并且各个缓存中的数据与主存中一致。当有一个cpu修改该缓存行时其他cpu从该缓存行可以被作废,进入I状态。
I:无效。代表该缓存无效,可能是有其他cpu修改了该缓存行。
local read:读本地缓存数据。
local write:将数据写入本地缓存。
remote read:将内存数据读取过来。
remote write:将数据写回主存。
状态之间的相互转换关系
在一个典型多核系统中每一个核都会有自己缓存来共享主存总线,每一个相应的cpu都会发出读写请求,缓存的目的是为了减少cpu读写共享主存的次数。一个缓存除了在invalid状态都可以满足cpu的读请求。写请求只有在缓存在M或E状态才能被执行。
一个处于M状态的缓存行必须时刻监听所有试图读该缓存行相对用主存的操作,这种操作必须在缓存将该缓存行写回到主存并将状态变成S之前被延迟执行。
一个处于S状态的缓存行也必须监听其他缓存使该缓存行无效或者独享该缓存行的请求,并将缓存行变成无效。
一个处于E状态的缓存行需要监听其他缓存读缓存中该缓存行的操作,一旦有该缓存行的操作就需要变成S状态。
因此对于M和E两种状态而言它们的数据总是精确的,它们和缓存行的真正状态是一致的。而S可能是非一致的,如果一个缓存将处于S状态的缓存行作废了,另一个缓存可能已经独享了该缓存行,但是该缓存却不会将缓存行转换成E状态,因为其他缓存不会广播它们作废该缓存行的通知。同样,由于缓存没有保存该缓存行的copy数量,所以没有办法确定自己是否已独享了该缓存行。
若cpu要修改S状态的缓存行,总线事务需要将所有该缓存行copy的值变成invalid才行,而修改E状态则不需要总线事务。
Written by Autu.
2019.7.5