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.pswp.cn/news/279109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279109.shtml
英文地址,請注明出處:http://en.pswp.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文件,可以配置服務器實現很多功能,比如錯誤定位&…