Cache一致性協議與MESI(2)

Write invalidate提供了實現Cache一致性的簡單思想,處理器上會有一套完整的協議,來保證Cache一致性。比較經典的Cache一致性協議當屬MESI協議,奔騰處理器有使用它,不少其餘的處理器都是使用它的變種。oop

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

在MESI協議中,每一個Cache line有4個狀態,可用2個bit表示,它們分別是:blog

狀態 描述
M(Modified) 這行數據有效,數據被修改了,和內存中的數據不一致,數據只存在於本Cache中。
E(Exclusive) 這行數據有效,數據和內存中的數據一致,數據只存在於本Cache中。
S(Shared) 這行數據有效,數據和內存中的數據一致,數據存在於不少Cache中。
I(Invalid) 這行數據無效

MESI狀態事件

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

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

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

E狀態示例以下:it

E狀態table

只有Core 0訪問變量x,它的Cache line狀態爲E(Exclusive)。變量

S狀態示例以下:

S狀態

3個Core都訪問變量x,它們對應的Cache line爲S(Shared)狀態。

M狀態和I狀態示例以下:

M狀態和I狀態

Core 0修改了x的值以後,這個Cache line變成了M(Modified)狀態,其餘Core對應的Cache line變成了I(Invalid)狀態。
在MESI協議中,每一個Cache的Cache控制器不只知道本身的讀寫操做,並且也監聽(snoop)其它Cache的讀寫操做。每一個Cache line所處的狀態根據本核和其它核的讀寫操做在4個狀態間進行遷移。

MESI協議狀態遷移圖以下:

MESI協議狀態遷移圖

在上圖中,Local Read表示本內核讀本Cache中的值,Local Write表示本內核寫本Cache中的值,Remote Read表示其它內核讀其它Cache中的值,Remote Write表示其它內核寫其它Cache中的值,箭頭表示本Cache line狀態的遷移,環形箭頭表示狀態不變。

MESI狀態之間的遷移過程以下:

當前狀態 事件 行爲 下一個狀態
I(Invalid) Local Read 從Memory中取數據,

狀態變成E

E
Local Write 從Memory中取數據,在Cache中修改,

狀態變成M

M
Remote Read 既然是Invalid,別的核的操做與它無關 I
Remote Write 既然是Invalid,別的核的操做與它無關 I
E(Exclusive) Local Read 從Cache中取數據,

狀態不變

E
Local Write 修改Cache中的數據,

狀態變成M

M
Remote Read 數據和其餘核共用,狀態變成了S S
Remote Write 數據被修改,本Cache line不能再使用,狀態變成I I
S(Shared) Local Read 從Cache中取數據,

狀態不變

S
Local Write 修改Cache中的數據,

狀態變成M,

其餘核共享的Cache line置無效

M
Remote Read 狀態不變 S
Remote Write 數據被修改,本Cache line不能再使用,狀態變成I I
M(Modified) Local Read 從Cache中取數據,

狀態不變

M
Local Write 修改Cache中的數據,狀態不變 M
Remote Read 這行數據被寫到內存中,使其它核能使用到最新的數據,

狀態變成S

S
Remote Write 這行數據被寫到內存中,使其它核能使用到最新的數據,因爲其它核會修改這行數據,

狀態變成I

I

MESI狀態遷移

AMD的Opteron處理器使用從MESI中演化出的MOSEI協議,O(Owned)是MESI中S和M的一個合體,表示本Cache line被修改,和內存中的數據不一致,不過其它的核能夠有這份數據的拷貝,狀態爲S。

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

相關文章
相關標籤/搜索