java cas volatile_每日一个知识点:Volatile 和 CAS 的弊端之总线风暴

每日一个知识点系列的目的是针对某一个知识点进行概括性总结,可在一分钟内完成知识点的阅读理解,此处不涉及详细的原理性解读。

一、什么是总线风暴

总线风暴,听着真是一个帅气的词语,但如果发生在你的系统上那就不是很美丽了,废话不多说,先看图说结论。

22c2eff9e35a6a9437f0e81dd645b1bc.png

什么是总线风暴,先来看结论

在java中使用unsafe实现cas,而其底层由cpp调用汇编指令实现的,如果是多核cpu是使用lock cmpxchg指令,单核cpu 使用compxch指令。如果在短时间内产生大量的cas操作在加上 volatile的嗅探机制则会不断地占用总线带宽,导致总线流量激增,就会产生总线风暴。 总之,就是因为volatile 和CAS 的操作导致BUS总线缓存一致性流量激增所造成的影响。

afe05a673a99eda5ed94aeb3ac4834f0.png

二、一些需要的基础知识

这里有些基础需要铺垫下,了解过volatile和cas 的朋友都知道由于一个变量在多个高速缓存中都存在,但由于高速缓存间的数据是不共享的,所以势必会有数据不一致的问题,为了解决这种问题处理器是通过总线锁定和缓存锁定这两个机制来保证复杂内存操作的原子性的。

468fcfb8a013ea9832ecc7ce7b62d0f5.png

1、总线锁

在早期处理器提供一个 LOCK# 信号,CPU1在操作共享变量的时候会预先对总线加锁,此时CPU2就不能通过总线来读取内存中的数据了,但这无疑会大大降低CPU的执行效率。

2、缓存一致性协议

由于总线锁的效率太低所以就出现了缓存一致性协议,Intel 的MESI协议就是其中一个佼佼者。MESI协议保证了每个缓存变量中使用的共享变量的副本都是一致的。

3、MESI 的核心思想

modified(修改)、exclusive(互斥)、share(共享)、invalid(无效)

如上图,CPU1使用共享数据时会先数据拷贝到CPU1缓存中,然后置为独占状态(E),这时CPU2也使用了共享数据,也会拷贝也到CPU2缓存中。通过总线嗅探机制,当该CPU1监听总线中其他CPU对内存进行操作,此时共享变量在CPU1和CPU2两个缓存中的状态会被标记为共享状态(S);

若CPU1将变量通过缓存回写到主存中,需要先锁住缓存行,此时状态切换为(M),向总线发消息告诉其他在嗅探的CPU该变量已经被CPU1改变并回写到主存中。接收到消息的其他CPU会将共享变量状态从(S)改成无效状态(I),缓存行失效。若其他CPU需要再次操作共享变量则需要重新从内存读取。

缓存一致性协议失效的情况:

共享变量大于缓存行大小,MESI无法进行缓存行加锁;

CPU并不支持缓存一致性协议

4、嗅探机制

每个处理器会通过嗅探器来监控总线上的数据来检查自己缓存内的数据是否过期,如果发现自己缓存行对应的地址被修改了,就会将此缓存行置为无效。当处理器对此数据进行操作时,就会重新从主内存中读取数据到缓存行。

5、缓存一致性流量

通过前面都知道了缓存一致性协议,比如MESI会触发嗅探器进行数据传播。当有大量的volatile 和cas 进行数据修改的时候就会产大量嗅探消息。

三、总结性言论

通过上面一顿巴拉,大家应该对开局图有一定的了解了,也大概知道了总线风暴的原因。这里再做一下概括性的总结(当前内部还有很有详细的机制,大家感兴趣可以撸一波)

在多核处理器架构上,所有的处理器是共用一条总线的,都是靠此总线来和主内存进行数据交互。当主内存的数据同时存在于多个处理的高速缓存中时,某一处理器更新了此共享数据后。会通过总线触发嗅探机制来通知其他处理器将自己高速缓存内的共享数据置为无效,在下次使用时重新从主内存加载最新数据。而这种通过总线来进行通信则称之为”缓存一致性流量“。

因为总线是固定的,所有相应可以接受的通信能力也就是固定的了,如果缓存一致性流量突然激增,必然会使总线的处理能力受到影响。而恰好CAS和volatile 会导致缓存一致性流量增大。如果很多线程都共享一个变量,当共享变量进行CAS等数据变更时,就有可能产生总线风暴。

d8b4983c1119e4e7389473c9b4227e89.png

往期推荐

本文地址:https://blog.csdn.net/luqiang81191293/article/details/108849122

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer之代码块相关

转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一、go语句 Go语句是SqlServer中用来表示当前代码块结束提交并确认结果的语句。 Go语句不能和其他Sql命令卸载同一行上! 定义的局部变量作用域局限在定义它的代码…

010 使用list和tuple

list Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。 比如,列出班里所有同学的名字,就可以用一个list表示: >>> classmates [Michael, Bob, Tracy] >>&g…

IT:如何使用Server 2008 R2上的远程桌面服务设置自己的终端服务器

In today’s IT learning article, we are going to take a look at installing Terminal Services, otherwise known as Remote Desktop Services, on a Server 2008 R2 machine. 在今天的IT学习文章中,我们将介绍在Server 2008 R2计算机上安装终端服务(也称为远程…

java 中的chartdata_获取Helm Charts中的文件夹列表

获得了位于templates文件夹之外的配置文件列表,我们将其输入到如下的helm图表中:├── configs│ ├── AllEnvironments│ │ ├── Infrastructure│ │ └── Services│ │ ├── ConfigFile1│ │ ├── ConfigFile2│ ├…

Win10 jdk的安装以及环境变量的配置,及需要注意的坑

此篇文章献给自己,希望下次长点记性 最近本人终于有时间开始学习appium,并且开始在电脑上配置环境,第一步就是在我那刚装的Win10 系统上安装jdk,过程并不顺利,由于之前都是用的win7,几乎都是一路的下一步&a…

java部分服务出现异常_Java web service 异常

1.org/apache/commons/discovery/tools/DiscoverSingletonException in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/discovery/tools/DiscoverSingleton缺少:commons-logging和commons-discovery2.ojava.lang.NoClassDefFoundErr…

Jenkins配置Findbugs做源代码安全扫描

2019独角兽企业重金招聘Python工程师标准>>> 此内容目标阅读用户:运维人员 配置步骤如下: Jenkins安装Findbugs插件 Jenkins系统管理 → 管理插件 → (可选插件)找到Findbugs及其依赖插件全部安装成功,Jenkins重启,即可…

如何从USB运行Windows 8 Developer Preview

Running Windows 8 from a USB should not be confused with installing Windows on a USB drive–in this case, instead of installing it on the drive, we’re just running it straight from the portable drive. Here’s how to do it. 从USB运行Windows 8不应与在USB驱动…

PAT-乙级-1042 字符统计

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内…

acm教程 java版_[转]ACM之java速成

这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。1. 输入:格式为:Scanner cin new Scanner(newBuffe…

配置SSH非管理员用户登录

以root身份登进系统后,增加一个非root帐户,名称为:systemadmin,密码按您的需求设置一个即可。接下来我们要禁止root直接登陆。 [rootmail ~]# useradd systemadmin [rootmail ~]# passwd systemadmin [rootmail ~]# vim /etc/ssh/sshd_conf…

火狐查cookie_Firefox 65默认会阻止跟踪Cookie

火狐查cookieMozilla today released Firefox 63, which includes an experimental option to block third-party tracking cookies, protecting against cross-site tracking. You can test this out today, but Mozilla wants to enable it for everyone by default in Firef…

chromebook刷机_如何将iTunes音乐移至Chromebook

chromebook刷机If you switch between platforms a lot, you know it’s a hassle to move your stuff around. Fortunately, music files don’t have any sort of DRM tying them to a specific platform the way that movies do, so you can copy and paste your library ar…

机房管理系列之杀毒服务器维护

对于企业安全管理方面,“防患于未然”,事前的预防远远大于事故处理,在企业内部保障机房服务器安全运行尤为重要,如何确保企业的安全?我们接下来讲的就是对Symantec杀毒服务器的管理。首先是扫描策略的应用。什么时间升…

php v9 上传_phpcms v9 表单添加文件上传字段

phpcms v9 表单添加文件上传字段1.打开目录 ./phpcms/modules/content/fields/ ;把 文件夹downfile,拷贝到目录./phpcms/modules/formguide/fields/里面。2.打开文件 ./phpcms/modules/formguide/fields/fields.inc.php ,在数组$fields添加值 ‘downfile’>’文件…

nowcoder OI 周赛 最后的晚餐(dinner) 解题报告

最后的晚餐(dinner) 链接: https://www.nowcoder.com/acm/contest/219/B 来源:牛客网 题目描述 \(\tt{**YZ}\)(已被和谐)的食堂实在是太挤辣!所以\(\tt{Apojacsleam}\)现在想邀请他的一些好友去…

阿里巴巴Java开发手册终极版

2019独角兽企业重金招聘Python工程师标准>>> 一、编程规约: (一)命名风格 1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: _name / __name / $Object / name_ / name$ / Object$ 2.…

ios6.1.6可用微信_这是iOS 12.1的新增功能,今天可用

ios6.1.6可用微信While iOS 12 is still fairly fresh, the first point release will be rolling out starting today. This brings a handful of new features, like Group Facetime, dual SIM support, camera improvements, new emoji, and more. 尽管iOS 12仍然相当新鲜&a…

Hadoop实战项目之网站数据点击流分析(转载分析)

本文转载于csdn博主‘一直不懂’ 一,项目业务背景 https://blog.csdn.net/shenchaohao12321/article/details/82958936 二,整体技术流程及架构 https://blog.csdn.net/shenchaohao12321/article/details/82959255 三,数据采集 https://blog.c…

php rewrite url_PHP实现url重写和.htaccess

.htaccess是一个完整的文件名(只有后缀),它是用于Apache服务器下的配置文件,当.htaccess文件放在某一文件夹下,它仅对该文件夹下的文件和文件夹有效。通过.htaccess文件,可以配置服务器实现很多功能,比如错误定位&…