国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型

這篇具有很好參考價值的文章主要介紹了一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

CPU 多級緩存 & 緩存一致性協(xié)議(MESI)

CPU 多級緩存

  • 參考:Java Memory Model

緩存一致性協(xié)議(MESI)

  • 多級緩存的出現(xiàn)解決了CPU處理速度和內(nèi)存讀取速度不一致的問題,但是同時也帶來緩存不一致的問題,為了解決這個問題,我們引入了緩存一致性協(xié)議,常見的緩存一致性協(xié)議有MSI,MESI,MOSI,Synapse,F(xiàn)irefly及DragonProtocol等等,下文以MESI協(xié)議進行講述。

一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型,Java 后端經(jīng)典面試題,JVM,操作系統(tǒng),緩存,java,開發(fā)語言

緩存行(Cache line)

  • 緩存行是指在緩存中的最小數(shù)據(jù)單元。

四種緩存狀態(tài)

  • 緩存行有4個狀態(tài),用2個bit表示。
狀態(tài) 描述 監(jiān)聽任務(wù)
E 獨享 該Cache line有效,數(shù)據(jù)被修改,和內(nèi)存數(shù)據(jù)一致,數(shù)據(jù)只存在本Cahe中 必須監(jiān)聽所有試圖讀該緩存行的操作,操作必須在該緩存行寫回主存并將狀態(tài)變?yōu)镾后執(zhí)行
M 修改 該Cache line有效,數(shù)據(jù)被修改,和內(nèi)存數(shù)據(jù)不一致,數(shù)據(jù)只存在本Cahe中 必須監(jiān)聽所有試圖讀該緩存行的操作,操作必須在該緩存行寫回主存并將狀態(tài)變?yōu)镾后執(zhí)行
S 共享 該Cache line有效,數(shù)據(jù)和內(nèi)存數(shù)據(jù)一致,數(shù)據(jù)存在多個Cache中 必須監(jiān)聽其它緩存使該緩存無效或獨享該緩存的請求,并將該緩存行變?yōu)闊o效
I 失效 該Cache line無效
  • 注:對于M和E狀態(tài)而言總是精確的,他們在和該緩存行的真正狀態(tài)是一致的,而S狀態(tài)可能是非一致的。如果一個處于S狀態(tài)的緩存失效,另外一個緩存行可能已經(jīng)獨享了該緩存行,但是不會升遷為獨享狀態(tài),因為失效并不會廣播給其它緩存行。

緩存行狀態(tài)轉(zhuǎn)換

一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型,Java 后端經(jīng)典面試題,JVM,操作系統(tǒng),緩存,java,開發(fā)語言

多核協(xié)同示例

一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型,Java 后端經(jīng)典面試題,JVM,操作系統(tǒng),緩存,java,開發(fā)語言

  • 初始狀態(tài):CPUB 存在緩存變量 X 狀態(tài)為 M
  • CPUA 發(fā)出指令讀取 X 指令,通過 bus 讀取 X,檢測到地址沖突,將 CPUB 緩存變量狀態(tài)置為 S,讀取 X 到 CPUA 完成
  • 此時,CPUB 修改緩存變量并通過 bus 寫回主存,發(fā)現(xiàn)地址沖突,將 CPUA 中的變量從 S 狀態(tài)置為 I,數(shù)據(jù)寫回主存
網(wǎng)站體驗
  • 模擬一致性的整個過程:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

MESI優(yōu)化和引入的問題

  • 在上述多核CPU為保證緩存一致性進行協(xié)同的過程中,消息傳遞的時間遠遠大于CPU執(zhí)行時間,如果每次的操作都需要等待協(xié)同指令響應(yīng)完成,那么就會大大降低處理器的處理性能,因此引入了Store Bufferes和Invalidate Queue進行優(yōu)化。
Store Bufferes & Invalidate Queue
  • 從上述的多核協(xié)同案例中我們可以發(fā)現(xiàn),每次修改緩存中的元素,都需要將無效狀態(tài)指令(Invalidate Acknowledge)執(zhí)行完才能將修改的數(shù)據(jù)寫回緩存行中,等待協(xié)同指令會造成CPU運算能力浪費,因此,Store Bufferes被引入,我們不需要等待協(xié)同指令返回就可以將修改的數(shù)據(jù)寫入Store Bufferes,當再次讀取時若在Store Bufferes中已存在直接從Buffer中讀取(稱為“Store Forwarding”),只有當收到所有協(xié)同指令響應(yīng)后才能寫回緩存行中。
  • Store Bufferes 是有限的,因此當要寫回緩存行時為了更快的得到所有Invalidate Acknowledge指令的響應(yīng),實際上也不會立即執(zhí)行,而是放入了Invalidate Queue中,并立即返回響應(yīng),在合適的時機去執(zhí)行。

一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型,Java 后端經(jīng)典面試題,JVM,操作系統(tǒng),緩存,java,開發(fā)語言

Store Bufferes & Invalidate Queue 帶來的問題
  • Store buffer 什么時候?qū)懟夭]有保證
value = 3;

void exeToCPUA(){
  value = 10;
  isFinsh = true;
}

void exeToCPUB(){
  if(isFinsh){
    // value 一定等于10?
    // 如果 Store Bufferes 沒有寫回那么將導(dǎo)致數(shù)據(jù)不一致
    assert value == 10;
  }
}
  • Invalidate Acknowledge 什么時候執(zhí)行沒有保證
// 當一個CPU嘗試讀取實際已經(jīng)失效但未執(zhí)行 Invalidate Acknowledge 的數(shù)據(jù)時,會導(dǎo)致數(shù)據(jù)不一致

硬件內(nèi)存模型

  • 由于 Store Bufferes & Invalidate Queue 的引入,導(dǎo)致 Store Bufferes 寫入緩存行和執(zhí)行 Invalidate Acknowledge 的時機需要十分合適才能盡可能釋放CPU的處理能力,實際上CPU并不知道什么時候會執(zhí)行,因此將這個任務(wù)留給了寫程序的人,這就是我們常說的內(nèi)存屏障。
讀屏障 & 寫屏障
  • 寫屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb)是一條告訴處理器在執(zhí)行這之后的指令之前,應(yīng)用所有已經(jīng)在Store buffer中的保存的指令到緩存行中。

  • 讀屏障Load Memory Barrier (a.k.a. LD, RMB, smp_rmb)是一條告訴處理器在執(zhí)行任何的加載前,應(yīng)用所有已經(jīng)在失效隊列中的失效操作的指令。文章來源地址http://www.zghlxwxcb.cn/news/detail-743166.html

void executedOnCpu0() {
    value = 10;
    // 在更新數(shù)據(jù)之前必須將所有存儲緩存(store buffer)中的指令執(zhí)行完畢。
    storeMemoryBarrier();
    finished = true;
}
void executedOnCpu1() {
    while(!finished);
    // 在讀取之前將所有失效隊列中關(guān)于該數(shù)據(jù)的指令執(zhí)行完畢。
    loadMemoryBarrier();
    assert value == 10;
}

思考 & 聯(lián)系

  • 不同的系統(tǒng)架構(gòu)有不同的內(nèi)存屏障,以X86架構(gòu)為例:讀屏障:lfence、寫屏障:sfence、讀寫屏障:mfence。
  • MESI 緩存一致性協(xié)議中為了盡可能的提高性能,引入了 Store Bufferes & Invalidate Queue ,將數(shù)據(jù)具體的失效時機和寫入時間交給了內(nèi)存屏障控制,而 JMM 則基于內(nèi)存屏障保證數(shù)據(jù)的可見性。
  • volatile 關(guān)鍵字底層使用了LOCK關(guān)鍵字,LOCK關(guān)鍵字的本質(zhì)是鎖(總線鎖或緩存行鎖),只是LOCK關(guān)鍵字的一部分能力具備和內(nèi)存屏障相同的作用,但是和內(nèi)存屏障還是有一定區(qū)別。

到了這里,關(guān)于一文讀懂從 CPU 多級緩存 & 緩存一致性協(xié)議(MESI)到 Java 內(nèi)存模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 緩存數(shù)據(jù)一致性探究

    緩存數(shù)據(jù)一致性探究

    緩存是一種較低成本提升系統(tǒng)性能的方式,自它面世第一天起就備受廣大開發(fā)者的喜愛。然而正如《人月神話》中的那句經(jīng)典的“沒有銀彈”中所說,軟件工程的設(shè)計沒有銀彈。 就像每一次發(fā)布上線修復(fù)問題的同時,也極易引入新的問題,自緩存誕生的第一天起, 緩存與數(shù)

    2024年02月16日
    瀏覽(29)
  • 緩存一致性設(shè)計思路

    Spring注解使用,控制Redis緩存更新 緩存一致性問題是如何產(chǎn)生的? 雙更新模式:操作不合理,導(dǎo)致數(shù)據(jù)一致性問題 “后刪緩存”,能解決多數(shù)不一致 大廠高并發(fā),“后刪緩存”依舊不一致 如何解決高并發(fā)的不一致問題?延遲雙刪與閃電緩存 如何解決緩存擊穿?讀操作互斥

    2023年04月17日
    瀏覽(22)
  • 深入理解高并發(fā)下的MySQL與Redis緩存一致性問題(增刪改查數(shù)據(jù)緩存的一致性、Canal、分布式系統(tǒng)CAP定理、BASE理論、強、弱一致性、順序、線性、因果、最終一致性)

    一些小型項目,或極少有并發(fā)的項目,這些策略在無并發(fā)情況下,不會有什么問題。 讀數(shù)據(jù)策略:有緩存則讀緩存,然后接口返回。沒有緩存,查詢出數(shù)據(jù),載入緩存,然后接口返回。 寫數(shù)據(jù)策略:數(shù)據(jù)發(fā)生了變動,先刪除緩存,再更新數(shù)據(jù),等下次讀取的時候載入緩存,

    2024年03月20日
    瀏覽(29)
  • Redis之緩存一致性

    Redis之緩存一致性

    按照緩存更新的方式大致分為: 內(nèi)存淘汰、過期刪除、主動更新。 利用 Redis 的內(nèi)存淘汰策略,當內(nèi)存不足時自動進行淘汰部分數(shù)據(jù),下次查詢時更新緩存,一致性差,無維護成本。 因為 Redis 是基于內(nèi)存的,如果內(nèi)存超過限定值( Redis 配置文件的 maxmemory 參數(shù)決定 Redis 最大內(nèi)

    2024年02月07日
    瀏覽(29)
  • 【Redis】之數(shù)說緩存一致性

    【Redis】之數(shù)說緩存一致性

    對于使用 Redis 作為緩存來說,如何保證數(shù)據(jù)庫和緩存數(shù)據(jù)一致性是個麻煩的問題。對于緩存和數(shù)據(jù)庫的操作,主要有以下兩種方式: 先刪緩存,再更新數(shù)據(jù)庫; 先更新數(shù)據(jù)庫,再刪除緩存; 這兩種方式都存在緩存一致性問題,下面我們就分析一下如何解決這兩種方式的緩存

    2024年02月13日
    瀏覽(21)
  • 緩存和數(shù)據(jù)庫一致性

    緩存和數(shù)據(jù)庫一致性

    項目的難點是如何保證緩存和數(shù)據(jù)庫的一致性。無論我們是先更新數(shù)據(jù)庫,后更新緩存還是先更新數(shù)據(jù)庫,然后刪除緩存,在并發(fā)場景之下,仍然會存在數(shù)據(jù)不一致的情況(也存在刪除失敗的情況,刪除失敗可以使用異步重試解決)。有一種解決方法是延遲雙刪的策略,先刪

    2024年01月17日
    瀏覽(24)
  • Redis緩存雙寫一致性

    Redis緩存雙寫一致性

    如果redis中有數(shù)據(jù):需要和數(shù)據(jù)庫中的值相同 如果redis中無數(shù)據(jù):數(shù)據(jù)庫中的值要是最新值,且準備回寫redis 緩存按照操作來分,可細分為兩種: 只讀緩存和讀寫緩存 只讀緩存很簡單:就是Redis只做查詢,有就是有,沒有就是沒有,不會再進一步訪問MySQL,不再需要會寫機制

    2023年04月17日
    瀏覽(18)
  • Redis緩存(雙寫一致性問題)

    Redis緩存(雙寫一致性問題)

    前言 : 什么是緩存? 緩存就像自行車,越野車的避震器 舉個例子:越野車,山地自行車,都擁有\(zhòng)\\"避震器\\\", 防止 車體加速后因慣性,在酷似\\\"U\\\"字母的地形上飛躍,硬著陸導(dǎo)致的 損害 ,像個彈簧一樣; 同樣,實際開發(fā)中,系統(tǒng)也需要\\\"避震器\\\",防止過高的數(shù)據(jù)訪問猛沖系統(tǒng),導(dǎo)致其操作線程無法

    2024年02月02日
    瀏覽(22)
  • Redis---緩存雙寫一致性

    Redis---緩存雙寫一致性

    目錄 一、什么是緩存雙寫一致性呢? ?1.1 雙檢加鎖機制 ?二、數(shù)據(jù)庫和緩存一致性的更新策略 2.1、先更新數(shù)據(jù)庫,后更新緩存 ?2.2 、先更新緩存,后更新數(shù)據(jù)庫 ?2.3、先刪除緩存,在更新數(shù)據(jù)庫 延時雙刪的策略: ?2.4.先更新數(shù)據(jù)庫,在刪除緩存(常用) 2.5、實際中是不可

    2024年02月15日
    瀏覽(25)
  • 緩存和數(shù)據(jù)庫一致性問題分析

    目錄 1、數(shù)據(jù)不一致的原因 1.1 并發(fā)操作 1.2 非原子操作 1.3 數(shù)據(jù)庫主從同步延遲 2、數(shù)據(jù)不一致的解決方案 2.1 并發(fā)操作 2.2 非原子操作 2.3 主從同步延遲 2.4 最終方案 3、不同場景下的特殊考慮 3.1 讀多寫少的場景 3.2 讀少寫多的場景 導(dǎo)致緩存和數(shù)據(jù)庫數(shù)據(jù)不一致的原因有三個

    2024年02月14日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包