cpu快取的存在是為了解決cpu和主記憶體之間的速度差問題,現在的一般多核cpu存在多級快取。cpu快取的基本單位是cache 行,是與主記憶體交換的基本單位,乙個cache 行的單位是2的次冪位元,所以cpu快取乙個變數的時候會快取這個變數周圍的區域。mysql也有這樣的特性。cpu快取示意圖如下圖所示:
設想乙個場景,當2個cpu的一級快取快取了同乙個變數,然後2個cpu分別用乙個執行緒去更新這個變數的值,會導致什麼問題?
顯而易見,可能會出現快取到不同cpu的變數值是不一致的。由此,引發了另外乙個問題,快取一致性問題,為了避免這種情況的發生,我們規定了乙個快取一致性協議mesi。
mesi是cache 行4個狀態的首字母,如下:
狀態描述
監聽任務
m 修改 (modified)
該cache line有效,資料被修改了,和記憶體中的資料不一致,資料只存在於本cache中。
快取行必須時刻監聽所有試圖讀該快取行相對就主存的操作,這種操作必須在快取將該快取行寫回主存並將狀態變成s(共享)狀態之前被延遲執行。
e 獨享、互斥 (exclusive)
該cache line有效,資料和記憶體中的資料一致,資料只存在於本cache中。
快取行也必須監聽其它快取讀主存中該快取行的操作,一旦有這種操作,該快取行需要變成s(共享)狀態。
s 共享 (shared)
該cache line有效,資料和記憶體中的資料一致,資料存在於很多cache中。
快取行也必須監聽其它快取使該快取行無效或者獨享該快取行的請求,並將該快取行變成無效(invalid)。
i 無效 (invalid)
該cache line無效。
無如上所示,cache 行監聽不同的讀寫狀態,來進行cache 狀態的轉換,來保證快取資料與主記憶體資料的一致性。
快取一致性協議
作業系統的cpu和記憶體並不是直接互動操作的。我們的cpu有一級快取,cpu直接操作一級快取,由一級快取和記憶體進行互動。所以同乙個程式,cpu進行切換的時候,切換前和切換後的資料可能會有不一致的情況。那麼這個就是乙個很大的問題了。如何保證各個cpu快取中的資料是一致的。就是cpu的快取一致性問題。...
快取一致性協議(MESI協議)
大家都知道,計算機在執行程式時,每條指令都是在cpu中執行的,而執行指令過程中,勢必涉及到資料的讀取和寫入。由於程式執行過程中的臨時資料是存放在主存 物理記憶體 當中的,這時就存在乙個問題,由於cpu執行速度很快,而從記憶體讀取資料和向記憶體寫入資料的過程跟cpu執行指令的速度比起來要慢的多,因此如...
MESI CPU快取一致性協議
mesi cpu快取一致性協議mesi modified exclusive shared or invalid 也稱為伊利諾斯協議,是因為該協議由伊利諾斯州立大學提出 是一種廣泛使用的支援寫回策略的快取一致性協議,該協議被應用在intel奔騰系列的cpu中,詳見 support the more ...