cpu為了提高指令執行效率,會在一條指令執行過程中(比如去記憶體讀資料(慢100倍)),去同時執行另一條指令,前提是,兩條指令沒有依賴關係
寫操作也可以進行合併
硬體記憶體屏障 x86
sfence: store| 在sfence指令前的寫操作當必須在sfence指令後的寫操作前完成。 lfence:load | 在lfence指令前的讀操作當必須在lfence指令後的讀操作前完成。 mfence:modify/mix | 在mfence指令前的讀寫操作當必須在mfence指令後的讀寫操作前完成。
原子指令,如x86上的」lock …」 指令是乙個full barrier,執行時會鎖住記憶體子系統來確保執行順序,甚至跨多個cpu。software locks通常使用了記憶體屏障或原子指令來實現變數可見性和保持程式順序jvm級別如何規範(jsr133)
loadload屏障: 對於這樣的語句load1; loadload; load2,在load2及後續讀取操作要讀取的資料被訪問前,保證load1要讀取的資料被讀取完畢。
storestore屏障:
對於這樣的語句store1; storestore; store2,
在store2及後續寫入操作執行前,保證store1的寫入操作對其它處理器可見。
loadstore屏障:
對於這樣的語句load1; loadstore; store2,
在store2及後續寫入操作被刷出前,保證load1要讀取的資料被讀取完畢。
storeload屏障: 對於這樣的語句store1; storeload; load2,
在load2及後續所有讀取操作執行前,保證store1的寫入對所有處理器可見。
位元組碼層面 acc_volatile
jvm層面 volatile記憶體區的讀寫 都加屏障
storestorebarrier
volatile 寫操作
storeloadbarrier
loadloadbarriervolatile 讀操作
loadstorebarrier
os和硬體層面 hsdis - hotspot dis assembler windows lock 指令實現
位元組碼層面 acc_synchronized monitorenter monitorexit
jvm層面 c c++ 呼叫了作業系統提供的同步機制
os和硬體層面 x86 : lock cmpxchg / ***
簡單說 CPU亂序問題
在cpu中,有著幾層結構,每層結構的讀寫速度差異很大,cpu為了提高效能,可能會對原來的指令進行重新排序,具體可以參考文章 讀亂序 如果乙個cpu在讀取資料的時候快取不能命中,那麼必須要到主存中取,在cpu到主存,再從主存返回cpu的這段時間裡,相對於cpu來說,可以執行上百條指令了,如果cpu空閒...
談CPU亂序執行和記憶體屏障
10多年前的程式設計師對處理器亂序執行和記憶體屏障應該是很熟悉的,但隨著計算機技術突飛猛進的發展,我們離底層原理越來越遠,這並不是一件壞事,但在有些情況下了解一些底層原理有助於我們更好的工作,比如現代高階語言多提供了多執行緒併發技術,如果不深入下來,那麼有些由多執行緒造成問題就很難排查和理解.今天準...
CPU執行指令和磁碟IO
cpu的計算時間比磁碟io要快得多的多,而且增長速度也比磁碟io的增長快得多。平均來說,一次io的時間,cpu就能執行40萬條指令.所以我們寧願用指令來處理,而不是依賴於io.所以很多情況下,我們寧願進行一次複雜的cpu計算,以此來減少磁碟的io 磁碟7200轉每秒,1轉占用1 120秒,8.3毫秒...