多核cpu怎么保证数据一致性(三)MESI缓存一致性协议

系列文章目录

多核cpu怎么保证数据一致性(一)为什么要做指令重排序?
多核cpu怎么保证数据一致性(二)cpu为什么要用高速缓存?L1,L2,L3 cache
多核cpu怎么保证数据一致性(三)MESI缓存一致性协议
多核cpu怎么保证数据一致性(四)volatile关键字、happens-before原则、内存屏障



前言

上篇文章《多核cpu怎么保证数据一致性(二)cpu为什么要用高速缓存?L1,L2,L3 cache》我们说了为什么要用多核cpu,以及为什么要用cpu高速缓存,但是因为L1,L2cache是每个cpu的核独有的,怎么保证缓存一致性就成了一个问题,那么cpu是怎么解决缓存一致性的呢?


一、MESI缓存一致性协议

之所以叫做MESI是因为把cpu的内核中的高速缓存分成了四种状态分别是:

  • M(Modified):已修改-数据被修改了
  • E(Exclusive):独占的-数据是此cpu核独占的
  • S(Shared):共享的-此数据是多个cpu核所共享的
  • I(Invalid):失效的-此数据被其他cpu核所修改了,失效

二、MESI协议怎么保证数据一致性的呢?

cpu核心
上图中,假使有一个数据int a = 1,这个数据被两个线程读取到了,线程1在cpu核心1上面执行,线程2在cpu核心2上面执行

  • 此时数据a的状态在cup核心1和cpu核心2上面就是S(Shared)共享的,
  • 线程1执行指“a=a+1”,此时数据a在cpu核心1中的状态就是M(Modified)修改的,数据a在cpu核心2上面的状态就变成了I(Invalid)失效的,此时如果cpu核心2再去读取a的数据,会发现a数据的状态是Invalid,那么就会直接去内存读取。
  • 如果数据a,只在cpu核心1的高速缓存里面,而在cpu核心2的高速缓存里面没有,此时数据a在cpu核心1中就是E(Exclusive)独占的。

三、cpu是怎么更新这4种状态的呢?

如果每个cpu核心都要与其他cpu核心交互这样的复杂度就是N2,而cpu核心不止与其他cpu核心通信还要与一些内存等等数据通信,这样复杂度会很高。

如果有一根总线,所有的cpu都与这根总线通信,复杂度就会降低很多,而真实的cpu的核心也是这样的,最新的Intel处理器中,有一种快速通道互联的技术(如果你是搞软件的,我觉得了解到这里就够了,没必要再去研究什么是快速通道互联技术)。


总结

今天我们说了什么是MESI缓存一致性协议,就是(M、E、S、I)以及MESI怎么保证缓存一致性,和cpu更新这4种状态的方式,就是通过总线,下篇文章,我们将一起学习volatile关键字、happens-before原则,以及实现他们的基础内存屏障。

其实我一直认为,工欲善其事,必先利其器,在工具的使用上,我准备了专栏《java开发工具》,如果你感兴趣可以来看看

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值