如何禁止CPU指令重排


CPU的內存屏障(硬件層級)

Intel的CPU內存屏障邏輯:

sfence:save| 在sfence指令前的寫操作當必須在sfence指令后的寫操作前完成

兩條指令,如果不想讓它重排,在兩條指令中間加一道屏障。即 屏障兩側的寫指令不能重排

lfence:load| 在lfence指令前的寫操作當必須在lfence指令后的寫操作前完成

mfence:mix| 在mfence指令前的寫操作當必須在mfence指令后的寫操作前完成

除了內存屏障,也可以使用原子指令,如x86上的"lock..." lock后面的指令不允許重排序

JVM級別的規范(軟件層級)

LoadLoad屏障:

  對於這樣的語句Load1;LoadLoad;Load2,在Load2及后續讀取操作要讀取的數據被訪問前,保證Load1要讀取的數據被讀取完畢

SroreStore屏障:

  對於這樣的語句Store1;SroreStore;Store2,在Store2及后續寫入操作要讀取的數據被訪問前,保證Store1的寫入操作對其他處理器可見

LoadStore屏障:

  對於這樣的語句Load1; LoadStore; Store2,在Store2及后續寫入操作被刷出前,保證Load1要讀取的數據被讀取完畢。

StoreLoad屏障:

  對於這樣的語句Store1; StoreLoad; Load2,在Load2及后續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。  

volatile的實現細節

1.字節碼層面 ,編譯完成在Class文件上加了ACC_VOLATILE

2.JVM層面讀到ACC_VOLATILE時,會內存區的讀寫 都加屏障

StoreStoreBarrier

volatile 寫操作

StoreLoadBarrier
LoadLoadBarrier

volatile 讀操作

LoadStoreBarrier

volatile保證可見性的原理是添加內存屏障,而這些內存屏障在保障了線程之間的可見性的同時,也禁止了指令重排序。

3.操作系統OS實現

OS和硬件層面 https://blog.csdn.net/qq_26222859/article/details/52235930

hsdis - HotSpot Dis Assembler

windows lock 指令實現 | MESI實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM