快取一致性協議
- 為什麼需要快取一致性協議
多個執行緒併發訪問一個共享變數時,這些執行緒的執行處理器上的快取記憶體各自都會保留一份共享變數的副本,這帶來一個問題,一個處理器對共享變數進行修改,其他處理器如何察覺到該更新並做出適當反應,以確保後續處理器讀取到這個共享變數時可以讀取到這個更新.這就是快取一致性問題,其本質就是防止讀髒資料和讀取到更新的資料
- 什麼是快取一致性協議
MESI(Modified-Exclusive-Shared-Invalid)協議是一種廣為使用的快取一致性協議,類似讀寫鎖 對於同一地址的讀記憶體操作是併發的,針對同一地址的寫操作是獨佔的,對弈記憶體地址寫操作同一時間只能由一個處理器來執行.
為了保持資料的一致性,MESI將快取條目的狀態劃分為Modified.Exclusive,Shared,Invalid
MESI協議中一個快取條目的狀態Flag值分為一下4中
1. Invalid(無效的,記為I) 相應快取行中不包含任何記憶體地址對應的有效副本資料,是快取條目的初始狀態
2. Shared(共享的,記為S)快取行中包含相應記憶體地址資料的副本,其他處理器快取記憶體中也可能包含相應地址記憶體的副本,快取行中的資料與記憶體的一致
3. Exclusive(獨佔的,記為E)快取行獨佔相應記憶體地址資料的副本,其他處理器快取記憶體不包含相同的副本或者副本失效,快取行中的資料與主記憶體資料一致
4. Modified(更改過,記為M)相應快取行包含更新後的資料,其他處理器相同tag的快取行只有唯一的M狀態,與主記憶體的資料不一致
MESI定義了一組message用於協調各個處理器的讀寫記憶體操作,處理器在執行記憶體的讀寫操作是,在必要的情況下會往bus中傳送特定的請求訊息,每個處理器攔截這些訊息,在一定情況下往bus回覆訊息
1. Read 通知其他處理器和主記憶體 準備讀取某個記憶體地址的訊息
2. Read Response 返回被read請求讀取的訊息,可能是處理器返回的也可能是記憶體返回的
3. Invalidate 通知其他處理器刪除快取記憶體中對應tag的資料副本
4. Invalidate Acknowledge 回覆已經刪除了快取記憶體上相應tag的副本
5.Read Invalidate 通知其他處理器準備更新一個資料請求其他處理器刪除其快取記憶體中的資料副本,收到訊息的處理器必須回覆read Response,Invalidate Acknowledge
6. Writeback 訊息包含需要寫入記憶體的資料和記憶體地址
- 快取一致性協議能做什麼
對讀操作的實現
processor0會根據A的記憶體地址在快取記憶體找到對應的快取條目,如果快取的flag為M E 或是S,那麼處理器可以直接從快取條目中拿取資料,不向匯流排傳送訊息,如果flag為I說明條目無效或者沒有,需要向匯流排中傳送read訊息,其他處理器或者記憶體需要回復read response,processor0接收到read response訊息會更新自己的快取條目狀態設定為S
其他處理器快取記憶體中的快取條目如果不為I才回復訊息,注意回覆的是快取行整塊資料,如果flag為M會發message之前先往記憶體中寫,然後flag的狀態改為S,如果flag狀態為I,read Response訊息來自記憶體
對寫操作的實現
processor0在往地址A寫資料的時候,必須先擁有該資料的所有權,如果processor0快取記憶體地址A的快取條目flag為E 或 M,說明已經獲取了所有權,可以直接將資料寫入快取行,flag為M,如果不為M E 則需要往訊息匯流排傳送Invalidate訊息,接收到其他所有處理器回覆的invalidate acknowledge訊息後才獲得了資料的所有權,才能更新資料到快取行中
processor0找到的快取條目如果為S,需要往匯流排中傳送invalidate訊息,等收到其他所有處理器返回的invalidate acknowledge時將快取條目設定為E,此時獲得所有權,然後將資料寫入快取行,flag設為M
processor0找到的快取條目如果為I,需要往匯流排傳送read invalidate,等接受到read response和其他所有處理器的invalidate acknowledge之後將相應快取條目的狀態改為E,代表已經獲得相應資料的所有權,寫入資料flag改為M
mesi能保證多執行緒對共享變數的可見性,可見性問題就要從寫緩衝器和無效化佇列的角度來解釋了