linux 優化和記憶體屏障

2021-07-11 07:31:27 字數 1874 閱讀 8474

一、設定屏障的原因

我們程式設計時,指令一般不會按照它們在源程式的順序執行。原因是計算機為了提高程式執行的效能,會對它進行優化,這種優化主要有兩種:

1.編譯器的優化:為了提高系統的效能,編譯器在不影響邏輯的情況下會調整指令的順序。

2.cpu執行的優化:為了提高流水線的效能,cpu的亂序執行可能會讓後面的沒有暫存器衝突的彙編指令先於前面的指令完成。

當處理程式的同步時,這樣的順序的調整會造成某些失控,所以我們有時候需要有措施來保證程式的順序不被打亂。

二、措施

1.優化屏障:保證編譯程式將放在原語操作前面的彙編指令不與放在原語操作之後的組合語言指令混淆,保證在操作原語之前的指令不會被優化到任何出現在操作原語之後的指令的後面,反之也不會操作原語之後的指令被優化到任何出現在操作原語之前的指令的前面。

#define barrier()		__asm__ __volatile__("": : :"memory")
優化屏障通過barrier()來達到的,volatile禁止編譯器將這條指令與其它的指令重新組合,memory強制編譯器嘉定ram中所有的記憶體單元已經被組合語言指令修改。這樣就嗯呢該確保編譯器所做的優化不會將該語句前面的指令優化到該語句之後,之後的語句也無法優化到前面。

2.記憶體屏障:保證cpu執行時原語操作之前的指令在原語之後的指令前完成。

起記憶體屏障作用的指令,這些指令確保:cpu執行時原,指令之前的指令在指令之後的指令前完成。

1.對i/o埠進行操作的所有指令。

2.有lock字首的指令。

3.寫控制暫存器、系統暫存器或除錯暫存器的所有指令。

4.pentium4微處理器中的lfence、sfence和mfence彙編指令,分別實現讀記憶體屏障、寫記憶體屏障和讀寫記憶體屏障

5.終止中斷和異常處理程式的iret指令

讀記憶體屏障:原語指令之前的讀記憶體指令在原語指令之後的讀記憶體指令前完成

寫記憶體屏障:原語

指令之前的寫記憶體指令在原語指令之後的寫記憶體指令前完成

讀寫記憶體屏障:原語

指令之前的讀或寫記憶體指令在原語指令之後的讀或寫記憶體指令前完成

#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", x86_feature_xmm2)

#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", x86_feature_xmm2)

#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", x86_feature_xmm)

#ifdef config_x86_oostore

#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", x86_feature_xmm)

#else

#define wmb() __asm__ __volatile__ ("": : :"memory")

#endif

#ifdef config_smp

#define smp_mb() mb()

#define smp_rmb() rmb()

#define smp_wmb() wmb()

#else

#define smp_mb() barrier()

#define smp_rmb() barrier()

#define smp_wmb() barrier()

#endif

多處理器的記憶體屏障比較複雜,其主要思想就是通過上面的指令或者barrier或者lock就能達到記憶體屏障的作用。

優化屏障和記憶體屏障

優化屏障和記憶體屏障 優化屏障 編譯器編譯源 時,會將源 進行優化,將源 的指令進行重排序,以適合於cpu的並行執行。然而,核心同步必須避免指令重新排序,優化屏障 optimization barrier 避免編譯器的重排序優化操作,保證編譯程式時在優化屏障之前的指令不會在優化屏障之後執行。linu...

優化屏障和記憶體壁壘

當使用指令優化的編譯器時,你千萬不要認為指令會嚴格按它們在源 中出現的順序執行。例如,編譯器可能重新安排組合語言指令以使暫存器以最優的方式使用。此外,現代cpu通常並行地執行若干條指令,且可能重新安排記憶體訪問。這種重新排序可以極大地加速程式的執行。然而,當處理同步時,必須避免指令重新排序。因為如果...

優化屏障和記憶體壁壘

當使用指令優化的編譯器時,你千萬不要認為指令會嚴格按它們在源 中出現的順序執行。例如,編譯器可能重新安排組合語言指令以使暫存器以最優的方式使用。此外,現代cpu通常並行地執行若干條指令,且可能重新安排記憶體訪問。這種重新排序可以極大地加速程式的執行。然而,當處理同步時,必須避免指令重新排序。因為如果...