MESI 缓存一致性协议

MESI 缓存一致性协议

多核场景下,仅仅依靠CAS这一类硬件原语并不能实现同步,因为原子指令底层实现也可能包含多条微指令,而原子指令的原子性是相对于一个核而言的,多条原子指令在各自的CPU核上都是原子执行的。所以要解决这个问题就要先将总线锁住。例如在Go中Mutex的实现,在执行CMPXCHGL指令直线先LOCK总线。锁住总线就导致程序由并行变为串行,这必然会影响性能,现代CPU都拥有高速缓存,不再通过锁总线的方式实现多核间的同步,为了保证多核间高速缓存的一致性,引入了高速缓存一致性协议(MESI协议)。

单核CPU的cache中每个cache line有2个标志:dirty、valid标识,表示cache中的数据是否被修改、是否有效。而在多个核中每个CPU都有自己对应的cache,多个核共享内存中的数据,MESI协议就描述了数据的共享状态,分别是:

状态描述
M(Modified)该行数据有效、被修改,和内存中的数据不一致,该数据只存在于本Cache中。
E(Exclusive)该行数据有效、和内存中的数据一致,该数据只存在于本Cache中。
S(Shared)该行数据有效,和内存中的数据一致,该数据存在于多个Cache中。
I(Invalid)该行数据无效。

M与E的共同点是:都是本Cache所独有的;不同点是:M表示Cache中的数据与内存中的数据不一致。

在MESI协议中,每个Cache的Cache控制器不仅要知道自己的读写操作,还要监听其他Cache的读写操作(监听总线)。

状态变化如下,其中Local Read/Write表示对本CPU Cache的读写操作,Remote Read/Write表示其他CPU对自己Cache的读写操作。

当前状态事件行为下一个状态
I(Invalid)Local Read如果其它Cache没有这份数据,本Cache从内存中取数据,Cache line状态变成E; 如果其它Cache有这份数据,且状态为M,则将数据更新到内存,本Cache再从内存中取数据,2个Cache 的Cache line状态都变成S; 如果其它Cache有这份数据,且状态为S或者E,本Cache从内存中取数据,这些Cache 的Cache line状态都变成SE/S
I(Invalid)Local Write如果其它Cache没有这份数据,本Cache从内存中取数据并修改,Cache line状态变成M;如果其它Cache有这份数据,且状态为M,则要先将数据更新到内存,读取并修改,其他Cache的Cache line状态变为I;M/I
I(Invalid)Remote Read既然是Invalid,别的核的操作与它无关I
I(Invalid)Remote Write既然是Invalid,别的核的操作与它无关I
E(Exclusive)Local Read从Cache中取数据,状态不变E
E(Exclusive)Local Write写入Cache,状态变为MM
E(Exclusive)Remote Read数据和其它核共用,状态变成了SS
E(Exclusive)Remote Write数据被修改,本Cache line不能再使用,状态变成II
S(Shared)Local Read从Cache中取数据,状态不变S
S(Shared)Local Write修改Cache中的数据,状态变成M,其它核共享的Cache line状态变成IM
S(Shared)Remote Read状态不变S
S(Shared)Remote Write数据被修改,本Cache line不能再使用,状态变为II
M(Modified)Local Read从Cache中取数据,状态不变M
M(Modified)Local Write修改Cache中的数据,状态不变M
M(Modified)Remote Read写会内存,使其它核能使用到最新的数据,状态变为SS
M(Modified)Remote Write写会内存,使其它核能使用到最新的数据,数据被修改,本Cache line不能再使用,状态变为II
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值