最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java內(nèi)存屏障詳解

 更新時間:2025年01月08日 09:55:44   作者:夜夜流光相皎潔_小寧  
文章主要介紹了內(nèi)存屏障的必要性,以及在多核處理器中如何通過內(nèi)存屏障來保證多線程程序的內(nèi)存可見性和防止指令亂序執(zhí)行,文章還詳細(xì)解釋了內(nèi)存屏障的作用、原理以及常見處理器中的重排序類型

為什么要有內(nèi)存屏障

為了解決cpu,高速緩存,主內(nèi)存帶來的的指令之間的可見性和重序性問題。

我們都知道計算機(jī)運算任務(wù)需要CPU和內(nèi)存相互配合共同完成,其中CPU負(fù)責(zé)邏輯計算,內(nèi)存負(fù)責(zé)數(shù)據(jù)存儲。CPU要與內(nèi)存進(jìn)行交互,如讀取運算數(shù)據(jù)、存儲運算結(jié)果等。由于內(nèi)存和CPU的計算速度有幾個數(shù)量級的差距,為了提高CPU的利用率,現(xiàn)代處理器結(jié)構(gòu)都加入了一層讀寫速度盡可能接近CPU運算速度的高速緩存來作為內(nèi)存與CPU之間的緩沖:將運算需要使用

的數(shù)據(jù)復(fù)制到緩存中,讓CPU運算可以快速進(jìn)行,計算結(jié)束后再將計算結(jié)果從緩存同步到主內(nèi)存中,這樣處理器就無須等待緩慢的內(nèi)存讀寫了。

什么是內(nèi)存屏障

內(nèi)存屏障,也稱內(nèi)存柵欄,內(nèi)存柵障,屏障指令等, 是一類同步屏障指令,是CPU或編譯器在對內(nèi)存隨機(jī)訪問的操作中的一個同步點,使得此點之前的所有讀寫操作都執(zhí)行后才可以開始執(zhí)行此點之后的操作。

程序編譯優(yōu)化、cache訪問優(yōu)化、多核等導(dǎo)致CPU指令亂序執(zhí)行,最終程序運行不符合我們預(yù)期。內(nèi)存屏障會設(shè)置一個同步點,保障屏障前后的多核內(nèi)存訪問數(shù)據(jù)的一致性。

問題的由來

造成亂序訪問的原因分為兩類:

一類是主動的,編譯器會主動重排代碼使得特定的cpu執(zhí)行更快,稱之為編譯亂序。

另外一類是被動的,為了異步化指令的執(zhí)行,引入Store Buffer和Invalidate Queue,卻導(dǎo)致了指令順序改變的副作用。

1)指令重排序

上述的1屬于編譯器重排序,2和3屬于處理器重排序。這些重排序都可能會導(dǎo)致多線程程序出現(xiàn)內(nèi)存可見性問題。

2)store buffer

加入了這個硬件結(jié)構(gòu)后,CPU0需要往某個地址中寫入一個數(shù)據(jù)時,它不需要去關(guān)心其他的CPU的local cache中有沒有這個地址的數(shù)據(jù),它只需要把它需要寫的值直接存放到store buffer中,然后發(fā)出invalidate的信號,等到成功invalidate其他CPU中該地址的數(shù)據(jù)后,再把CPU0存放在store buffer中的數(shù)據(jù)推到CPU0的local cache中。每一個CPU core都擁有自己私有的store buffer,一個CPU只能訪問自己私有的那個store buffer。

該硬件同時也有缺陷,每個CPU的store buffer不能實現(xiàn)地太大,其存儲隊列的數(shù)目也不會太多。當(dāng)CPU以中等的頻率執(zhí)行store操作的時候(假設(shè)所有的store操作都導(dǎo)致了cache miss),store buffer會很快的唄填滿。在這種情況下,CPU只能又進(jìn)入阻塞狀態(tài),直到cacheline完成invalidation和ack的交互后,可以將store buffer的entry寫入cacheline,從而讓新的store讓出空間之后,CPU才可以繼續(xù)被執(zhí)行。

3)Invalidate Queues

store buffer之所以很容易被填滿,主要是因為其他CPU在回應(yīng)invalidate acknowledge比較慢,如果能加快這個過程,讓store buffer中的內(nèi)容盡快寫入到cacheline,那么就不會那么容易被填滿了。

CPU其實不需要完成invalidate就可以回送acknowledgement消息,這樣就不會阻止發(fā)送invalidate的那個CPU進(jìn)去阻塞狀態(tài)。

CPU可以將這些接收到的invalidate message存放到invalidate queues中,然后直接回應(yīng)acknowledge,表示自己已經(jīng)收到請求,隨后會慢慢處理,當(dāng)時前提是必須在發(fā)送invalidate message的CPU發(fā)送任何關(guān)于某變量對應(yīng)cacheline的操作到bus之前完成。

4)亂序處理器

類比工業(yè)流水線,一條指令的執(zhí)行可以分拆為多步:獲取、解碼、運算和結(jié)果的寫入,每個步驟由一個特定的功能模塊執(zhí)行,如此拆分的好處是多條執(zhí)行變串行執(zhí)行為并行執(zhí)行

5)什么場景下需要使用內(nèi)存屏障

在兩個線程之間存在需要通過共享內(nèi)存來實現(xiàn)交互的可能時,才需要使用內(nèi)存屏障,,保證共享變量的可見性。

內(nèi)存屏障指令

處理器重排序類型

下面是常見處理器允許的重排序類型的列表:

處理器Load-LoadLoad-StoreStore-StoreStore-Load數(shù)據(jù)依賴
spare-TSONNNYN
X86NNNYN
ia64YYYYN
PowerPCYYYYN

上表單元格中的“N”表示處理器不允許兩個操作重排序,“Y”表示允許重排序。

從上表我們可以看出:

1)常見的處理器都允許Store-Load重排序;

2)常見的處理器都不允許對存在數(shù)據(jù)依賴的操作做重排序。sparc-TSO和x86擁有相對較強(qiáng)的處理器內(nèi)存模型,它們僅允許對寫-讀操作做重排序(因為它們都使用了寫緩沖區(qū))。

JVM內(nèi)存屏障指令分類

屏障類型指令示例說明
LoadLoadBarriersLoad1;LoadLoad;Load2;確保Load1的數(shù)據(jù)加載,前于Load2及所有后續(xù)裝載指令的裝著
StoreStoreBarriersStore1;StoreStore;Store2;確保Store1數(shù)據(jù)對其他處理器可見(刷新到內(nèi)存),前于Store2及所有后續(xù)存儲指令的存儲。
LoadStoreBarriersLoad1;LoadStore;Store2;確保Load1數(shù)據(jù)裝載,前于Store2及所有后續(xù)的存儲指令刷新到內(nèi)存。
StoreLoadBarriersStore1;StoreLoad;Load2;確保Store1數(shù)據(jù)對其他處理器變得可見(指刷新到內(nèi)存),之前于Load2及所有后續(xù)裝載指令的裝載。StoreLoad Barriers會使該屏障之前的所有內(nèi)存訪問指令(存儲和裝載指令)完成之后,才執(zhí)行該屏障之后的內(nèi)存訪問指令。

StoreLoad Barriers是一個“全能型”的屏障,它同時具有其他三個屏障的效果。

現(xiàn)代的多處理器大都支持該屏障(其他類型的屏障不一定被所有處理器支持)。

執(zhí)行該屏障開銷會很昂貴,因為當(dāng)前處理器通常要把寫緩沖區(qū)中的數(shù)據(jù)全部刷新到內(nèi)存中(buffer fully flush)。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java如何實現(xiàn)圖片的疊加與拼接操作

    Java如何實現(xiàn)圖片的疊加與拼接操作

    這篇文章主要介紹了Java如何實現(xiàn)圖片的疊加與拼接操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • springboot使用注解實現(xiàn)鑒權(quán)功能

    springboot使用注解實現(xiàn)鑒權(quán)功能

    這篇文章主要介紹了springboot使用注解實現(xiàn)鑒權(quán)功能,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java項目中“zip END header not found“錯誤的解決方案

    Java項目中“zip END header not found“錯誤的解決方案

    在 Java 項目構(gòu)建或運行過程中,開發(fā)者常會遇到 java.util.zip.ZipException: zip END header not found 錯誤,這一異常通常與 JAR 文件損壞、下載不完整、編碼問題或 Maven 依賴管理配置不當(dāng)有關(guān),本文給大家介紹了Java項目中“zip END header not found“錯誤的解決方案
    2025-06-06
  • js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法

    js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法

    這篇文章主要介紹了js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法,需要的朋友可以參考下
    2014-02-02
  • Java中的JVM內(nèi)存分析與故障排查指南

    Java中的JVM內(nèi)存分析與故障排查指南

    Java虛擬機(jī)(JVM)是Java應(yīng)用的運行時環(huán)境,其內(nèi)存管理機(jī)制直接影響著應(yīng)用的性能和穩(wěn)定性,本文將介紹JVM內(nèi)存分析的基本方法,重點介紹如何使用jmap、jhat和VisualVM等工具進(jìn)行內(nèi)存分析,并探討常見的內(nèi)存泄漏排查方法,需要的朋友可以參考下
    2025-11-11
  • Java求解兩個非負(fù)整數(shù)最大公約數(shù)算法【循環(huán)法與遞歸法】

    Java求解兩個非負(fù)整數(shù)最大公約數(shù)算法【循環(huán)法與遞歸法】

    這篇文章主要介紹了Java求解兩個非負(fù)整數(shù)最大公約數(shù)算法,結(jié)合實例形式分析了java求解最大公約數(shù)的實現(xiàn)方法,并附帶了循環(huán)法與遞歸法算法思路,需要的朋友可以參考下
    2018-03-03
  • Java Synchronized的偏向鎖詳細(xì)分析

    Java Synchronized的偏向鎖詳細(xì)分析

    synchronized作為Java程序員最常用同步工具,很多人卻對它的用法和實現(xiàn)原理一知半解,以至于還有不少人認(rèn)為synchronized是重量級鎖,性能較差,盡量少用。但不可否認(rèn)的是synchronized依然是并發(fā)首選工具,本文就來詳細(xì)講講
    2023-04-04
  • Java使用二分法進(jìn)行查找和排序的示例

    Java使用二分法進(jìn)行查找和排序的示例

    這篇文章主要介紹了Java使用二分法進(jìn)行查找和排序的示例,二分插入排序和二分查找是基礎(chǔ)的算法,需要的朋友可以參考下
    2016-04-04
  • 詳解Java設(shè)計模式之單例模式

    詳解Java設(shè)計模式之單例模式

    單例模式是一種創(chuàng)建型設(shè)計模式,它的目的是確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例,在單例模式中,類自身負(fù)責(zé)創(chuàng)建自己的唯一實例,并確保在系統(tǒng)中只有一個實例存在,本文詳細(xì)介紹了Java設(shè)計模式中的單例模式,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • MyBatis 配置復(fù)用從入門到精通

    MyBatis 配置復(fù)用從入門到精通

    本文將深入探討MyBatis的各種配置復(fù)用技巧,幫助您寫出更優(yōu)雅、更易維護(hù)的持久層代碼,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評論

诸城市| 东丽区| 维西| 新乡县| 信阳市| 临夏市| 连城县| 渝中区| 德昌县| 彭山县| 澄江县| 平遥县| 吉林省| 喀喇沁旗| 肥东县| 寿宁县| 巴林右旗| 金塔县| 云霄县| 宿迁市| 乐都县| 牟定县| 济源市| 伊宁市| 嵩明县| 九龙县| 和龙市| 女性| 灌阳县| 津南区| 汾西县| 宁明县| 蒲城县| 皋兰县| 南江县| 伽师县| 延川县| 思南县| 兴义市| 济源市| 巨鹿县|