現在的處理器都是多核處理器,並且每個核都帶有多個緩存(指令緩存和數據緩存,見下圖)。爲什麼需要緩存呢,這是因爲CPU訪問內存的速度比較慢,所以在CPU和內存之間加了個緩存以提高訪問速度。既然每個核都有緩存,那麼假設兩個核或者多個核同時訪問同一個變量時這些緩存是如何進行同步的呢(緩存細分爲一個個緩存行),這就有了MESI協議。
緩存行的四個狀態:
MESI中每個緩存行都有四個狀態,分別是E(exclusive)、M(modified)、S(shared)、I(invalid)。下面我們介紹一下這四個狀態分別代表什麼意思。
M:代表該緩存行中的內容被修改了,並且該緩存行只被緩存在該CPU中。這個狀態的緩存行中的數據和內存中的不一樣,在未來的某個時刻它會被寫入到內存中(當其他CPU要讀取該緩存行的內容時。或者其他CPU要修改該緩存對應的內存中的內容時(個人理解CPU要修改該內存時先要讀取到緩存中再進行修改),這樣的話和讀取緩存中的內容其實是一個道理)。
E:E代表該緩存行對應內存中的內容只被該CPU緩存,其他CPU沒有緩存該緩存對應內存行中的內容。這個狀態的緩存行中的內容和內存中的內容一致。該緩存可以在任何其他CPU讀取該緩存對應內存中的內容時變成S狀態。或者本地處理器寫該緩存就會變成M狀態。
S:該狀態意味着數據不止存在本地CPU緩存中,還存在別的CPU的緩存中。這個狀態的數據和內存中的數據是一致的。當有一個CPU修改該緩存行對應的內存的內容時會使該緩存行變成 I 狀態。
I:代表該緩存行中的內容時無效的。
EMSI狀態轉移圖:
local read和local write分別代表本地CPU讀寫。remote read和remote write分別代表其他CPU讀寫。建議首次看EMSI內容的可以自己把下面這個表格寫下來(我自己就是這麼做的),這樣理解會深一點。
當前狀態 事件 行爲 下一個狀態
I(invalid) local read
1.如果其他處理器中沒有這份數據,本緩存從內存中取該數據,狀態變爲E
2.如果其他處理器中有這份數據,且緩存行狀態爲M,則先把緩存行中的內容寫回到內存。本地cache再從內存讀取數據,這時兩個cache的狀態都變爲S
3.如果其他緩存行中有這份數據,並且其他緩存行的狀態爲S或E,則本地cache從內存中取數據,並且這些緩存行的狀態變爲S
E或S
local write
1.先從內存中取數據,如果其他緩存中有這份數據,且狀態爲M,則先將數據更新到內存再讀取(個人認爲順序是這樣的,其他CPU的緩存內容更新到內存中並且被本地cache讀取時,兩個cache狀態都變爲S,然後再寫時把其他CPU的狀態變爲I,自己的變爲M)
2.如果其他緩存中有這份數據,且狀態爲E或S,那麼其他緩存行的狀態變爲I
M
remote read remote read不影響本地cache的狀態 I
remote write remote read不影響本地cache的狀態 I
E(exclusive) local read 狀態不變 E
local write 狀態變爲M M
remote read 數據和其他核共享,狀態變爲S S
remote write 其他CPU修改了數據,狀態變爲I I
S(shared) local read 不影響狀態 S
local write 其他CPU的cache狀態變爲I,本地cache狀態變爲M M
remote read 不影響狀態 S
remote write 本地cache狀態變爲I,修改內容的CPU的cache狀態變爲M I
M(modified) local read 狀態不變 M
local write 狀態不變 M
remote read 先把cache中的數據寫到內存中,其他CPU的cache再讀取,狀態都變爲S S
remote write 先把cache中的數據寫到內存中,其他CPU的cache再讀取並修改後,本地cache狀態變爲I。修改的那個cache狀態變爲M I
————————————————
版權聲明:本文爲CSDN博主「xiaowenmu1」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiaowenmu1/article/details/89705740