關於記憶體屏障

2021-05-28 16:43:48 字數 588 閱讀 3708

#define set_mb(var, value) do  while (0)

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

1)set_mb(),mb(),barrier()函式追蹤到底,就是__asm__ __volatile__("":::"memory"),而這行**就是記憶體屏障。

2)__asm__用於指示編譯器在此插入彙編語句

3)__volatile__用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。即:原原本本按原來的樣子處理這這裡的彙編。

4)memory強制gcc編譯器假設ram所有記憶體單元均被彙編指令修改,這樣cpu中的registers和cache中已快取的記憶體單元中的資料將作廢。cpu將不得不在需要的時候重新讀取記憶體中的資料。這就阻止了cpu又將registers,cache中的資料用於去優化指令,而避免去訪問記憶體。

5)"":::表示這是個空指令。barrier()不用在此插入一條序列化彙編指令。在後文將討論什麼叫序列化指令。

6)__asm__,__volatile__,memory在前面已經解釋

優化屏障和記憶體屏障

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

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

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

Linux記憶體屏障

首先這裡有一篇文章介紹記憶體屏障的,寫的挺好的,可以看看 linux記憶體屏障是用來解決指令亂序的問題。什麼是指令的亂序呢?簡單一點說就是本來 裡面是這麼寫的 instruction a intstuction b 結果在cpu上執行變成了 instruction b instruction a 導...