緩存一致性(MESI)

所以就出現了緩存一致性協議。最出名的就是Intel 的MESI協議,MESI協議保證了每個緩存中使用的共享變量的副本是一致的。它核心的思想是:當CPU寫數據時,如果發現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發出信號通知其他CPU將該變量的緩存行置爲無效狀態,因此當其他CPU需要讀取這個變量時,發現自己緩存中緩存該變量的緩存行是無效的,那麼它就會從內存重新讀取。

Cache一致性協議之MESI
處理器上有一套完整的協議,來保證Cache一致性。比較經典的Cache一致性協議當屬MESI協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。

單核Cache中每個Cache line有2個標誌:dirty和valid標誌,它們很好的描述了Cache和Memory(內存)之間的數據關係(數據是否有效,數據是否被修改),而在多核處理器中,多個核會共享一些數據,MESI協議就包含了描述共享的狀態。

在MESI協議中,每個Cache line有4個狀態,可用2個bit表示,它們分別是:
這裏寫圖片描述
MESI狀態

M(Modified)和E(Exclusive)狀態的Cache line,數據是獨有的,不同點在於M狀態的數據是dirty的(和內存的不一致),E狀態的數據是clean的(和內存的一致)。

S(Shared)狀態的Cache line,數據和其他Core的Cache共享。只有clean的數據才能被多個Cache共享。

I(Invalid)表示這個Cache line無效。

E狀態示例如下:
這裏寫圖片描述
只有Core 0訪問變量x,它的Cache line狀態爲E(Exclusive)。
S狀態示例如下:
這裏寫圖片描述
3個Core都訪問變量x,它們對應的Cache line爲S(Shared)狀態。

M狀態和I狀態示例如下:
這裏寫圖片描述
Core 0修改了x的值之後,這個Cache line變成了M(Modified)狀態,其他Core對應的Cache line變成了I(Invalid)狀態。

在MESI協議中,每個Cache的Cache控制器不僅知道自己的讀寫操作,而且也監聽(snoop)其它Cache的讀寫操作。每個Cache line所處的狀態根據本核和其它核的讀寫操作在4個狀態間進行遷移。

MESI協議狀態遷移圖如下:
這裏寫圖片描述
在上圖中,Local Read表示本內核讀本Cache中的值,Local Write表示本內核寫本Cache中的值,Remote Read表示其它內核讀其它Cache中的值,Remote Write表示其它內核寫其它Cache中的值,箭頭表示本Cache line狀態的遷移,環形箭頭表示狀態不變。

當內核需要訪問的數據不在本Cache中,而其它Cache有這份數據的備份時,本Cache既可以從內存中導入數據,也可以從其它Cache中導入數據,不同的處理器會有不同的選擇。MESI協議爲了使自己更加通用,沒有定義這些細節,只定義了狀態之間的遷移,下面的描述假設本Cache從內存中導入數據。

MESI狀態之間的遷移過程如下:
這裏寫圖片描述
AMD的Opteron處理器使用從MESI中演化出的MOESI協議,O(Owned)是MESI中S和M的一個合體,表示本Cache line被修改,和內存中的數據不一致,不過其它的核可以有這份數據的拷貝,狀態爲S。

Intel的core i7處理器使用從MESI中演化出的MESIF協議,F(Forward)從Share中演化而來,一個Cache line如果是Forward狀態,它可以把數據直接傳給其它內核的Cache,而Share則不能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章