處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。
單核cache中每個cache line有2個標誌:dirty和valid標誌,它們很好的描述了cache和memory(記憶體)之間的資料關係(資料是否有效,資料是否被修改),而在多核處理器中,多個核會共享一些資料,mesi協議就包含了描述共享的狀態。
在mesi協議中,每個cache line有4個狀態,可用2個bit表示,它們分別是:
狀態描述
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,資料和其他core的cache共享。只有clean的資料才能被多個cache共享。
i(invalid)表示這個cache line無效。
e狀態示例如下:
e狀態只有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狀態的遷移,環形箭頭表示狀態不變。
當核心需要訪問的資料不在本cache中,而其它cache有這份資料的備份時,本cache既可以從記憶體中匯入資料,也可以從其它cache中匯入資料,不同的處理器會有不同的選擇。mesi協議為了使自己更加通用,沒有定義這些細節,只定義了狀態之間的遷移,下面的描述假設本cache從記憶體中匯入資料。
mesi狀態之間的遷移過程如下:
當前狀態
事件行為
下乙個狀態
i(invalid)
local read
如果其它cache沒有這份資料,本cache從記憶體中取資料,cache line狀態變成e;
如果其它cache有這份資料,且狀態為m,則將資料更新到記憶體,本cache再從記憶體中取資料,2個cache 的cache line狀態都變成s;
如果其它cache有這份資料,且狀態為s或者e,本cache從記憶體中取資料,這些cache 的cache line狀態都變成s
e/slocal write
從記憶體中取資料,在cache中修改,狀態變成m;
如果其它cache有這份資料,且狀態為m,則要先將資料更新到記憶體;
如果其它cache有這份資料,則其它cache的cache line狀態變成i
mremote read
既然是invalid,別的核的操作與它無關
iremote write
既然是invalid,別的核的操作與它無關
ie(exclusive)
local read
從cache中取資料,狀態不變
elocal write
修改cache中的資料,狀態變成m
mremote read
資料和其它核共用,狀態變成了s
sremote write
資料被修改,本cache line不能再使用,狀態變成i
is(shared)
local read
從cache中取資料,狀態不變
slocal write
修改cache中的資料,狀態變成m,
其它核共享的cache line狀態變成i
mremote read
狀態不變
sremote write
資料被修改,本cache line不能再使用,狀態變成i
im(modified)
local read
從cache中取資料,狀態不變
mlocal write
修改cache中的資料,狀態不變
mremote read
這行資料被寫到記憶體中,使其它核能使用到最新的資料,狀態變成s
sremote write
這行資料被寫到記憶體中,使其它核能使用到最新的資料,由於其它核會修改這行資料,
狀態變成i
imesi狀態遷移
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則不能。
《大話處理器》Cache一致性協議之MESI
處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...
《大話處理器》Cache一致性協議之MESI
處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...
Cache一致性協議之MESI
處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...