緩存一致性協(xié)議

鎖緩存行有一套協(xié)議叫做緩存一致性協(xié)議。緩存一致性協(xié)議有MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等等。

MESI

MESI分別代表緩存行數(shù)據(jù)的4中狀態(tài),通過對這四種狀態(tài)的切換,來達到對緩存數(shù)據(jù)進行管理的目的


狀態(tài) 描述 監(jiān)聽任務
Modified
(修改)
該Cache Line有效,數(shù)據(jù)被修改了,和內(nèi)存中的數(shù)據(jù)不一致,數(shù)據(jù)只存在于本Cache中 Cache Line必須時刻監(jiān)聽所有試圖讀該Cache Line相對應的內(nèi)存的操作,其他緩存須在本Cache Line寫回內(nèi)存并將狀態(tài)置為E之后才能操作該Cache Line對應的內(nèi)存數(shù)據(jù)
Exclusive
(互斥)
該Cache Line有效,數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)一致,數(shù)據(jù)只存在于本Cache中 Cache Line 必須監(jiān)聽其他緩存讀主內(nèi)存中該Cache Line相對應的內(nèi)存的操作,一旦有這種操作,該Cache Line需要變成S狀態(tài)
Shared
(共享)
該Cache Line有效,數(shù)據(jù)和內(nèi)存中的數(shù)據(jù)一致,數(shù)據(jù)同時存在于其他緩存中 Cache Line必須監(jiān)聽其他處理器修改該Cache Line相對應的本地Cache Line的操作,一旦有這種操作,該Cache Line需要變成 I 狀態(tài)
Invalid
(無效)
該Cache Line數(shù)據(jù)無效

多核緩存協(xié)同操作

假設有三個CPU-A、B、C,對應三個緩存分別是cache-a、b、c。在主內(nèi)存中定義了x的引用值0


單核讀取

  • CPU-A發(fā)出一條指令,從主內(nèi)存中讀取x
  • 從主內(nèi)存通過bus讀取到緩存中,此時該Cache Line修改為E狀態(tài)


多核讀取

  • CPU-A發(fā)出了一條指令,從主內(nèi)存中讀取x
  • CPU-A從主內(nèi)存通過bus讀取到cache-a中并將該Cache Line設置為E狀態(tài)
  • CPU-B發(fā)出一條指令,從主內(nèi)存中讀取x
  • CPU-B試圖從主內(nèi)存中讀取x時,CPU-A檢測到了地址沖突。這時CPU-A對相應數(shù)據(jù)做出響應。此時x存在于cache-a和cache-b中,x在cache-a和cache-b中都被設置為S狀態(tài)

    修改數(shù)據(jù)
  • CPU-A計算完成后發(fā)指令需要修改x
  • CPU-A將x設置為M狀態(tài)(修改)并通知緩存了x的CPU-B,CPU-B將本地cache-b中的x設置為I狀態(tài)(無效)
  • CPU-A對x進行賦值


同步數(shù)據(jù)

  • CPU-B發(fā)出了要讀取x的指令
  • CPU-B通知CPU-A,CPU-A將修改后的數(shù)據(jù)同步到主內(nèi)存時cache-a修改為E狀態(tài)(獨享)
  • CPU-A同步CPU-B的x,將cache-a和同步后cache-b中的x設置為S狀態(tài)(共享)

MESI優(yōu)化和引入的問題:各CPU緩存行的狀態(tài)是通過消息傳遞來進行的。如果CPU0要對一個在緩存中共享的變量進行寫入,首先需要發(fā)送一個失效的消息給到其他緩存了該數(shù)據(jù)的CPU,并且要等到他們的確認回執(zhí)。CPU0在這段時間內(nèi)都會一直處于阻塞狀態(tài),會導致各種各樣的性能問題和穩(wěn)定性問題。

MESI性能優(yōu)化

Store Buffer

為了避免阻塞帶來的資源浪費,在CPU中引入了Store Buffer。

CPU在寫入共享數(shù)據(jù)時,直接把數(shù)據(jù)寫入到Store Buffer中,同時發(fā)送Invalidate消息,然后繼續(xù)去處理其他指令。當收到其他所有CPU發(fā)送了Invalidate Acknowledge消息時,再將Store Buffer中的數(shù)據(jù)存儲到Cache Line中,最后再從Cache Line同步到主內(nèi)存。


Store Buffer的問題:引入了Store Buffer后,CPU會優(yōu)先從Store Buffer中讀取數(shù)據(jù),這在一些情況下會導致CPU的亂序執(zhí)行,也可以認為是一種重排序,這種重排序會帶來可見性問題

Store Forwarding

Write Memory Barrier

Invalidate Queue

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容