0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹下cpu緩存一致性(MESI協(xié)議)

冬至子 ? 來源:并發(fā)編程之美 ? 作者:妙啊 ? 2023-06-09 16:01 ? 次閱讀

介紹

之前介紹了java并發(fā)包的cas原理和java內(nèi)存模型,這篇我們介紹下cpu緩存一致性原理,可以幫助我們更好的理解cas的底層原理。

一、cpu多級緩存結(jié)構(gòu)

圖片

  • 計算機在寄存器上執(zhí)行的速度是遠大于在主內(nèi)存上執(zhí)行的速度。

  • 由于計算機的存儲設(shè)備與處理器的運算速度之間存在幾個數(shù)量級的差距,所以新的計算機系統(tǒng)都不得不加入一層讀寫速度都盡可能接近處理器運算速度的高級緩存來作為內(nèi)存與處理器之間的緩沖,將運算使用到的數(shù)據(jù)復(fù)制到緩存中,讓運算快速執(zhí)行,當(dāng)運算結(jié)束后,再將數(shù)據(jù)從緩存同步到內(nèi)存中,這樣處理器就無需等待緩慢的內(nèi)存讀寫了。

  • 一個計算機還包含一個主存,所有的cpu都可以訪問這個主存,主存通常比CPU中的緩存大得多。

  • 多核cpu運作原理:

    通常情況下,當(dāng)一個CPU需要讀取主存的時候,它會將主存的數(shù)據(jù)讀取到CPU緩存中,甚至?xí)⒕彺嬷械牟糠謨?nèi)容讀到它內(nèi)部的寄存器里面,然后在寄存器中執(zhí)行操作;當(dāng)CPU需要將結(jié)果回寫到主存的時候,它會將內(nèi)部寄存器的值刷新到緩存中,然后在某個時間點將值刷新回主存。

二、MESI協(xié)議

圖片

四種狀態(tài):

  • M:Modified(被修改)

    指的是該緩存行只被緩存在該CPU的緩存中,并且是被修改過的,因此它與主存中的數(shù)據(jù)是不一致的,該緩存行的內(nèi)存需要在未來的某個時間點寫回主存,這個時間點我們是允許其他CPU讀取主存中相應(yīng)的內(nèi)存之前,當(dāng)這里的值被寫回主存之后,該緩存行的狀態(tài)變成E。

  • E:Exclusive(獨享)

    獨享狀態(tài)的緩存行只被緩存在該CPU的緩存中,它是未被修改過的,是與主存中的數(shù)據(jù)一致的,這個狀態(tài)可以在任何時刻,當(dāng)有其他CPU讀取該內(nèi)存時變成S。同樣的,當(dāng)COU修改該緩存行的數(shù)據(jù)時,該狀態(tài)可以變成M。

  • S:Shared(共享)

    共享狀態(tài)意味著,該緩存行可能被多個CPU進行緩存,并且各個緩存中的數(shù)據(jù)與主存中的數(shù)據(jù)是一致的,當(dāng)有一個CPU修改該緩存行的時候,其他CPU中該緩存行是可以被作廢的,變成I。

  • I:Invalid(無效的)

    無效狀態(tài)代表這個緩存是無效的,可能是有其他CPU修改了該緩存行。

CPU的cache的四種操作可能產(chǎn)生不一致的狀態(tài),因此緩存控制器監(jiān)聽到本地操作和遠程操作的時候,需要對地址一定的cache line做出一定的修改,從而保證數(shù)據(jù)在多個緩存之間的一致性。

四種操作:

  • local read

    代表的是讀本地緩存行中的數(shù)據(jù)。

  • local write

    代表的是將數(shù)據(jù)寫入到本地的緩存里面。

  • remote read

    代表的是將內(nèi)存中的數(shù)據(jù)讀取到本地。

  • remote write

    代表的是將數(shù)據(jù)寫回到主存中。

三、MESI工作原理

在一個典型的多核系統(tǒng)中,每一個核都會有自己的緩存來共享主存總線,每一個相應(yīng)的CPU都會發(fā)出讀寫請求,而緩存的目的是為了減少CPU讀寫共享主存的次數(shù)。

  • 一個緩存除了在Invalid狀態(tài)之外,都可以滿足CPU的讀請求;
  • 一個寫請求,只有在該緩存行是M狀態(tài)或者E狀態(tài),才能被執(zhí)行,如果當(dāng)前狀態(tài)是處于S狀態(tài),它必須先將這個緩存中的該緩存行變成無效的狀態(tài),這個操作一般采取廣播的方式來完成,這個時候,它不允許不同的CPU同時修改同一個緩存行,主要是為了解決緩存一致性的問題;
  • 一個處于M狀態(tài)的緩存行,它必須時刻監(jiān)聽所有試圖讀該緩存行的操作,這種操作必須將緩存寫回到主內(nèi)存,并將狀態(tài)修改為S之前被延遲執(zhí)行;
  • 一個處于S狀態(tài)的緩存行,也必須監(jiān)聽其他緩存只被緩存行無效,或者獨享該緩存行的請求,并將緩存行變成無效;
  • 而一個處于E狀態(tài)的緩存行,它要監(jiān)聽其他緩存讀緩存中該緩存行的操作,一旦有該緩存行的操作,它需要將E狀態(tài)修改為S狀態(tài);

因此對于M和E,它的數(shù)據(jù)總是精確的,而S狀態(tài)可能是非一致的,如果一個緩存將處于S狀態(tài)的緩存行作廢了,另一個緩存實際上可能已經(jīng)獨享了該緩存行,但是該緩存卻不會將緩存行變更為E狀態(tài),這是因為其他緩存不會廣播他們作廢掉該緩存行的通知,同樣,由于緩存并沒有保存該緩存行的topic數(shù)量,因此也沒有辦法確認自己是否已經(jīng)獨享了該緩存行。

如果一個CPU想修改處于S狀態(tài)的緩存行,總線事務(wù)需要將所有該緩存行topic的值變成Invalid狀態(tài)才可以,而修改E狀態(tài)的緩存不需要使用總線事務(wù)。

四、MESI在并發(fā)包中的應(yīng)用

在cas原理分析中,我們講到cas底層原理使用到了總線鎖和緩存鎖,其中緩存鎖涉及到的就是MESI協(xié)議,緩存鎖加鎖條件就是緩存行處于M和E狀態(tài)下。

下面結(jié)合volatile保證內(nèi)存可見性為例,闡釋下MESI的工作原理。代碼示例:

public class VolatileCanSeeTest {


    private static boolean initFlag = false;


    public static void main(String[] args) throws InterruptedException {
        new Thread(() - > {
            log.info("init begin");
            while(!initFlag) {
            }


            // if(!initFlag) {while(true){}} // JIT
            log.info("===success===");
        }).start();


        Thread.sleep(1000);


        new Thread(() - > doSomething()).start();
    }


    public static void doSomething() {
        log.info("doSomething begin");
        initFlag = true;
        log.info("doSomething end");
    }
}

圖片

  • 初始化共享變量initFlag = false。
  • 線程1通過read指令從主內(nèi)存中讀取出共享變量initFlag = false,通過load指令加載到線程1的工作內(nèi)存中。
  • 在線程1的工作內(nèi)存中,通過use指令將共享變量initFlag = false加載到cpu執(zhí)行引擎進行!initFlag運算。
  • 在線程1的工作內(nèi)存中,通過assign指令將cpu執(zhí)行引擎計算后的共享變量initFlag = true賦值到線程1的工作內(nèi)存中。
  • 線程1通過store指令將線程1中工作內(nèi)存的共享變量同步到主內(nèi)存中。
  • 在線程1通過store指令將線程1中工作內(nèi)存的共享變量同步到主內(nèi)存中的過程中,會經(jīng)過總線,觸發(fā)cpu緩存一致性協(xié)議。
  • 該協(xié)議會監(jiān)聽回寫主內(nèi)存的變量,然后將其他工作內(nèi)存中含有該共享變量的緩存行狀態(tài)置為失效狀態(tài),所以其他線程需要重新從主內(nèi)存讀取該共享變量的最新值。
  • 以上我們分析了MESI協(xié)議中關(guān)于S共享狀態(tài)轉(zhuǎn)為I失效狀態(tài)的工作原理。

結(jié)語

上一篇我們分析了java內(nèi)存模型的原理,這篇總結(jié)下cas涉及到的cpu緩存一致性協(xié)議,通過這兩篇的介紹,我們就可以更深刻的理解cas是怎么保證原子性的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229853
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16361

    瀏覽量

    178071
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120377
  • 狀態(tài)機
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27541
  • JAVA語言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20095
收藏 人收藏

    評論

    相關(guān)推薦

    如何解決數(shù)據(jù)庫與緩存一致性

    緩存一致性 每次逢年過節(jié)的時候搶票非常艱難,放票的時候那么多人同時去搶票,如果所有人查詢、購票等都去訪問數(shù)據(jù)庫,那數(shù)據(jù)庫的壓力得有多大,這時候很多都會引入緩存, 把車票信息放入緩存,這
    的頭像 發(fā)表于 09-25 15:25 ?1113次閱讀
    如何解決數(shù)據(jù)庫與<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    小編科普CPU緩存一致性協(xié)議MESI

    什么是緩存一致性協(xié)議MESI?MESI協(xié)議中的狀態(tài)有哪幾種?
    發(fā)表于 06-17 10:00

    請教大神在Arm AMBA協(xié)議集中,什么叫緩存一致性?

    請教大神在Arm AMBA協(xié)議集中,什么叫緩存一致性?
    發(fā)表于 09-29 14:51

    改進的基于目錄的Cache一致性協(xié)議

    介紹幾種典型目錄一致性協(xié)議并分析它們的優(yōu)缺點。在綜合全映射目錄和有限目錄優(yōu)點的基礎(chǔ)上,通過在存儲器層上增加個存儲器高速緩存(Cache)層
    發(fā)表于 04-02 09:05 ?32次下載

    CMP中Cache一致性協(xié)議的驗證

    CMP是處理器體系結(jié)構(gòu)發(fā)展的個重要方向,其中Cache一致性問題的驗證是CMP設(shè)計中的項重要課題?;?b class='flag-5'>MESI一致性
    發(fā)表于 07-20 14:18 ?38次下載

    DMR空中接口協(xié)議一致性測試技術(shù)

    文章介紹了DMR的產(chǎn)生、發(fā)展以及DRM協(xié)議體系結(jié)構(gòu)?;?b class='flag-5'>協(xié)議一致性測試的基本概念,劃分了DRM協(xié)議一致性
    發(fā)表于 12-22 15:13 ?35次下載
    DMR空中接口<b class='flag-5'>協(xié)議</b><b class='flag-5'>一致性</b>測試技術(shù)

    RFID協(xié)議一致性測試系統(tǒng)設(shè)計(三)

      在具體實現(xiàn)了RFID協(xié)議一致性測試系統(tǒng)之后,我們將可以應(yīng)用于對RFID單元的實際測試之中,本節(jié)以EPC UHF Class 1 Gen 2(也被稱為ISO 18000-6 Type C)標準的協(xié)議
    發(fā)表于 03-28 17:37 ?1296次閱讀
    RFID<b class='flag-5'>協(xié)議</b><b class='flag-5'>一致性</b>測試系統(tǒng)設(shè)計(三)

    Cache一致性協(xié)議優(yōu)化研究

    問題的由來.總結(jié)了多核時代高速緩存一致性協(xié)議設(shè)計的關(guān)鍵問題,綜述了近年來學(xué)術(shù)界對一致性的研究.從程序訪存行為模式、目錄組織結(jié)構(gòu)、一致性粒度、
    發(fā)表于 12-30 15:04 ?0次下載
    Cache<b class='flag-5'>一致性</b><b class='flag-5'>協(xié)議</b>優(yōu)化研究

    自主駕駛系統(tǒng)將使用緩存一致性互連IP和非一致性互連IP

    代ASIL B(D)自主駕駛系統(tǒng)將使用符合ISO 26262標準的緩存一致性互連IP和非一致性互連IP來實現(xiàn)。 美國加利福尼亞州坎貝爾2019年4月26日消息—Arteris IP
    的頭像 發(fā)表于 05-09 17:13 ?3227次閱讀

    管理基于Cortex?-M7的MCU的高速緩存一致性

    本文檔概述了不同場景的高速緩存一致性問題,并就如何管理或避免高速緩存一致性問題提供了些方法建
    發(fā)表于 04-01 10:12 ?5次下載
    管理基于Cortex?-M7的MCU的高速<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

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

    CPU在摩爾定律的指導(dǎo)以每18個月翻番的速度在發(fā)展,然而內(nèi)存和硬盤的發(fā)展速度遠遠不及CPU。這就造成了高性能能的內(nèi)存和硬盤價格及其昂貴。然而CP
    的頭像 發(fā)表于 05-12 17:36 ?4361次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>MESI</b>詳解

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

    CPU在摩爾定律的指導(dǎo)以每18個月翻番的速度在發(fā)展,然而內(nèi)存和硬盤的發(fā)展速度遠遠不及CPU。這就造成了高性能能的內(nèi)存和硬盤價格及其昂貴。
    的頭像 發(fā)表于 06-09 10:39 ?903次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b><b class='flag-5'>協(xié)議</b><b class='flag-5'>MESI</b><b class='flag-5'>介紹</b>

    CPU緩存一致性協(xié)議解析

    CPU運行效率高不高,定程度取決于緩存,這里就給大家分享一下CPU緩存相關(guān)的內(nèi)容。
    的頭像 發(fā)表于 07-12 10:07 ?824次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b><b class='flag-5'>協(xié)議</b>解析

    如何保證緩存一致性

    “ 本文的參考文章是2022年HOT 34上Intel Rob Blakenship關(guān)于CXL緩存一致性介紹?!?/div>
    的頭像 發(fā)表于 10-19 17:42 ?1113次閱讀
    如何保證<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>

    異構(gòu)計算下緩存一致性的重要

    在眾多回復(fù)中,李博杰同學(xué)的回答被認為質(zhì)量最高。他首先將緩存一致性分為兩個主要場景:是主機內(nèi)CPU與設(shè)備間的一致性;二是跨主機的
    的頭像 發(fā)表于 10-24 17:00 ?547次閱讀
    異構(gòu)計算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>