在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

CPU緩存一致性協議MESI詳解

Linux內核補給站 ? 來源:Linux內核補給站 ? 作者:Linux內核補給站 ? 2022-05-12 17:36 ? 次閱讀

CPU緩存一致性協議MESI

CPU高速緩存(Cache Memory)

CPU為何要有高速緩存

CPU在摩爾定律的指導下以每18個月翻一番的速度在發展,然而內存和硬盤的發展速度遠遠不及CPU。這就造成了高性能能的內存和硬盤價格及其昂貴。然而CPU的高度運算需要高速的數據。為了解決這個問題,CPU廠商在CPU中內置了少量的高速緩存以解決I\O速度和CPU運算速度之間的不匹配問題。


在CPU訪問存儲設備時,無論是存取數據抑或存取指令,都趨于聚集在一片連續的區域中,這就被稱為局部性原理。

時間局部性(Temporal Locality):如果一個信息項正在被訪問,那么在近期它很可能還會被再次訪問。

比如循環、遞歸、方法的反復調用等。

空間局部性(Spatial Locality):如果一個存儲器的位置被引用,那么將來他附近的位置也會被引用。

比如順序執行的代碼、連續創建的兩個對象、數組等。

帶有高速緩存的CPU執行計算的流程

程序以及數據被加載到主內存

指令和數據被加載到CPU的高速緩存

CPU執行指令,把結果寫到高速緩存

高速緩存中的數據寫回主內存


poYBAGJ81TeAREV5AABfKtdk1SQ701.jpg?source=d16d100b

目前流行的多級緩存結構

由于CPU的運算速度超越了1級緩存的數據I\O能力,CPU廠商又引入了多級的緩存結構。

多級緩存結構


pYYBAGJ81TeAeNlAAABuR2HAUr4851.jpg?source=d16d100b


多核CPU多級緩存一致性協議MESI

多核CPU的情況下有多個一級緩存,如何保證緩存內部數據的一致,不讓系統數據混亂。這里就引出了一個一致性的協議MESI。

MESI協議緩存狀態

MESI 是指4中狀態的首字母。每個Cache line有4個狀態,可用2個bit表示,它們分別是:

緩存行(Cache line):緩存存儲數據的單元。

狀態 描述 監聽任務
M 修改 (Modified) 該Cache line有效,數據被修改了,和內存中的數據不一致,數據只存在于本Cache中。 緩存行必須時刻監聽所有試圖讀該緩存行相對就主存的操作,這種操作必須在緩存將該緩存行寫回主存并將狀態變成S(共享)狀態之前被延遲執行。
E 獨享、互斥 (Exclusive) 該Cache line有效,數據和內存中的數據一致,數據只存在于本Cache中。 緩存行也必須監聽其它緩存讀主存中該緩存行的操作,一旦有這種操作,該緩存行需要變成S(共享)狀態。
S 共享 (Shared) 該Cache line有效,數據和內存中的數據一致,數據存在于很多Cache中。 緩存行也必須監聽其它緩存使該緩存行無效或者獨享該緩存行的請求,并將該緩存行變成無效(Invalid)。
I 無效 (Invalid) 該Cache line無效。

注意:

對于M和E狀態而言總是精確的,他們在和該緩存行的真正狀態是一致的,而S狀態可能是非一致的。如果一個緩存將處于S狀態的緩存行作廢了,而另一個緩存實際上可能已經獨享了該緩存行,但是該緩存卻不會將該緩存行升遷為E狀態,這是因為其它緩存不會廣播他們作廢掉該緩存行的通知,同樣由于緩存并沒有保存該緩存行的copy的數量,因此(即使有這種通知)也沒有辦法確定自己是否已經獨享了該緩存行。

從上面的意義看來E狀態是一種投機性的優化:如果一個CPU想修改一個處于S狀態的緩存行,總線事務需要將所有該緩存行的copy變成invalid狀態,而修改E狀態的緩存不需要使用總線事務。

MESI狀態轉換


poYBAGJ81TeAKCT6AABj_cLiMsE752.jpg?source=d16d100b

?

理解該圖的前置說明:

1.觸發事件

pYYBAGJ81TeAD7KDAAAVKB46ypw095.jpg?source=d16d100b

?

2.cache分類:

前提:所有的cache共同緩存了主內存中的某一條數據。

本地cache:指當前cpu的cache。

觸發cache:觸發讀寫事件的cache。

其他cache:指既除了以上兩種之外的cache。

注意:本地的事件觸發 本地cache和觸發cache為相同。

上圖的切換解釋:

poYBAGJ81TeAUrOpAAEaGBQSlOI522.jpg?source=d16d100b

?

下圖示意了,當一個cache line的調整的狀態的時候,另外一個cache line 需要調整的狀態。

pYYBAGJ81TeAKrjUAAAITZyUA1s380.jpg?source=d16d100b

?

舉個栗子來說:

假設cache 1 中有一個變量x = 0的cache line 處于S狀態(共享)。

那么其他擁有x變量的cache 2、cache 3等x的cache line調整為S狀態(共享)或者調整為 I 狀態(無效)。

多核緩存協同操作

假設有三個CPU A、B、C,對應三個緩存分別是cache a、b、 c。在主內存中定義了x的引用值為0。

poYBAGJ81TiAWIepAABf7JAwbRo343.jpg?source=d16d100b

?

單核讀取

那么執行流程是:

CPU A發出了一條指令,從主內存中讀取x。

從主內存通過bus讀取到緩存中(遠端讀取Remote read),這是該Cache line修改為E狀態(獨享).

pYYBAGJ81TiASUecAABrR08-rH4486.jpg?source=d16d100b

?

雙核讀取

那么執行流程是:

CPU A發出了一條指令,從主內存中讀取x。

CPU A從主內存通過bus讀取到 cache a中并將該cache line 設置為E狀態。

CPU B發出了一條指令,從主內存中讀取x。

CPU B試圖從主內存中讀取x時,CPU A檢測到了地址沖突。這時CPU A對相關數據做出響應。此時x 存儲于cache a和cache b中,x在chche a和cache b中都被設置為S狀態(共享)。

poYBAGJ81TiAQ--5AAB3ADfoh-Q213.jpg?source=d16d100b

?

修改數據

那么執行流程是:

CPU A 計算完成后發指令需要修改x.

CPU A 將x設置為M狀態(修改)并通知緩存了x的CPU B, CPU B將本地cache b中的x設置為I狀態(無效)

CPU A 對x進行賦值。

pYYBAGJ81TiAZqqGAABtx7l_q38827.jpg?source=d16d100b

?

同步數據

那么執行流程是:

CPU B 發出了要讀取x的指令。

CPU B 通知CPU A,CPU A將修改后的數據同步到主內存時cache a 修改為E(獨享)

CPU A同步CPU B的x,將cache a和同步后cache b中的x設置為S狀態(共享)。

poYBAGJ81TiAUDdRAAB8WOeaddQ727.jpg?source=d16d100b

?

MESI優化和他們引入的問題

緩存的一致性消息傳遞是要時間的,這就使其切換時會產生延遲。當一個緩存被切換狀態時其他緩存收到消息完成各自的切換并且發出回應消息這么一長串的時間中CPU都會等待所有緩存響應完成。可能出現的阻塞都會導致各種各樣的性能問題和穩定性問題。

CPU切換狀態阻塞解決-存儲緩存(Store Bufferes)

比如你需要修改本地緩存中的一條信息,那么你必須將I(無效)狀態通知到其他擁有該緩存數據的CPU緩存中,并且等待確認。等待確認的過程會阻塞處理器,這會降低處理器的性能。應為這個等待遠遠比一個指令的執行時間長的多。

Store Bufferes

為了避免這種CPU運算能力的浪費,Store Bufferes被引入使用。處理器把它想要寫入到主存的值寫到緩存,然后繼續去處理其他事情。當所有失效確認(Invalidate Acknowledge)都接收到時,數據才會最終被提交。 這么做有兩個風險

Store Bufferes的風險

第一、就是處理器會嘗試從存儲緩存(Store buffer)中讀取值,但它還沒有進行提交。這個的解決方案稱為Store Forwarding,它使得加載的時候,如果存儲緩存中存在,則進行返回。 第二、保存什么時候會完成,這個并沒有任何保證。

value = 3;

void exeToCPUA(){
  value = 10;
  isFinsh = true;
}
void exeToCPUB(){
  if(isFinsh){
    //value一定等于10?!
    assert value == 10;
  }
}

試想一下開始執行時,CPU A保存著finished在E(獨享)狀態,而value并沒有保存在它的緩存中。(例如,Invalid)。在這種情況下,value會比finished更遲地拋棄存儲緩存。完全有可能CPU B讀取finished的值為true,而value的值不等于10。

即isFinsh的賦值在value賦值之前。

這種在可識別的行為中發生的變化稱為重排序(reordings)。注意,這不意味著你的指令的位置被惡意(或者好意)地更改。

它只是意味著其他的CPU會讀到跟程序中寫入的順序不一樣的結果。

順便提一下NIO的設計和Store Bufferes的設計是非常相像的。

硬件內存模型

執行失效也不是一個簡單的操作,它需要處理器去處理。另外,存儲緩存(Store Buffers)并不是無窮大的,所以處理器有時需要等待失效確認的返回。這兩個操作都會使得性能大幅降低。為了應付這種情況,引入了失效隊列。它們的約定如下:

對于所有的收到的Invalidate請求,Invalidate Acknowlege消息必須立刻發送

Invalidate并不真正執行,而是被放在一個特殊的隊列中,在方便的時候才會去執行。

處理器不會發送任何消息給所處理的緩存條目,直到它處理Invalidate。

即便是這樣處理器已然不知道什么時候優化是允許的,而什么時候并不允許。

干脆處理器將這個任務丟給了寫代碼的人。這就是內存屏障(Memory Barriers)。

寫屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb)是一條告訴處理器在執行這之后的指令之前,應用所有已經在存儲緩存(store buffer)中的保存的指令。 讀屏障Load Memory Barrier (a.k.a. LD, RMB, smp_rmb)是一條告訴處理器在執行任何的加載前,先應用所有已經在失效隊列中的失效操作的指令。

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

現在確實安全了。完美無暇!

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10889

    瀏覽量

    212379
  • 內存
    +關注

    關注

    8

    文章

    3040

    瀏覽量

    74171
  • 高速緩存
    +關注

    關注

    0

    文章

    30

    瀏覽量

    11078
收藏 人收藏

    評論

    相關推薦

    如何解決數據庫與緩存一致性

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

    小編科普CPU緩存一致性協議MESI

    什么是緩存一致性協議MESIMESI協議中的狀態有哪幾種?
    發表于 06-17 10:00

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

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

    CMP中Cache一致性協議的驗證

    CMP是處理器體系結構發展的個重要方向,其中Cache一致性問題的驗證是CMP設計中的項重要課題。基于MESI一致性
    發表于 07-20 14:18 ?38次下載

    RFID協議一致性測試系統設計(二)

      軟件無線電這關鍵技術的應用,使得RFID協議一致性測試系統能夠突破傳統儀器受專有硬件限制的局限性,在標準化、模塊化、層次化的體系結構上滿足一致性測試的需求。RFID
    發表于 03-28 17:37 ?1449次閱讀
    RFID<b class='flag-5'>協議</b><b class='flag-5'>一致性</b>測試系統設計(二)

    RFID協議一致性測試系統設計(三)

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

    Cache一致性協議優化研究

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

    自主駕駛系統將使用緩存一致性互連IP和非一致性互連IP

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

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

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

    CPU緩存一致性協議MESI介紹

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

    介紹下cpu緩存一致性MESI協議

    之前介紹了java并發包的cas原理和java內存模型,這篇我們介紹下cpu緩存一致性原理,可以幫助我們更好的理解cas的底層原理。
    的頭像 發表于 06-09 16:01 ?4731次閱讀
    介紹下<b class='flag-5'>cpu</b><b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>(<b class='flag-5'>MESI</b><b class='flag-5'>協議</b>)

    CPU緩存一致性協議解析

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

    如何保證緩存一致性

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

    Redis緩存與Mysql如何保證一致性

    基本流程就是客戶端A請求,先去刪除緩存,然后將數據寫入數據庫,此時客戶端B查詢先去查詢緩存緩存沒有返回,去查數據庫,此時還沒有完成主從同步,拿到是從庫的舊數據,然后將舊數據進行緩存
    的頭像 發表于 12-02 14:23 ?950次閱讀
    Redis<b class='flag-5'>緩存</b>與Mysql如何保證<b class='flag-5'>一致性</b>?

    異構計算下緩存一致性的重要

    在眾多回復中,李博杰同學的回答被認為質量最高。他首先將緩存一致性分為兩個主要場景:是主機內CPU與設備間的一致性;二是跨主機的
    的頭像 發表于 10-24 17:00 ?677次閱讀
    異構計算下<b class='flag-5'>緩存</b><b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>
    主站蜘蛛池模板: 乱人伦小说短篇| 自拍偷拍综合网| 亚洲深夜| 久久久精品波多野结衣| 成年片免费网址网站| 欧美亚洲综合一区| 亚洲成色www久久网站| 亚洲午夜视频| 国产一卡二卡3卡4卡四卡在线| 四虎影院在线视频| 老司机精品免费视频| 中文字幕三级| 日本一区二区不卡视频| 97国内精品久久久久久久影视| 天天操天天操天天| ass嫩美女胴体| 国产色窝| 永久在线观看| se94se亚洲欧美在线| 黄色短视频软件| 欧美大胆一级视频| 日本免费a级片| 色婷婷电影| 手机在线看片你懂得| 迅雷www天堂在线资源| 99久久精品免费精品国产| 一区二区三区免费在线| 欧美巨大xxxx做受中文字幕| 国产真实乱在线更新| 日韩美女影院| 深夜视频在线观看免费| www在线视频| 5566精品资源在线播放| 干成人| 免费看大黄| 美女丝袜长腿喷水gif动态图| 国产综合在线观看| 日本不卡视频一区二区三区| 亚洲成人免费看| 久久www免费人成_看| 黄色毛片免费进入|