SylixOS記憶體屏障

2021-10-11 18:18:12 字數 2340 閱讀 4416

在早期處理器中,處理器的指令執行順序與**編寫順序是保持一致的,這種執行順序稱為按序執行。但是如果某一條指令需要等待之前指令的執行結果,那麼該指令之後的所有的指令均需要等待。為了充分發揮指令流水線以及多個執行單元的優勢,處理器引入了亂序執行的概念。

亂序執行是指多條指令不按程式原有順序執行。亂序執行要求這兩條指令沒有資料依賴關係或者控制依賴關係,如果存在依賴關係,則不能亂序執行。 在單核處理器中,亂序執行不會導致程式的執行結果遠離預期結果,但是在多核環境下就很難保證程式執行結果的正常。 在多核環境下,每個核的指令都可能被亂序,並且由於處理器還有多層快取機制(如l1,l2等)。如果我們在乙個核上對資料執行寫入操作,並且通過乙個標記來表示此資料已經寫入完畢,另乙個核通過此標記來判斷資料是否已經寫入完畢,就可能存在風險,這是因為標記可能已經被修改,但是資料操作還未完成,最終導致另乙個核未能使用到正確的資料,從而帶來不可預估的後果。

亂序執行的目的是為了提公升處理器的效能,但是在多核的環境中很可能會出現問題,因此需要引入一種機制來消除這種不良影響,用來禁止處理器對某些地方的亂序執行,這種機制就是記憶體屏障。

記憶體屏障,也稱記憶體柵欄,記憶體柵障,屏障指令等,是一類同步屏障指令,是處理器或編譯器在對記憶體隨機訪問的操作中的乙個同步點,使得此點之前的所有讀寫操作都執行後才可以開始執行此點之後的操作。記憶體屏障可以抑制亂序,維持程式所期望的邏輯。 記憶體屏障阻礙了處理器採用優化技術來降低記憶體操作延遲,因此必須考慮使用記憶體屏障帶來的效能損失。

sylixos記憶體屏障有三種:多核讀屏障、多核寫屏障以及多核讀寫屏障,如表4.1所示。

多核讀屏障

乙個特定cpu在記憶體屏障之前的所有讀操作相比記憶體屏障之後的讀操作優先被所有cpu所感知。 讀記憶體屏障僅僅保證裝載順序,因此所有在讀記憶體屏障之前的裝載將在所有之後的裝載前完成。

多核寫屏障

所有在寫記憶體屏障之前的寫操作都將比隨後的寫操作先被所有cpu所感知。 多核寫記憶體屏障僅僅保證寫之間的順序,所有在記憶體屏障之前的儲存操作將在其後的儲存操作完成之前完成。 注意多核寫屏障通常應當與多核讀或者多核讀寫屏障配對使用。

多核讀寫屏障

所有在記憶體屏障之前的記憶體訪問(裝載和儲存)都將比隨後的記憶體訪問先被所有cpu所感知。 讀寫屏障保證屏障之前的載入、儲存操作都將在屏障之後的載入、儲存操作之前被系統中的其他元件看到。 讀寫屏障隱含讀和寫記憶體屏障,因此也可以替換它們中的任何乙個。

記憶體屏障介面都是基於體系結構相關指令實現,sylixos裡提供的是巨集函式介面,以kn_開頭,這些巨集實際對應到內聯彙編或彙編匯出函式。

實現**位於arch層對應體系結構目錄下,下面是powerpc下的實現。

#define kn_smp_mb()             __asm__ __volatile__ ("sync" : : : "memory")

#define kn_smp_rmb() __asm__ __volatile__ ("sync" : : : "memory")

#define kn_smp_wmb() __asm__ __volatile__ ("sync" : : : "memory")

#define kn_io_mb()      

#define kn_io_rmb()

#define kn_io_wmb()

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

#define kn_sync() __asm__ __volatile__ ("sync" : : : "memory")

#define kn_mb()                 kn_sync()

#define kn_rmb() kn_sync()

#define kn_wmb() kn_sync()

#define kn_dma_rmb()            __asm__ __volatile__ ("sync" : : : "memory")

#define kn_dma_wmb() __asm__ __volatile__ ("sync" : : : "memory")

優化屏障和記憶體屏障

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

JVM層級的記憶體屏障 JSR記憶體屏障

jsr記憶體屏障 loadload 對於這樣的語句load1 loadload load2,在load2及後續的讀操作要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢 storestore 對於這樣的語句store1 storestore store2,在store2及後續的寫操作執行前,...

關於記憶體屏障

define set mb var,value do while 0 define mb asm volatile memory 1 set mb mb barrier 函式追蹤到底,就是 asm volatile memory 而這行 就是記憶體屏障。2 asm 用於指示編譯器在此插入彙編語句 3...