🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 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)]
于是,我决定写下这篇文章,好好地分析一下读者提出的几个问题。
读者的观点
针对这位读者的几个观点:
- volatile 关键字的底层实现就是 lock 指令
- lock 指令触发了缓存一致性协议
- JMM 靠缓存一致性协议保证
我先给出我的看法:
- 第一点我认为是对的,这个我在 volatile 那篇文章也说过,volatile 的底层实现就是 lock 前缀指令
- 第二点我认为是错的
- 第三点我认为是错的
至于为什么我会这么认为,我会说出我的理由,毕竟,我们都是是讲道理的人,对不对?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QhlpLo9n-1655354739290)(https://img2022.cnblogs.com/blog/2253739/202206/2253739-20220615221838204-2067188051.jpg)]
读者的观点围绕“缓存一致性协议”,OK,那我们就从缓存一致性协议讲起!
从字面意思来看,缓存一致性协议就是“用来解决 CPU 的缓存不一致问题的协议”。将这句话拆开,就会有几个问题:
- 为什么 CPU 运行过程中需要缓存呢?
- 为什么缓存会出现不一致呢?
- 有哪些方法去解决缓存不一致的问题呢?
我们一一分析。
为什么需要缓存
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 共享一组缓存,会出现什么情况呢?
如果共享一组缓存,由于低级缓存