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則不能。