緩存一致性協議
- 為什么需要緩存一致性協議
多個線程並發訪問一個共享變量時,這些線程的執行處理器上的高速緩存各自都會保留一份共享變量的副本,這帶來一個問題,一個處理器對共享變量進行修改,其他處理器如何察覺到該更新並做出適當反應,以確保后續處理器讀取到這個共享變量時可以讀取到這個更新.這就是緩存一致性問題,其本質就是防止讀臟數據和讀取到更新的數據
- 什么是緩存一致性協議
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能保證多線程對共享變量的可見性,可見性問題就要從寫緩沖器和無效化隊列的角度來解釋了