首页 > 编程知识 正文

多处理机cache一致性,cpu 的缓存一致性原理

时间:2023-05-04 23:26:22 阅读:191521 作者:388

系列文章目录

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


文章目录 系列文章目录前言一、MESI缓存一致性协议二、MESI协议怎么保证数据一致性的呢?三、cpu是怎么更新这4种状态的呢?总结


前言

上篇文章《多核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开发工具》,如果你感兴趣可以来看看

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。