緩存一致性協議

緩存一致性協議

  1. 爲何須要緩存一致性協議

  多個線程併發訪問一個共享變量時,這些線程的執行處理器上的高速緩存各自都會保留一份共享變量的副本,這帶來一個問題,一個處理器對共享變量進行修改,其餘處理器如何察覺到該更新並作出適當反應,以確保後續處理器讀取到這個共享變量時能夠讀取到這個更新.這就是緩存一致性問題,其本質就是防止讀髒數據和讀取到更新的數據緩存

  1. 什麼是緩存一致性協議

  MESI(Modified-Exclusive-Shared-Invalid)協議是一種廣爲使用的緩存一致性協議,相似讀寫鎖 對於同一地址的讀內存操做是併發的,針對同一地址的寫操做是獨佔的,對弈內存地址寫操做同一時間只能由一個處理器來執行.多線程

  爲了保持數據的一致性,MESI將緩存條目的狀態劃分爲Modified.Exclusive,Shared,Invalid併發

  MESI協議中一個緩存條目的狀態Flag值分爲一下4中線程

    1. Invalid(無效的,記爲I) 相應緩存行中不包含任何內存地址對應的有效副本數據,是緩存條目的初始狀態隊列

    2. Shared(共享的,記爲S)緩存行中包含相應內存地址數據的副本,其餘處理器高速緩存中也可能包含相應地址內存的副本,緩存行中的數據與內存的一致內存

    3. Exclusive(獨佔的,記爲E)緩存行獨佔相應內存地址數據的副本,其餘處理器高速緩存不包含相同的副本或者副本失效,緩存行中的數據與主內存數據一致it

    4. Modified(更改過,記爲M)相應緩存行包含更新後的數據,其餘處理器相同tag的緩存行只有惟一的M狀態,與主內存的數據不一致變量

  MESI定義了一組message用於協調各個處理器的讀寫內存操做,處理器在執行內存的讀寫操做是,在必要的狀況下會往bus中發送特定的請求消息,每一個處理器攔截這些消息,在必定狀況下往bus回覆消息date

    1. Read 通知其餘處理器和主內存 準備讀取某個內存地址的消息sso

    2. Read Response 返回被read請求讀取的消息,多是處理器返回的也多是內存返回的

    3. Invalidate 通知其餘處理器刪除高速緩存中對應tag的數據副本

    4. Invalidate Acknowledge 回覆已經刪除了高速緩存上相應tag的副本

    5.Read Invalidate 通知其餘處理器準備更新一個數據請求其餘處理器刪除其高速緩存中的數據副本,收到消息的處理器必須回覆read Response,Invalidate Acknowledge

    6. Writeback 消息包含須要寫入內存的數據和內存地址

  1. 緩存一致性協議能作什麼

  對讀操做的實現

  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能保證多線程對共享變量的可見性,可見性問題就要從寫緩衝器和無效化隊列的角度來解釋了

相關文章
相關標籤/搜索