Linux記憶體屏障

2021-06-07 23:06:50 字數 684 閱讀 1016

首先這裡有一篇文章介紹記憶體屏障的,寫的挺好的,可以看看

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...