关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

本文探讨了多核CPU中的缓存一致性问题,详细讲解了缓存一致性协议的重要性,以及MESI协议的工作原理。通过实例解析了Store Buffer和Invalidate Queue如何影响全局顺序性,并介绍了内存屏障和Lock指令的角色。文章旨在帮助读者理解CPU缓存一致性协议在并发编程中的作用及其背后的机制。
摘要由CSDN通过智能技术生成

🚀 优质资源分享 🚀

学习路线指引(点击解锁) 知识定位 人群定位
🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

前言

事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-siQBwUk2-1655354739282)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838285-1571355704.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cCeMESPo-1655354739286)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838556-132708408.png)]
可能是我发的那个狗头的表情,让这位读者认为我不尊重他。于是,这位读者一气之下把我删掉了,在删好友之前,还叫我回家种田。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wq9AtTG6-1655354739288)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838187-1843593236.jpg)]

说实话,你说我菜我是承认的,但你要我回家种田,我不理解。为什么要回家种田呢?养猪不比种田赚钱吗?

我想了很久没有想明白,突然,我看到了这个新闻,瞬间明白了读者的用心良苦。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ip9EuYD-1655354739289)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838152-1688849746.png)]
于是,我决定写下这篇文章,好好地分析一下读者提出的几个问题。

读者的观点

针对这位读者的几个观点:

  1. volatile 关键字的底层实现就是 lock 指令
  2. lock 指令触发了缓存一致性协议
  3. JMM 靠缓存一致性协议保证

我先给出我的看法:

  1. 第一点我认为是对的,这个我在 volatile 那篇文章也说过,volatile 的底层实现就是 lock 前缀指令
  2. 第二点我认为是错的
  3. 第三点我认为是错的

至于为什么我会这么认为,我会说出我的理由,毕竟,我们都是是讲道理的人,对不对?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhlpLo9n-1655354739290)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838204-2067188051.jpg)]

读者的观点围绕“缓存一致性协议”,OK,那我们就从缓存一致性协议讲起!

从字面意思来看,缓存一致性协议就是“用来解决 CPU 的缓存不一致问题的协议”。将这句话拆开,就会有几个问题:

  1. 为什么 CPU 运行过程中需要缓存呢?
  2. 为什么缓存会出现不一致呢?
  3. 有哪些方法去解决缓存不一致的问题呢?

我们一一分析。

为什么需要缓存

CPU 是个运算器,主要负责运算;

内存是个存储介质,负责存储数据和指令;

在没有缓存的年代,CPU 和内存是这样配合工作的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2oAsU0D-1655354739291)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838236-2142466568.gif)]

一句话总结就是:CPU 高速运转,但取数据的速度非常慢,严重浪费了 CPU 的性能。

那怎么办呢?

在工程学上,解决速度不匹配的方式主要有两种,分别是物理适配空间缓冲

物理适配很容易理解,多级机械齿轮就是物理适配的典型例子。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYzti3zD-1655354739292)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838202-1053743341.png)]
至于空间缓冲,更多的被运用在软硬件上,CPU 多级缓存就是经典的代表。

什么是 CPU 多级缓存?

简单来说就是基于 时间 = 距离 / 速度 这个公式,通过在 CPU 和内存之间设置多层缓存来减少取数据的距离,让 CPU 和内存的速度能够更好的适配。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBQC8fnF-1655354739293)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838358-1115609679.png)]
因为缓存离 CPU 近,而且结构更加合理,CPU 取数据的速度就缩短了,从而提高了 CPU 的利用率。

同时,因为 CPU 取数据和指令满足时间局部性和空间局部性,有了缓存之后,对同一数据进行多次操作时,中间过程可以用缓存暂存数据,进一步分摊时间 = 距离 / 速度 中的距离,更好地提高了 CPU 利用率。

时间局部性:如果一个信息项正在被访问,那么在近期它很可能还会被再次访问

空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用

缓存为什么会不一致

缓存的出现让 CPU 的利用率得到了大幅地提高。

在单核时代,CPU 既享受到了缓存带来的便利,又不用担心数据会出现不一致。但这一切的前提建立在“单核”。

多核时代的到来打破了这种平衡。

进入多核时候之后,需要面临的第一个问题就是:多个 CPU 是共享一组缓存还是各自拥有一组缓存呢?

答案是“各自拥有一组缓存”。

为什么呢?

我们不妨做个假设,假设多个 CPU 共享一组缓存,会出现什么情况呢?

如果共享一组缓存,由于低级缓存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值