快取一致性協議
快取一致性協議提供了一種高效的記憶體資料管理方案,它只會對單個快取行(快取行是快取中資料儲存的基本單元)的資料進行加鎖,不會影響到記憶體中其他資料的讀寫
快取行是CPU快取最小儲存單元
機械硬碟最小儲存單元是簇
MESI分別代表快取行資料所處的四種狀態
狀態 | 描述 | 監聽任務 |
M 修改(Modified) | 該Cache line(快取行)有效,資料被修改了,和記憶體中的資料不一致,資料只存在於本Cache中 | 快取行必須時刻監聽所有試圖讀取該快取行相對就主存的操作,這種操作必須在快取將該該快取行寫回主存並將狀態變為S(共享)狀態之前被延遲執行 |
E 獨享、互斥(Exclusive) | 該Cache line(快取行)有效,資料和記憶體中的資料一致,資料只存在於本Cache中 | 快取行也必須監聽其它快取讀取主存中該快取行的操作,一旦有這種操作,該快取行需要變成S(共享)狀態 |
S 共享(Shared) | 該Cache line(快取行)有效,資料和記憶體中的資料一致,資料存在於很多Cache中 | 快取行也必須監聽其它快取使該快取行無效或者物件該快取行的請求,並將該快取行需要變成無效(Invalid)狀態 |
I 無效(Invalid) | 該Cache line(快取行)無效 | 無 |
MESI協議只對彙編指令中執行加鎖操作的變數有效,表現到java中為使用voliate關鍵字定義變數或使用加鎖操作
工作原理:
CPU1先將主存中X=1(volatile)讀取到快取中同時置為X(E)獨佔狀態,並時刻監聽匯流排中其他CPU對此記憶體(X=1)的操作
在CPU 快取還沒有回寫到主存中時,CPU2也要從主存中將X=1通過匯流排讀取到CPU2快取中,CPU1通過匯流排嗅探機制嗅探到CPU2快取讀取了主存X=1,那麼此時CPU1將獨佔狀態(E)變為共享狀態(S),同時CUP2中也為共享狀態(S)
X在CPU1計算後回寫到CPU1快取X=2,準備將X=2通過匯流排寫回到主存中是,先鎖定快取行,將狀態變為M(修改,只存在本Cache中),並向匯流排發訊息,由於其他CPU(CPU2)也在監聽匯流排訊息,CPU2 嗅探到CPU1發出訊息將X變為M(修改)並且將要回寫到主存中,此時CPU2將X變為I(無效)。
CPU1 將X寫回到主存X=2,然後將CPU1快取X的狀態變為E(獨佔狀態)。
若CPU2還要對X進行訪問時需要將CPU2快取中X(I)清除,然後重新從主存中獲取X,此時CPU1、CPU2快取中X變為S(共享狀態)
如果兩個CPU同一時間要去修改X狀態為M(修改),一個指令週期內進行裁決,假設判為CPU1有效,則置CPU1的X為M(修改),CPU2的X為I(無效),不可能存在兩個CPU中的X都為M(狀態)
Unsafe是一種原子操作,在裁決失敗之後是否繼續讀取X進行重新操作,取決程式指令是否要求去讀取主存中X資料,再次更新再次讀取
失效是整個快取行失效