1. 程式人生 > >Cache一致性協議MESI

Cache一致性協議MESI

今天談一談Cache(快取記憶體)如何保持一致性。
一個比較經典的協議MESI協議是如何保證Cache和記憶體的一致性的。

都知道Cache的誕生是因為動態記憶體太慢跟不上CPU的步伐,所以有了小儲存空間的cache在中間做為一個過渡。也就是cache裡會有一份記憶體的拷貝。CPU會和Cache進行資料或者指令的讀寫。

MESI實質上是一種狀態機。
M(modify修改) E(exclusive獨佔) S(share 共享) I(invalid無效)
也就是cache line單元的狀態在這四種之間切換

M狀態: Cache裡面資料的內容被修改了,但是記憶體裡的內容還沒有被修改,所以造成了資料的不一致。所以這個cache line單元的狀態為M。
E狀態: 記憶體裡的資料只存在於當前cache line 中。(在多核架構中,每一個核都有本地的cache,有 可能載入了同一個記憶體的內容到本地的cache)
S狀態: 記憶體裡的資料存在於多個cache中。
I狀態 : 當前cache line 中的資料無效。

舉個例子,我有4個CPU核A B C D,有個變數x位於記憶體,A核現在要使用變數x,就把它從記憶體載入到A所屬的cache當中來,然後這個單元的cache line狀態就會變為 E(獨佔),這時候B又用到了變數x,所以由把它載入到B來。(cache 之間是互相監視的),這個時候A核狀態變為S狀態(共享),B也變為S狀態。
這個時候B在修改變數x的值,這個時候,x變數的值沒有被寫回記憶體,只是暫時改變了B核內部的cache line,這個時候B的cache line 狀態為M(修改),A的狀態就會變為I(失效)。下次A在訪問x變數的時候,B就會將cache line的內容寫回到記憶體中,並將狀態變為E,然後A會重新在記憶體中載入變數x,並且在將A和B 的狀態都變為 S。

有沒說清楚的地方留言