1. 程式人生 > 其它 >MESI 快取一致性協議

MESI 快取一致性協議

MESI協議

MESI協議是基於Invalidate的快取記憶體一致性協議,並且是支援回寫快取記憶體的最常用協議之一

此外還有一些其他的快取一致性協議比如:MSI,MOSI,Synapse,Firefly及DragonProtocol等等

主流的計算機cpu執行,簡要流程

如下圖所示:

執行資料載入的流程如下:

  1. 將程式和資料從硬碟載入到記憶體中去
  2. 將資料從記憶體中載入到CPU的快取中去,大多為三級快取(L3 -> L2 -> L1)
  3. CPU取快取中的資料,載入到暫存器中,進行計算
  4. CPU將計算完成的資料重新整理回快取,在一定的條件會重新整理回記憶體中去,保持資料的一致性

為什麼需要快取一致性協議

在現在CPU多為多核的情況下,每個核心有自己單獨的快取區,當多個核心一起操作多個執行緒對同一個資料進行操作時,如果在核心B在核心A把修改完之後的資料重新整理回記憶體中去之前,進行了資料的操作,就會導致資料的不確定性。

匯流排加鎖可以解決這種情況,但是在加鎖的時候,在一個核心操作該資料完成前,其他核心也無法修改其他資料,這會導致CPU的效能嚴重下降。

快取一致性協議只會對單個的快取行進行類似加鎖的操作,來進可能的保證資料的一致性

MESI的狀態

MESI的四個字母就是標記快取行的四種狀態 M E S I

狀態 描述 狀態改變條件
M 修改 (Modify) 表示該快取行有效,但是是被更改過的,與記憶體中的資料並不一致,並且該快取行只存在於本快取中
(舉例:我們有三個CPU,每個CPU都有自己的快取區域,那麼M表示CPU-A從記憶體中取到了資料,其他CPU並沒有取此資料(只存在於本快取中),CPU-A還把該資料進行了更改,導致與記憶體中的源資料並不一致)
當有其他試圖讀取該快取在記憶體中的源資料時,它們須等待此快取寫回到記憶體,這時此快取行的狀態為S
E 獨佔 (Exclusive) 表示該快取行有效,資料和記憶體中的一致(乾淨),並且資料只存在於本快取行中 如果有相應的其他讀取記憶體中關於本快取行的操作時,會將自身的狀態更改為S。
S 共享 (Shared) 表示該快取行有效,資料和記憶體中的一致,並且資料也同時存在於其他快取中 如果其他快取將該資料在它當前所在的快取區域內將快取修改,那麼其他沒有修改的快取就需要把S狀態修改為I狀態
I 無效 (Invalid) 該快取行資料無效

那麼接下來我們來看幾張圖來理解這幾個狀態:

M (修改)和 E (獨佔)的描述(不包括狀態改變條件)

我們先只關心CPU-1 的操作步驟

  1. 我們先發出了一條指令,要讀取記憶體中a0的資料
  2. 我們經過匯流排等步驟,來到了記憶體
  3. 我們從記憶體中取到了資料並放入到了快取中,此時這個快取行的狀態為E (獨佔,只存在於當前資料行中,並且乾淨)
  4. CPU獲得資料
  1. 我們這個時候選擇了修改a0的資料,那麼我們就會直接修改位於我們當下緩衝區中資料

    此時我們修改成功,a0的資料狀態成功的變為了M (快取行有效,只存在於當前快取行中,於記憶體中的不一致)

    我們來看下記憶體中目前的a0資料:

S(共享)
  1. 我們直接用CPU-0、CPU-1、CPU-2 都發出了read a0的指令,那麼此時它們三個的緩衝區都有此資料,並且都沒有修改是乾淨的,那麼它們的狀態就都為S
M (修改)狀態改變條件描述

此時我們先在CPU-1中讀取並修改了a0所以它的目前狀態為M(修改)

接下來我們在CPU-0中讀取位於記憶體中的a0資料,看看會發生什麼?

  1. CPU-0發出read a0的指令,這個時候通過資料匯流排(ADDRESS BUS)對CUP-1的資料進行同步
  2. 第一步這個時候CPU-1中M狀態的a0資料狀態修改為S(共享)這個時候開始把資料與記憶體中的資料進行同步

​ 第二步,這個時候記憶體中同步了被修改的資料,然後被CPU-0進行讀取,並把S狀態的資料放入自己的快取,然後讀取a0,執行完畢

E(獨佔)狀態改變條件描述

此時只有CPU-1有a0這個資料,所以它是符合E(獨佔)的狀態

接下來讓我們再用CPU-0來讀取a0來看看

不出所料當CPU-0讀取資料的時候,它們就符合了共享的條件,那麼它們的狀態就會更改為S

S (共享) 狀態改變條件描述

此時我們三個CPU都擁有a0的資料快取,所以它們的狀態都有S(共享),那麼我們寫入其中一個數據

當我們更改了CPU-1的資料時,我們會同步記憶體中的資料,使其保持最新,然後把其他CPU中的快取資料狀態置為I(無效、該快取行無效)的狀態

MESI的缺點

如果由特定塊上的各種快取記憶體執行連續讀取和寫入操作,則每次都必須將資料重新整理到總線上。因此,主儲存器將在每次沖洗時拉動它並保持清潔狀態。但這不是一項要求,只是由於MESI的實施而導致的額外開銷。 MOESI協議克服了這一挑戰