多核处理器cache一致性
多核处理器cache一致性实现
对于多核处理器,每个核都有独立cache,通过一致性协议来维护一个有限状态机,根据存储器读写指令或总线上的传输,进行状态迁移和相应的cache操作来保证cache一致性。cache一致性协议主要有两大类别,一类是监听协议(Snooping Protocol
),每个cache都要被监听或者其它cache的总线活动;另外一类是目录协议(Directory Protocol
),全局统一管理cache状态。所谓cache一致性,就是使内存状态对于所有核都是一样的。
MESI协议定义
状态 | 描述 |
---|---|
M(修改态) | cache行数据有效,数据被修改,和内存中的数据不一致,数据只存在本cache中 |
E(独占态) | cache行数据有效,数据和内存中的数据一致,数据只存在本cache中 |
S(共享态) | cache行数据有效,数据和内存中的数据一致,多个cache行存在该数据副本 |
I(无效态) | cache行数据无效 |
MESI状态说明(图片来源于《奔跑吧Linux内核》)
上图中说明了MESI
的转换关系,通过有限状态机来实现cache一致性。后来的MOESI
协议增加了一个O(Owned)
状态,并在MESI协议的基础上重新定义了S
状态,其余状态不变。
下面举例说明MESI
和MOESI
的不同之处,假定一个数据存在于两个核的cache行内,且都是对数据进行了读操作,那么此时两个cache的状态为S
,如果其中一个核对该空间进行了写操作,按照MESI
协议的状态转换表,那么本核cache状态编程M
,而另一个核变为I
,如果另一个核去读数据,则两个核最终又会变成S
,且cache行内容与内存一致。MOESI
协议针对上述操作的最终结果是,修改的那个核的cache状态为O
,而另一个读数据的cache状态为S
,两个cache中的数据都是最新数据,但是与内存中数据不一致。总结下来就是对于S
状态,在MESI
协议下,内存与cache内容一致,在MOESI
协议下,如果所有cache状态都是S
,那么cache与内存内容一致,如果有一个cache状态为O
,而其它核cache状态为S
,则所有cache都是最新的,且与内存内容不一致。(注:这里所说的不一致,并不是指出现了问题,而是当前cache和内存的状态,当cache命中时,cache中的内容是有效的)