在和同事交流volatile的时候谈到了内存屏障然后听到了一个新词MESI协议,然后做了深入的了解。看的越多不懂的越多。

本篇目的是记录解决一个问题:既然有了MESI协议为什么还要volatile来保证可见性?

CPU缓存一致性协议,MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。

解析

有这个问题主要还是由于基础知识不够,mesi的协议也没有充分的了解。看了网上比较多的解析都没有讲到重点,最终是在知乎的专栏上明白了。

多处理器编程:从缓存一致性到内存模型

既然有了MESI协议为什么还要volatile来保证可见性?

如果真在学习MESI协议我想是不会有这个问题的,由于我只是顺手了解一下导致出现这个低级问题。

修改变量的时候,要发送一些Invalidate给远程的CPU,等到远程CPU返回一个ACK,才能进行下一步。 这一过程中如果远程的CPU比较繁忙,甚至会带来更大的延迟。并且如果有内存访问,会带来几百个周期的延迟。

所以CPU实现加入了优化,在写侧加入store buffer进行写缓存,写完立即返回;在变量状态需要变更侧加入Invalidate Queue来优化更新。

由于store buffer和Invalidate Queue的存在导致了变量状态的变更不及时,所以需要内存屏障。

内存屏障

读屏障,清空本地的invalidate queue,保证之前的所有load都已经生效;写屏障,清空本地的store buffer,使得之前的所有store操作都生效。

��。