Kernel wmb mb巨集的作用

2021-08-20 12:51:08 字數 662 閱讀 9653

記憶體屏障主要解決的問題是編譯器的優化和cpu的亂序執行。

編譯器在優化的時候,生成的彙編指令可能和c語言程式的執行順序不一樣,在需要程式嚴格按照c語言順序執行時,需要顯式的告訴編譯不需要優化,這在linux下是通過barrier()巨集完成的,它依靠volidate關鍵字和memory關鍵字,前者告訴編譯barrier()周圍的指令不要被優化,後者作用是告訴編譯器彙編**會使記憶體裡面的值更改,編譯器應使用記憶體裡的新值而非暫存器裡儲存的老值。

同樣,cpu執行會通過亂序以提高效能。彙編裡的指令不一定是按照我們看到的順序執行的。linux中通過mb()系列巨集來保證執行的順序。具體做法是通過mfence/lfence指令(它們是奔4後引進的,早期x86沒有)以及x86指令中帶有序列特性的指令(這樣的指令很多,例如linux中實現時用到的lock指令,i/o指令,操作控制暫存器、系統暫存器、除錯暫存器的指令、iret指令等等)。簡單的說,如果在程式某處插入了mb()/rmb()/wmb()巨集,則巨集之前的程式保證比巨集之後的程式先執行,從而實現序列化。wmb的實現和barrier()類似,是因為在x86平台上,寫記憶體的操作不會被亂序執行。

實際上在rsic平台上,這些序列工作都有專門的指令由程式設計師顯式的完成,比如在需要的地方呼叫序列指令,而不像x86上有這麼多隱性的帶有序列特性指令(例如lock指令)。所以在risc平台下工作的朋友通常對序列化操作理解的容易些。

C C 巨集 巨集的作用 副作用

基礎 巨集是預處理指令 巨集的本質是簡單的字串替換,預處理時進行巨集替換 可在定義巨集時要求它接收引數,巨集替換時會代入引數 巨集的名字不允許過載 巨集預處理 沒有能力處理遞迴呼叫。作用 看一段math.h中的巨集定義 if defined use math defines defined math...

巨集的副作用

巨集定義在實際使用中如果不稍加注意,如果表示式有 就可能導致返回的結果跟預期不符。下面是幾種常見的問題 define multi a,b a b multi 1 2,3 1 2 3 define add a,b a b int c add 1,2 3 1 2 3因此巨集的引數和返回值最好是用 擴起來...

D REENTRANT 巨集作用

2.reentrant巨集 在乙個多執行緒程式裡,預設情況下,只有乙個errno變數供所有的執行緒共享。在乙個執行緒準備獲取剛才的錯誤 時,該變數很容易被另乙個執行緒中的函式呼叫所改變。類似的問題還存在於fputs之類的函式中,這些函式通常用乙個單獨的全域性性區域來快取輸出資料。為解決這個問題,需要...