深入理解MESI与Volatile

226 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈


一. CPU缓存结构

CPU为了解决CPU处理速度远大于内存读取速度的问题,引入了CPU高速缓存,如下所示。

CPU高速缓存示意图

其中L1L2CPU核独占,L3CPU核共享,并且还有如下规则。

  1. L1 d-Cache是数据缓存,L1 i-Cache是指令缓存;
  2. CPU核需要从内存读取数据时,会先从L1读取,未读取到时再从L2读取,还未读取到时再从L3读取;
  3. CPU核越远,缓存容量越大,读取速度越慢。

二. 缓存一致性协议

CPU引入了高速缓存后,会导致多个CPU核之间的缓存一致性问题。首先CPU提供了一种总线锁的机制来解决缓存一致性问题,即通过锁总线的方式来让多个CPU核访问主存时互斥,属于粗粒度的加锁方式,会导致CPU性能急剧下降,所以CPU又采用了缓存一致性协议来解决缓存一致性问题。通常使用的缓存一致性协议为MESI,其具体说明如下。

  • Modify。数据只缓存在当前CPU核的缓存行中,并且是被修改的,跟主内存的数据是不一致的;
  • Exclusive。数据只缓存在当前CPU核的缓存行中,跟主内存的数据是一致的;
  • Shared。数据缓存在多个CPU核的缓存行中,跟主内存的数据是一致的;
  • Invalid。缓存行中的数据是无效的。

MESI协议可以理解为是对缓存进行加锁,相比于总线锁粒度更小,性能更好。关于MESI机制,可以使用MESI-Protocol网页工具进行演示和学习。(注:总线是为了CPU之间以及CPU与主存之间进行通信,所以总线上的指令执行必须是串行的。)

三. 指令重排

尽管MESI协议在解决缓存一致性问题时性能已经好于总线锁,但是还是会存在等待阻塞的问题,比如一个CPU核1更新变量的值后,需要等待这个更新操作通知到其它CPU核后才能继续执行后续的操作,那么这个等待过程对于CPU核1来说是阻塞的,所以为了解决这样的问题,CPU引入了Store BufferInvalid Queue

考虑这样一个场景,初始主存中有变量a和变量b,且ab在主存中的值均为0,同时核Cpu0b缓存在了本地高速缓存中,核Cpu1a缓存在了本地高速缓存中,假如Cpu0Cpu1运行的代码如下所示。

Cpu0运行代码

a = 1;
b = 1;

Cpu1运行代码

while (b == 1) {
    assert(a == 1);
}

上述代码可能出现的一个执行时序图如下所示。(下述时序图仅引入了Store Buffer

指令重排时序图

按照正常逻辑来看,b的值如果为1,a的值一定为1,那么Cpu1执行的代码一定不会断言失败,但是根据上述时序图可知,由于引入了Store BufferCpu1执行的代码断言失败,从CPU的层面看,是因为a = 1这条指令先入了Store Buffer,这条修改指令没有及时通知到其它CPU核,而从代码层面看,Cpu0执行代码的顺序发生了重排,重排后的代码表示如下。

b = 1;
a = 1;

上面讨论的情况就是发生了指令重排,表现到代码层面就是代码执行顺序发生了改变,而导致指令重排的原因就是CPU为了提升性能而做的一些优化,比如引入Store BufferInvalid Queue

四. volatile关键字

有了前面的铺垫,现在开始分析volatile关键字的作用和原理。

  1. volatile关键字修饰的共享变量进行写操作的时候会被添加上LOCK指令,从而会引发两件事情。
    1. 将当前处理器缓存行的数据写回到主存;
    2. 由于缓存一致性协议,写回主存的操作会使其它处理器对该数据的缓存失效,从而需要重新从主存中加载最新数据。
  2. volatile关键字修饰的共享变量在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

上述第一点是volatile提供的可见性,上述第二点是volatile提供的有序性


大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情