快取一致性協議MESI

2021-10-07 21:32:41 字數 2915 閱讀 5622

處理器上有一套完整的協議,來保證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則不能。

MESI(快取一致性協議)

現在的處理器都是多核處理器,並且每個核都帶有多個快取 指令快取和資料快取,見下圖 為什麼需要快取呢,這是因為cpu訪問記憶體的速度比較慢,所以在cpu和記憶體之間加了個快取以提高訪問速度。既然每個核都有快取,那麼假設兩個核或者多個核同時訪問同乙個變數時這些快取是如何進行同步的呢 快取細分為乙個個快取...

快取一致性協議(MESI協議)

大家都知道,計算機在執行程式時,每條指令都是在cpu中執行的,而執行指令過程中,勢必涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在主存 物理記憶體 當中的,這時就存在乙個問題,由於cpu執行速度很快,而從記憶體讀取資料和向記憶體寫入資料的過程跟cpu執行指令的速度比起來要慢的多,因此如...

CPU 一致性快取協議MESI

計算機在執行指令的時候都是通過cpu進行逐條執行而在執行指令的過程中勢必涉及對資料的讀寫,而資料基本從磁碟載入到記憶體中cpu直接使用記憶體中的資料 由於cpu計算速度遠大於對記憶體的讀寫速度如果任何資料的讀寫都通過記憶體cpu的效率將會大打折扣,因此在cpu中引入暫存器作為快取記憶體提高系統效率例...