volatile 與記憶體屏障

2021-09-30 07:28:23 字數 1356 閱讀 4613

volatile

c語言中 volatile 關鍵字用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。volatile只能保證編譯器不會做亂序執行優化.

1. 不對*p操作生成亂序指令(通常如此,具體請看後面的解釋)

(比如條件判斷)

2. 每次從*p取資料的時候,一定會進行一次訪存操作,哪怕前面不久才取過*p的值放在暫存器裡。

比如對於硬體暫存器的訪問,記憶體中的資料和cache中的資料可能不一致.

3.不合併對*p的寫操作(也只是通常如此,解釋見後)

int *p;

volatile int *p1;

p = 1;//這個被優化

p = 2;

p1 = 1; //這個不會

p1 = 2;

但volatile無法保證 cpu執行時亂序執行.

記憶體屏障(memory barrier)

如果要想控制cpu執行是亂序執行優化則需有記憶體屏障.

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

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

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

#define mb() do while (0)

#define rmb() do while (0)

#define wmb() do while (0)

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

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

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

3. __volatile__  相當於 c語言的volatile(見上面分析).

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

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

記憶體屏障 volatile 鎖 final

1.硬體層的記憶體屏障 load barrier 和 store barrier 作用 阻止屏障兩側的指令重排序 強制把寫緩衝區 快取記憶體中的髒資料等寫回主記憶體,讓快取中相應的資料失效。對於load barrier來說,在指令前插入load barrier,可以讓快取記憶體中的資料失效,強制從新...

volatile和記憶體屏障(dmb)

volatile c語言中 volatile 關鍵字用於告訴編譯器,嚴禁將此處的彙編語句與其它的語句重組合優化。volatile只能保證編譯器不會做亂序執行優化.1.不對 p操作生成亂序指令 通常如此,具體請看後面的解釋 比如條件判斷 2.每次從 p取資料的時候,一定會進行一次訪存操作,哪怕前面不久...

JMM volatile與記憶體屏障

為了實現volatile記憶體語義,jmm會分別限制編譯器重排序和處理器重排序 1.當第乙個操作為普通的讀或寫時,如果第二個操作為volatile寫,則編譯器不能重排序這兩個操作 1,3 2.當第乙個操作是volatile讀時,不管第二個操作是什麼,都不能重排序。這個規則確保volatile讀之後的...