首先這裡有一篇文章介紹記憶體屏障的,寫的挺好的,可以看看
linux記憶體屏障是用來解決指令亂序的問題。什麼是指令的亂序呢?簡單一點說就是本來**裡面是這麼寫的:
instruction a;
intstuction b;
結果在cpu上執行變成了:
instruction b;
instruction a;
導致指令亂序,有下面幾種情況:
1. cpu指令優化,cpu的流水線可以同時執行多條指令
2. 編譯器優化,編譯器處於效能優化的考慮,可能會優化指令的先後順序
3. 還有乙個跟亂序有關的,就是smp機器上cache的同步,比如在cpua上面,進行了下面的操作:
a = 1;
mb();
b = 1;
然後cpub上面讀取這2個變數,雖然a寫在b前面,但是如果cpua上的cache上a,b值在同步到cpub上時,b的cache同步在a之前,那麼對cpub來說,還是相當於執行了:
b=1;
a=1;
所以mb指令,在smp上還保證cache的同步是一致的
雖然上面3種情況會導致指令亂序,但是cpu和編譯器都會保證顯示的因果依賴的指令,是序列的,也就是說,類似於:
a++;
b = f(a);
這樣的**,是會保證a++一定在b=f(a)前執行的。
linux 記憶體屏障相關
linux系統,編譯器或處理器會對 進行優化,會導致同一cpu 執行緒上執行的 的執行先後順序發生改變,會導致某些前後強依賴關係的 執行時發生oops。解決辦法 增加記憶體屏障。這個可以確保記憶體屏障前的 先於記憶體屏障後的 執行到 同乙個cpu 執行緒上 所以核心中對於需要確保時序的 要加記憶體屏...
linux 優化和記憶體屏障
一 設定屏障的原因 我們程式設計時,指令一般不會按照它們在源程式的順序執行。原因是計算機為了提高程式執行的效能,會對它進行優化,這種優化主要有兩種 1.編譯器的優化 為了提高系統的效能,編譯器在不影響邏輯的情況下會調整指令的順序。2.cpu執行的優化 為了提高流水線的效能,cpu的亂序執行可能會讓後...
優化屏障和記憶體屏障
優化屏障和記憶體屏障 優化屏障 編譯器編譯源 時,會將源 進行優化,將源 的指令進行重排序,以適合於cpu的並行執行。然而,核心同步必須避免指令重新排序,優化屏障 optimization barrier 避免編譯器的重排序優化操作,保證編譯程式時在優化屏障之前的指令不會在優化屏障之後執行。linu...