volatile和mesi(緩存一致性)

首先強調一點,volatile和mesi這兩個東西沒有半點關係。mesi是緩存一致性的一種實現手段,多核CPU爲了保證緩存數據的一致性,通常有兩種實現手段,一種是總線鎖,另一種是緩存鎖。總線鎖性能消耗大,緩存鎖則一般通過緩存一致性來實現。因此我們知道mesi是CPU硬件級別的。 volatile是JAVA的一種關鍵字,實現了兩個功能: 1.可見性 2.禁止亂序。 禁止亂序,在JVM層面使用內存屏障來實現,彙編級別通過lock #指令來實現。

問題:既然CPU有了MESI協議可以保證cache的一致性,那麼爲什麼還需要volatile這個關鍵詞來保證可見性(內存屏障)?或者是隻有加了volatile的變量在多核cpu執行的時候纔會觸發緩存一致性協議?

 

兩個解釋結論:

多核情況下,所有的cpu操作都會涉及緩存一致性的校驗,只不過該協議是弱一致性,不能保證一個線程修改變量後,其他線程立馬可見,也就是說雖然其他CPU狀態已經置爲無效,但是當前CPU可能將數據修改之後又去做其他事情,沒有來得及將修改後的變量刷新回主存,而如果此時其他CPU需要使用該變量,則又會從主存中讀取到舊的值。而volatile則可以保證可見性,即立即刷新回主存,修改操作和寫回操作必須是一個原子操作;
正常情況下,系統操作並不會進行緩存一致性的校驗,只有變量被volatile修飾了,該變量所在的緩存行才被賦予緩存一致性的校驗功能。

這個解釋僅供參考。。。。。。。。。。。。。。。。。

 

我們再來看一下另一位大N的解釋:

首先,volatile是java語言層面給出的保證,MSEI協議是多核cpu保證cache一致性(後面會細說這個一致性)的一種方法,中間隔的還很遠,我們可以先來做幾個假設:

  1. 回到遠古時候,那個時候cpu只有單核,或者是多核但是保證sequence consistency[1],當然也無所謂有沒有MESI協議了。那這個時候,我們需要java語言層面的volatile的支持嗎?當然是需要的,因爲在語言層面編譯器和虛擬機爲了做性能優化,可能會存在指令重排的可能,而volatile給我們提供了一種能力,我們可以告訴編譯器,什麼可以重排,什麼不可以。
  2. 那好,假設更進一步,假設java語言層面不會對指令做任何的優化重排,那在多核cpu的場景下,我們還需要volatile關鍵字嗎?答案仍然是需要的。因爲 MESI只是保證了多核cpu的獨佔cache之間的一致性,但是cpu的並不是直接把數據寫入L1 cache的,中間還可能有store buffer。有些arm和power架構的cpu還可能有load buffer或者invalid queue等等。因此,有MESI協議遠遠不夠。
  3. 再接着,讓我們再做一個更大膽的假設。假設cpu中這類store buffer/invalid queue等等都不存在了,cpu是數據是直接寫入cache的,讀取也是直接從cache讀的,那還需要volatile關鍵字嗎?你猜的沒錯,還需要的。原因就在這個“一致性”上。consistency和coherence都可以被翻譯爲一致性,但是MSEI協議這裏保證的僅僅coherence而不是consistency。那consistency和cohence有什麼區別呢?下面取自wiki[2]的一段話:
Coherence deals with maintaining a global order in which writes to a single location or single variable are seen by all processors. Consistency deals with the ordering of operations to multiple locations with respect to all processors.

因此,MESI協議最多隻是保證了對於一個變量,在多個核上的讀寫順序,對於多個變量而言是沒有任何保證的。很遺憾,還是需要volatile~~

4. 好的,到了現在這步,我們再來做最後一個假設,假設cpu寫cache都是按照指令順序fifo寫的,那現在可以拋棄volatile了吧?你覺得呢?我都寫到標題4了,那肯定不行啊!因爲對於arm和power這個weak consistency[3]的架構的cpu來說,它們只會保證指令之間有比如控制依賴,數據依賴,地址依賴等等依賴關係的指令間提交的先後順序,而對於完全沒有依賴關係的指令,比如x=1;y=2,它們是不會保證執行提交的順序的,除非你使用了volatile,java把volatile編譯成arm和power能夠識別的barrier指令,這個時候纔是按順序的。

最後總結上文,答案就是:還需要~~

引用:https://www.zhihu.com/question/296949412/answer/747494794

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章