日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让你了解什么是内存屏障

發(fā)布時間:2025/3/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让你了解什么是内存屏障 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

重排

內(nèi)存屏障

內(nèi)存屏障種類

編譯器和處理器必須同時遵守重排規(guī)則。多核處理器需使用內(nèi)存屏障指令來確保一致性。即使編譯器優(yōu)化掉了一個字段訪問(因為一個讀入的值未被使用),需要產(chǎn)生內(nèi)存屏障,就像這個訪問仍然需要保護。(可參考下面的優(yōu)化掉內(nèi)存屏障的章節(jié))。

內(nèi)存屏障指令僅直接控制CPU與其緩存之間,與垃圾回收機制中“寫屏障(write barriers)”無關(guān)。

一、重排序

編譯器或者CPU的代碼的結(jié)構(gòu)重排排序,達到最佳效果。

(1)編譯器重排

?

CPU只讀一次的x和y值。不需反復讀取寄存器交替x和y值

(2)處理器重排

?

?

寫緩存區(qū)沒有及時刷新,使得處理器執(zhí)行的讀寫操作與內(nèi)存上順序不一致

處理器A讀b=0,處理器B讀a=0。A1寫a=1先寫到處理器A的寫緩存區(qū)中,此時內(nèi)存中a=0。如果這時處理器B從內(nèi)存中讀a,讀到的將是0。

可能會出現(xiàn)x,y都是0。

?

二、內(nèi)存屏障

為了解決上述問題,處理器提供內(nèi)存屏障指令(Memory Barrier):

寫內(nèi)存屏障(Store Memory Barrier):處理器將存儲緩存值寫回主存(阻塞方式)。

讀內(nèi)存屏障(Load Memory Barrier):處理器,處理失效隊列(阻塞方式)。

?

保證兩個操作之間數(shù)據(jù)的可見性。

volatile讀前插讀屏障,寫后加寫屏障,避免CPU重排導致的問題,實現(xiàn)多線程之間數(shù)據(jù)的可見性

三、內(nèi)存屏障的種類

StoreLoad開銷最大。萬能屏障,兼具其它三種內(nèi)存屏障功能。執(zhí)行時,處理器通常要把寫緩沖區(qū)中的數(shù)據(jù)全部刷新的內(nèi)存中

?

對于處理器來說,內(nèi)存屏障會導致cpu緩存的刷新,刷新時,會遵循緩存一致性協(xié)議。

lock解鎖時,jvm會強制刷新cpu緩存,導致當前線程更改,對其他線程可見。

volatile:標記volatile的字段,在操作時,會強制刷新cpu緩存,標記volatile的字段,每次讀取都是直接讀內(nèi)存

final:即時編譯器在final寫操作后,會插入內(nèi)存屏障,來禁止重排序,保證可見性



作者:hedgehog1112
鏈接:https://www.jianshu.com/p/08a0a8c984ab
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

總結(jié)

以上是生活随笔為你收集整理的让你了解什么是内存屏障的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。