在cpu中,有著幾層結構,每層結構的讀寫速度差異很大,cpu為了提高效能,可能會對原來的指令進行重新排序,具體可以參考文章:
讀亂序:如果乙個cpu在讀取資料的時候快取不能命中,那麼必須要到主存中取,在cpu到主存,再從主存返回cpu的這段時間裡,相對於cpu來說,可以執行上百條指令了,如果cpu空閒等待,那麼就會降低效能,所以cpu會在後面執行的指令中挑選與之前指令沒有依賴關係的指令進行執行。
如何判斷是否有依賴關係:具體就是前面的結果會不會影響到後面的結果
寫亂序:同樣的,當cpu執行寫操作的時候,如果它在快取中不能命中,那麼它就必須到主存中進行操作,l2快取記憶體的速度大約比cpu慢20-30倍,再到後面就更加慢了。所以cpu會進行合併寫操作,在l1中查詢資料時,如果快取沒能命中,那麼cpu會使用另外乙個緩衝區(合併寫儲存緩衝區),在l2尚未結束操作的時候,cpu會把待寫入的資料一併放入合併寫儲存緩衝區中,該緩衝區大小一般是64位元組。這個緩衝區允許cpu在寫入或者讀取該緩衝區資料的同時繼續執行其他指令。
硬體記憶體屏障
三種方式:
原子指令,如x86上的」lock …「指令是乙個full barrier,執行時會鎖住記憶體子系統來確保執行順序,甚至跨多個cpu
jvm級別如何規範
volatile底層實現
jvm層面 volatile記憶體區的讀寫都加屏障
storestorebarrier
volatile 寫操作
storeloadbarrier
從**可以看出,第乙個屏障防止的上面的寫操作與volatile 對應的寫操作重排序,下面的屏障防止了volatile 對應的寫操作與下面的讀操作重排序
loadloadbarrier
volatile 讀操作
loadstorebarrier
從**可以看出,第乙個屏障防止的上面的讀操作與volatile 對應的讀操作重排序,下面的屏障防止了volatile 對應的讀操作與下面的寫操作重排序
synchronized底層實現
jvm層面
os和硬體層面
CPU指令亂序執行問題
cpu為了提高指令執行效率,會在一條指令執行過程中 比如去記憶體讀資料 慢100倍 去同時執行另一條指令,前提是,兩條指令沒有依賴關係 寫操作也可以進行合併 硬體記憶體屏障 x86 sfence store 在sfence指令前的寫操作當必須在sfence指令後的寫操作前完成。lfence load...
FastJson亂序問題
jsonobject jsonordered new jsonobject true 2 將string物件轉換過程中,不要調整順序 jsonobject jsonordered jsonobject.parseobject jsonstring,feature.orderedfield 3 物件序...
談CPU亂序執行和記憶體屏障
10多年前的程式設計師對處理器亂序執行和記憶體屏障應該是很熟悉的,但隨著計算機技術突飛猛進的發展,我們離底層原理越來越遠,這並不是一件壞事,但在有些情況下了解一些底層原理有助於我們更好的工作,比如現代高階語言多提供了多執行緒併發技術,如果不深入下來,那麼有些由多執行緒造成問題就很難排查和理解.今天準...