zzh

zzh

volatile保證可見性理解

在目前的 CPU 架構中,主要通過在 volatile 修飾的變數進行讀寫時加入屏障來實現可見性。

invalidQueue、storeBuffer 與可見性

底層上 CPU 主要通過 MESI 協議來實現多核 CPU 之間的快取一致性(具體可查詢相關內容),而 MESI 中為了實現 CPU 的高效處理,引入了 invalidQueue 以及 storeBuffer 兩種資料結構。首先,在 CPU 中只有多核 CPU(CPU0,CPU1)都佔有的變數(共享變量)才會存在不可見問題,假設 CPU0 和 CPU1 都在其高速緩衝中佔有了變數 x,而 CPU0 在某一時刻開始修改 x,這時候 CPU0 會通知 CPU1 將其對應的快取行置為失效狀態。具體來說,這時候為了高效處理,CPU0 將修改值存入 storeBuffer 中,同時開始通知 CPU1,而 CPU1 則將對應的失效消息放入 invalidQueue 中,然後告知 CPU0 處理完成,CPU0 得到響應後會將對應的修改值從 storeBuffer 中刷入高速緩衝中。以上就是 MESI 協議保證多核 CPU 快取一致性的部分內容。這時候我們可以發現其實是存在問題的,因為 CPU0 沒有將修改值刷入主存,而 CPU1 也沒有執行對應的失效操作(如果沒有執行失效操作,那麼 CPU1 仍然取得是高速緩衝中的值,只有失效以後才從主存中獲取對應的值)。因此,volatile 修飾符就是在 CPU0 將修改值刷入高速緩存的時候同時刷入主存,而 CPU1 讀取 x 的時候將 invalidQueue 中的消息全部執行完畢,從而保證多核 CPU 之間的可見性。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。