緩存一致性協議 mesi 和 volatile

m : modified 修改緩存

e : exlusive 獨佔線程

s : shared 共享排序

i : invalid 無效變量

各類狀態的轉換從網上摘抄一段cpu

cpu核之間通訊的消息包括讀消息,以及讀消息的響應消息。使無效消息,以及使無效消息的響應消息。當運行在某個cpu核的線程準備讀取某個cache line的內容時,若是狀態處於M,E,S,直接讀取便可。若是狀態處於I,則須要向其餘cpu核廣播讀消息,在接受到其餘cpu核的讀響應後,更新cache line,並將狀態設置爲S。而當線程準備寫入某個cache line時,若是處於M狀態,直接寫入。若是處於E狀態,寫入並將cache line狀態改成M。若是處於S,則須要向其餘cpu核廣播使無效消息,並進入E狀態,寫入修改,後進入M狀態。若是處於I,則須要向其餘cpu核廣播讀消息和使無效消息,在收集到讀響應後,更新cache line。在收集到使無效響應後,進入E狀態,寫入修改,後進入M狀態。通信

緩存一致性協議使得多核cpu的共享變量之間的改變能夠相互可見,按理說能夠了。協議

可是在cpu和L1L2的cacheLine之間還有storebuffer這樣的緩衝,這就須要volatile出場了。di

volatile修飾變量在彙編的時候會多出 lock前綴,這個前綴在「寫變量」這個過程當中有兩個做用:cas

一、禁止指令重排序消息

二、將當前cpu的L1以前的緩衝都刷新到L1中

 

i++的問題是寫更新丟失的問題,跟如今說的不要緊,要用cas解決。

cas其實不是原子性操做,要讀一次,再寫一次。可是能夠用MESI實現原子性:讀一次發現是目標值,寫的時候判斷是否是I就能夠。mesi實現其餘原子性操做也是這個思路。

相關文章
相關標籤/搜索