記憶體模型與原子操作

快取一致性相對於記憶體一致性(coherence vs consistency)

/ coherence -> koh-HEER-ens /

這兩個詞聽起來可以互換、也不斷被搞混,但它們回答的是兩個真正不同的問題,而把它們分開是整個並行領域中最能澄清思緒的區分之一。coherence(一致性)講的是「單一」記憶體位置橫跨所有快取的情況;consistency(一致性)講的是對「不同」位置之存取的「相對」排序。

快取一致性(cache coherence)是硬體自動提供的、針對每個位址的保證:雖然每個核心都有自己的快取,一致性協定確保對於任一個位址,所有核心都同意它所取得之值的單一序列(它的修改順序),而一個寫入終究會傳播到每個快取。你絕不會看到某個核心永遠卡在讀某位址的古老舊值,而對同一位址的兩次寫入,每個人看到的順序都一樣。一致性是看不見的管線——你基本上免費取得它,也很少去想它。

記憶體一致性(memory consistency)是更難、且程式設計師可見的問題:給定對「許多」不同位置的存取,它們在各核心間可能以什麼順序交錯顯現?這正是記憶體模型與 memory_order 標籤所掌管的,也是儲存緩衝區、重排與屏障所棲身之處。關鍵的點睛之筆是:coherence「不會」給你 consistency。一台完美 coherent 的機器,仍可能讓核心 A 對 x 的寫入與對 y 的寫入,以「相反」的順序對核心 B 變得可見,因為每個位址各自 coherent,它們的相對順序卻不受約束。所以「快取都一致了,我的執行緒肯定看到一致的視圖」是一個經典的錯誤推論——coherence 各自處理一個位址;consistency 則處理它們之間的關係,而那必須由你用原子與各種順序去安排。

核心 A:x=1; y=1; 核心 B:while(y==0){} 讀 x; coherence 保證 B 終究會分別看到 y==1 與 x==1,但「不」保證 x 的寫入比 y 的更早可見——那個排序需要 release/acquire,不是 coherence。

每位址的 coherence 並不足夠;你真正依賴的跨位址排序是 consistency。

coherence(單一位址、自動)並不蘊含 consistency(跨位址排序、你的職責):「我的快取是一致的」絕不能成為省略原子的理由——而本欄位談的是這個區分,不是一致性協定的機制(MESI 狀態在 j 欄位)。

又稱
coherence vs consistency一致性的兩種意義