快取一致性演算法是為了解決多核處理器之前獨佔快取的快取一致性問題而提出的。
現代計算機架構,根據成本和io速度將儲存分為了暫存器、l1/l2/l3cache、ssd、hdd等多種儲存介質,其中在多核處理器中,由於每個處理器有自己的l1/l2cache,那麼如何保證多個處理器之間的l1/l2cache的資料一致性成為了乙個問題。
並且如何保證cache盡可能少的和主存進行讀寫也是一大問題。
在了解mesi協議之前,我們需要知道幾個概念:
cache:這裡特指處理器的l1\l2快取,因為這兩個是處理器獨享的。
bus:匯流排,可以監聽每個處理器cache的讀寫操作。由於本次匯流排監聽不是重點,這裡我們只需要知道匯流排可以知道每個處理器cache的讀寫操作,並且可以把這種操作進行廣播就可以了。
處理器對cache的操作:分為讀/寫兩種;此時不同cache根據自身的狀態不同,可能會進行兩種操作:總寫讀\匯流排寫。
匯流排的操作:匯流排的操作分為匯流排讀和匯流排寫(在這裡為了簡單,我們不區分匯流排寫入已有cache和未有cache),同時不同的cache根據此時自身的狀態可能會選擇忽略匯流排操作,或者是接受匯流排操作然後進行狀態更改。
寫回操作(write back):cache將自身的資料寫入到主存當中。
可以從此圖看到處理器、cache、匯流排以及主存之間的關係。
cache line的具體概念這裡就不細說了,可以理解為cache被拆分了很多小塊,其中的最小塊單位就叫cache line。
這裡根據cache line中的資料將cache line分為了四大狀態
invalid(失效):處於該狀態的cache line,其中的資料是無效的。可以理解為cache line的初始狀態。
exclusive(獨佔):處於該狀態的cache line,可以理解為只有這個cache line快取了對應主存位址為px的資料,其他的cache line(包括其他處理器)都沒有快取px的資料。
modified(已修改):處於該狀態的cache line,是能夠減少cache和主存互動的關鍵,因為處於該狀態的cache line,只要沒有其他的處理器讀寫這份資料,那麼本地處理器對該cache line就可自由操作,無論是讀寫都不會使得該cache line的資料寫回主存。
shared(共享):處於該狀態的cache line,和獨佔狀態的cache line的不同之處就在於有多個處理器的cache都快取了px位址的資料。
匯流排操作只分為匯流排讀和匯流排寫。
這裡的匯流排寫讀指的是,匯流排觀察到有其他cache發出了對某個主存位址資料的讀寫操作,所以本地的cache需要關心該操作(如果快取的主存位址資料不一致也就沒必要關係了)。
根據四種cache line狀態和兩種匯流排操作,共有八種情況。
cache line狀態
匯流排操作
反應i(失效)
匯流排讀沒有反應
i(失效)
匯流排寫沒有反應
e(獨佔)
匯流排讀變為s狀態,因為有其他cache line也快取這份資料了,所以不再是獨佔
e(獨佔)
匯流排寫變為i狀態,因為有其他處理器直接寫了這個資料,所以該資料已經不再可靠。並且該cache line會把這份資料複製給要寫這個資料的cache line
s(共享)
匯流排讀狀態不變,但是有可能需要把資料同步給其他cache line
s(共享)
匯流排寫變為失效,有可能需要把資料同步給其他cache line(因為有多個cache line都共享了這乙份資料,所以會隨機從這裡挑選乙個幸運兒)
m(已修改)
匯流排讀狀態變為共享,並且會把本身的資料,傳送給有需要的cache line,並且會回寫資料到主存
m(已修改)
匯流排寫狀態變為失效,並且會把資料傳送給有需要的cache line,並且會會寫資料到主存
從這張表中我們可以得出幾個結論:
cache line已失效的情況下不會對匯流排操作有反應
非失效狀態下一旦有匯流排讀操作,本地cache line一定變為s(共享)狀態;一旦有匯流排寫操作,本地cache line一定變為i(失效)狀態
當本地cache line為m(已修改)狀態時,無論接收到匯流排讀還是匯流排寫操作都會會寫資料到主存,並且把本地資料同步給發出請求的cache line
當本地cache line為s(共享)狀態時,無論受到匯流排讀還是匯流排寫操作,總會有乙個本地cache line去發出資料,具體是哪乙個發資料,取決於處理器是如何設計的
從這裡我們能看出匯流排操作對cache line的影響主要分為:
狀態變化、回寫主存、回寫其他cache line這三種
這裡的cache line對不同的處理器操作以及本身的狀態還是一共劃分為八種變化。
cache line狀態
處理器操作
反應i(失效)
處理器讀
1. 傳送匯流排讀訊號
2.當其他cache line也有這份資料,狀態變為s;當其他cache line沒有這份資料,狀態變為e;
3.資料**取決於其他cache line有沒有這份資料,如果有,則從其他cache line獲取;如果沒有,從主存獲取
4.額外的,我們知道:變為s狀態代表其他cache line有,變為e狀態代表其他cache line沒有
i(失效)
處理器寫
1.發出匯流排寫訊號
2.狀態變為m
3.如果其他cache line有資料,從該cache line獲取資料,並且將其狀態置為i;如果沒有,則從主存獲取資料
4.獲取資料後,修改本地cache line資料
e(獨佔)
處理器讀
1. 狀態不變,也不發出匯流排訊號
e(獨佔)
處理器寫
1. 狀態變為m,但是不傳送匯流排訊號
2.向cache line中寫入修改後的資料
s(共享)
處理器讀
1.狀態不變,也不傳送匯流排訊號
s(共享)
處理器寫
1. 狀態變為m
2.傳送匯流排寫訊號
3.其他共享狀態cache line接收到匯流排寫訊號將會變i狀態
m(已修改)
處理器讀
1.狀態不變,也不傳送訊號
m(已修改)
處理器寫
1.狀態不變,也不傳送訊號
由此表可以得到幾個結論:
無論cache line處於何種狀態,當被處理器寫時,一定會變成m狀態。並且如果狀態為s或者i,同時會傳送匯流排寫訊號
已經處於m狀態的cache line,無論怎麼操作,都不會有任何變化;狀態不改變,也不傳送訊號
e狀態是乙個關鍵,對於e狀態的資料操作,不需要傳送匯流排訊號,通過此舉節省了大量的匯流排操作
除了i狀態被讀後會傳送匯流排寫訊號,其他狀態被讀後都不會發出匯流排訊號
從這些我們可以看出:處理器操作對cache line的影響,可能使得cache line改變狀態、發出匯流排訊號、從主存或者其他cache line獲取資料、修改資料這幾種操作
這裡包含了上面所說的匯流排操作和處理器操作對cache line的影響。其中省略了一些不響應的狀態。
快取一致性協議MESI
處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...
MESI(快取一致性協議)
現在的處理器都是多核處理器,並且每個核都帶有多個快取 指令快取和資料快取,見下圖 為什麼需要快取呢,這是因為cpu訪問記憶體的速度比較慢,所以在cpu和記憶體之間加了個快取以提高訪問速度。既然每個核都有快取,那麼假設兩個核或者多個核同時訪問同乙個變數時這些快取是如何進行同步的呢 快取細分為乙個個快取...
快取一致性協議(MESI協議)
大家都知道,計算機在執行程式時,每條指令都是在cpu中執行的,而執行指令過程中,勢必涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在主存 物理記憶體 當中的,這時就存在乙個問題,由於cpu執行速度很快,而從記憶體讀取資料和向記憶體寫入資料的過程跟cpu執行指令的速度比起來要慢的多,因此如...