缓存一致性协议(MESI)


前言

  缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾。但是,现代的计算机都是多核CPU,每个核心都有自己的缓存空间,当多个核心竞争共享数据时,就会出现数据不一致问题。


一、缓存是什么

  缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。下图是本机的三级缓存。
本机的三级缓存

二、数据加载的流程

  • 将程序和数据从硬盘加载到内存中 ;

  • 将程序和数据从内存加载到缓存中;

  • CPU将缓存中的数据加载到寄存器中,并进行运算 ;

  • CPU会将数据刷新回缓存,并在一定的时间周期之后刷新回内存。

三、缓存带来的问题

  现在计算机都是多核CPU(本机6核12线程),每个核心也都有自己独立的缓存,当多个核心同时操作多个线程对同一个数据进行更新时,如果核心1在核心2还未将更新的数据刷回内存之前读取了数据,就会造成数据不一致的情况。

  想要解决这种问题,就得加锁更新。加锁分为两种,一种是总线锁,一种是缓存行锁。

  • 总线锁相当于内存锁,一旦某个核心加了总线锁,该核心就会独占总线使用权,其他核心就会被阻塞,cpu性能严重下降。

  • 缓存行锁它只会对单个缓存行(缓存行是缓存中数据存储的基本单元,通常为64字节)的数据进行加锁,不会影响到内存中其他数据的读写。

  缓存一致性协议有MSI,MESI,MOSI,Synapse,Firefly及DragonProtocol等等,接下来我们主要介绍MESI协议。

四、MESI协议

  MESI分别代表缓存行数据所处的四种状态,通过对这四种状态的切换,来达到对缓存数据进行管理的目的。

  • M(修改):该缓存行有效,数据被修改了,和内存中的数据不一致,数据只存在于本缓存行中;
  • E(独占):该缓存行有效,数据和内存中的数据一致,数据只存在于本缓存行中;
  • S(共享):该缓存行有效,数据和内存中的数据一致,数据同时存在于其他缓存行中;
  • I(无效):该缓存行数据无效。

  工作流程:
  1、CPU核心1从内存中将变量a加载到缓存中,并将变量a的状态改为E(独占),并通过总线嗅探机制对内存中变量a的操作进行嗅探;

  2、此时,CPU核心2读取变量a,总线嗅探机制会将核心1中的变量a的状态置为S(共享),并将变量a加载到核心2的缓存中,状态为S;

  3、核心1对变量a进行修改操作,此时核心1中的变量a会被置为M(修改)状态,而核心2中的变量a会被通知,改为I(无效)状态,此时核心2中的变量a做的任何修改都不会被写回内存中(高并发情况下可能出现两个CPU同时修改变量a,并同时向总线发出将各自的缓存行更改为M状态的情况,此时总线会采用相应的裁决机制进行裁决,将其中一个置为M状态,另一个置为I状态,且I状态的缓存行修改无效);(flush操作)

  4、核心1将修改后的数据写回内存,并将变量a置为E(独占)状态;(flush操作)

  5、此时,核心2通过总线嗅探机制得知变量a已被修改,会重新去内存中加载变量a,同时核心1和核心2中的变量a都改为S状态。(refresh操作)

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值