多核cpu怎么保证数据一致性(三)MESI缓存一致性协议
系列文章目录
多核cpu怎么保证数据一致性(一)为什么要做指令重排序?
多核cpu怎么保证数据一致性(二)cpu为什么要用高速缓存?L1,L2,L3 cache
前言
上篇文章《多核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协议怎么保证数据一致性的呢?
上图中,假使有一个数据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开发工具》,如果你感兴趣可以来看看