Java併發 Cache一致性協議之MESI

2021-08-18 08:03:04 字數 2916 閱讀 8459

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

這行資料被寫到記憶體中,使其它核能使用到最新的資料,由於其它核會修改這行資料,

狀態變成ii

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

Cache 快取一致性

就硬體而言,cpu 晶元 處理器 記憶體 匯流排 磁碟等等,構成了一台電腦,當電腦執行乙個程式的時候,需要從磁碟讀到主記憶體,主記憶體再到快取,最後交由cpu執行。隨著現在的多核處理器的發展,運算的速度是越來越快,但是在運算的同時,也要遇到快取一致性的問題,簡單來說,多核處理器,每個核上有個多個處理...

Cache與一致性

3 知識點摘記 3.2 編譯屏障和記憶體屏障 參考文獻 對於cache cache一致性 記憶體一致性 記憶體屏障 原子操作等話題,涉及到很多處理器體系結構的細節,比較難懂。本文不會系統的分析這些問題,一是水平有限,二是工作量太大,三是目前已經有相關的高質量書籍和網路資料。所以本文著力收集一些相關話...

Java併發 快取一致性

cpu的時鐘頻率非常的快,跑起來的速度遠遠超過了記憶體 硬碟。碼農翻身 形象的比喻cpu為阿甘,跑的速度是記憶體的100倍,硬碟的1000多萬倍。如果直接靠cpu直接和記憶體打交道,那麼cpu要等待太久,浪費資源。我們平時編寫的程式中,包含著很多連續建立的陣列 物件,各種迴圈 遞迴 呼叫同一函式等,...