欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

問(wèn)題的由來(lái)

造成亂序訪問(wèn)的原因分為兩類:

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

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

1)指令重排序

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

2)store buffer

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

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

3)Invalidate Queues

store buffer之所以很容易被填滿,主要是因?yàn)槠渌鸆PU在回應(yīng)invalidate acknowledge比較慢,如果能加快這個(gè)過(guò)程,讓store buffer中的內(nèi)容盡快寫入到cacheline,那么就不會(huì)那么容易被填滿了。

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

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

4)亂序處理器

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

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

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

內(nèi)存屏障指令

處理器重排序類型

下面是常見(jiàn)處理器允許的重排序類型的列表:

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

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

從上表我們可以看出:

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

2)常見(jiàn)的處理器都不允許對(duì)存在數(shù)據(jù)依賴的操作做重排序。sparc-TSO和x86擁有相對(duì)較強(qiáng)的處理器內(nèi)存模型,它們僅允許對(duì)寫-讀操作做重排序(因?yàn)樗鼈兌际褂昧藢懢彌_區(qū))。

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • nacos配置中心持久化相關(guān)配置方式

    nacos配置中心持久化相關(guān)配置方式

    這篇文章主要介紹了nacos配置中心持久化相關(guān)配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求

    JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求

    本文主要介紹了JAVA8發(fā)送帶有Body的HTTP GET請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • java-for循環(huán)問(wèn)題

    java-for循環(huán)問(wèn)題

    這篇文章主要介紹了java-for循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java EasyExcel導(dǎo)出報(bào)內(nèi)存溢出的解決辦法

    Java EasyExcel導(dǎo)出報(bào)內(nèi)存溢出的解決辦法

    使用EasyExcel進(jìn)行大數(shù)據(jù)量導(dǎo)出時(shí)容易導(dǎo)致內(nèi)存溢出,特別是在導(dǎo)出百萬(wàn)級(jí)別的數(shù)據(jù)時(shí),你有遇到過(guò)這種情況嗎,以下是小編整理的解決該問(wèn)題的一些常見(jiàn)方法,需要的朋友可以參考下
    2024-10-10
  • Java Validation Api實(shí)現(xiàn)原理解析

    Java Validation Api實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java Validation Api實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Mybatis-Plus通過(guò)配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn)

    Mybatis-Plus通過(guò)配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn)

    本文主要介紹了Mybatis-Plus通過(guò)配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 詳解SpringBoot如何自定義自己的Starter組件

    詳解SpringBoot如何自定義自己的Starter組件

    這篇文章主要為大家詳細(xì)介紹了在SpringBoot中如何自定義自己的Starter組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • java如何判斷Date是上午還是下午

    java如何判斷Date是上午還是下午

    文章介紹了三種在Java中判斷Date對(duì)象是上午還是下午的方法:使用Calendar類、使用Java 8的java.time包以及使用SimpleDateFormat進(jìn)行格式化輸出,每種方法都有代碼示例和解釋,幫助開(kāi)發(fā)者根據(jù)具體需求選擇合適的方法
    2025-03-03
  • java 二分法算法的實(shí)例

    java 二分法算法的實(shí)例

    這篇文章主要介紹了java 二分法算法的實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠掌握二分法,需要的朋友可以參考下
    2017-09-09
  • Java?IO異常如何處理詳析

    Java?IO異常如何處理詳析

    異常就是Java程序在運(yùn)行過(guò)程中出現(xiàn)的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于Java?IO異常如何處理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12

最新評(píng)論