mesi--cpu記憶體一致性協議

Jeff的技術棧發表於2022-07-08

cpu快取一致性問題

一個伺服器中有多個核,每個核中有多個cpu,每個cpu有多個執行緒。快取最少分為3級,1級為執行緒快取,2級為核快取,3級為多個核共享快取。

產生快取一致性問題:cpu主快取count=0,此時執行緒A需要對count+1,執行緒B需要count+1,但是執行緒A讀取count=0,修改了count+1還沒來得及提交,執行緒B讀取的還是count=0,然後執行緒A,執行緒B都提交到cpu主快取,此時count=1,產生錯誤,應該count=2

解決方式:
1.cpu主快取加鎖,產生問題效率變低,因為執行緒A使用count時,其他cpu執行緒都在等待
2.快取一致性協議mesi:對單個快取行進行加鎖,不會影響cpu的其他執行緒

mesi協議

mesi協議:為了解決cpu快取一致性問題

mesi協議的4種狀態:m e s i
MESI是Midified(已修改),Exclusive(獨佔),Shared(共享),Invalidated(已失效)的縮寫,對應Cache Line的四種狀態。

多核CPU的cache和記憶體的構成可以簡化為:每個CPU有自己的獨有的cache,然後大家共享記憶體,當每個CPU從cache中讀取資料時,如何保證所有cache和記憶體中資料的一致性,即使MESI協議要解決的問題。

mesi協議4種狀態,及狀態轉換

狀態解釋:

【M已修改】: 即髒標記,表示當前cache line中的資料已經被修改,沒有被寫到記憶體中。
【i已失效】: 狀態,表示這個cache line裡的資料已經失效,是不可以讀取的資料。
【E獨佔】和【S共享】:狀態都表示這個cache line中的資料是乾淨的(即與記憶體中的資料是一致的,共享同時也表示與其他cpu cache中的資料是一致的)。

狀態轉換:

E獨佔:資料只在被一個cpu讀取。
S共享:獨佔狀態基礎上,又有其他cpu讀取這份資料到自己的快取行。代表同一份資料在多個cpu的快取行中
i已失效:當共享狀態時,代表同一份資料在多個cpu的快取行中,不能直接修改,而是要先向所有的其他 CPU 核心廣播一個請求,要求先把其他核心的 Cache 中對應的 Cache Line 標記為【已失效】狀態,然後再更新當前Cache 裡面的資料(這時資料的狀態就變為獨佔的)

模擬工具演示

https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

相關文章