內存屏障(英語:Memory barrier),也稱內存柵欄,內存柵障,屏障指令等,是一類同步屏障指令,是CPU或編譯器在對內存隨機訪問的操作中的一個同步點,使得此點之前的所有讀寫操作都執行後纔可以開始執行此點之後的操作。
大多數現代計算機爲了提高性能而採取亂序執行,這使得內存屏障成爲必須。
語義上,內存屏障之前的所有寫操作都要寫入內存;內存屏障之後的讀操作都可以獲得同步屏障之前的寫操作的結果。因此,對於敏感的程序塊,寫操作之後、讀操作之前可以插入內存屏障。
--------摘自維基百科 memory barrier inter 稱之爲memory fence
意思是說因爲現在計算機爲了提高性能採用了亂序執行,纔有屏障等指令(概念)
那亂序執行又是指什麼?
在計算機工程領域,亂序執行(錯序執行,英語:out-of-order execution,簡稱OoOE或OOE)是一種應用在高性能微處理器中來利用指令週期以避免特定類型的延遲消耗的範式。在這種範式中,處理器在一個由輸入數據可用性所決定的順序中執行指令,而不是由程序的原始數據所決定。在這種方式下,可以避免因爲獲取下一條程序指令所引起的處理器等待,取而代之的處理下一條可以立即執行的指令。
循序運行
主條目:指令週期
在早期的處理器中,指令的執行一般在以下的步驟中完成:
- 指令獲取。
- 如果輸入的運算對象是可以獲取的(比如已經存在於寄存器中),這條指令會被髮送到合適的功能單元。如果一個或者更多的運算對象在當前的時鐘週期中是不可獲取的(通常需要從主存獲取),處理器會開始等待直到它們是可以獲取的。
- 指令在合適的功能單元中被執行。
- 功能單元將運算結果寫回寄存器。
亂序執行
這種範式通過以下步驟挑選可執行的指令先運行:
- 指令獲取。
- 指令被髮送到一個指令序列中(也稱執行緩衝區或者保留站)。
- 指令將在序列中等待直到它的數據運算對象是可以獲取的。然後指令被允許在先進入的、舊的指令之前離開序列緩衝區。
- 指令被分配給一個合適的功能單元並由之執行。
- 結果被放到一個序列中。
- 僅當所有在該指令之前的指令都將他們的結果寫入寄存器後,這條指令的結果纔會被寫入寄存器中。這個過程被稱爲畢業或者退休週期。
亂序執行的重要概念是實現了避免計算機在用於運算的對象不可獲取時的大量等待。在上述文字的要點中,亂序執行處理器避免了在順序執行處理器處理過程第二步中當指令由於運算數據未到位所造成的等待。
b = a * 5
v = *b
c = a + 3
由於1與3可併發運行,而2之b無法隨即獲得,因此可以先計算乘法1與加法3,再運行2。
亂序執行使用其他“可以執行”的指令來填補了時間的空隙,然後再在結束時重新排序運算結果來實現指令的順序執行中的運行結果。指令在原始計算機代碼中的順序被稱爲程序順序,在處理器中他們被按照數據順序中被處理,這種順序中,數據,運算符,在計算機寄存器中變得可以獲取。一般來說亂序執行需要複雜的電路來實現轉換一種順序到另一中順序並且維護在輸出時的邏輯順序;而處理器本身就好像是隨機執行的樣子。
亂序執行所帶來的益處隨着指令管道的加深和主存(或者緩存)和處理器間的速度差的變大而增長。在現代計算機中,處理器的運算速度大大超越了內存速度,所以在順序執行處理器等待數據的過程中,亂序執行處理器能夠執行大量的指令。
--------摘自維基百科
參考:
https://stackoverflow.com/questions/286629/what-is-a-memory-fence
https://zh.wikipedia.org/wiki/%E4%B9%B1%E5%BA%8F%E6%89%A7%E8%A1%8C
https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C