关于JAVA并发编程你需要知道的——硬件篇
生活随笔
收集整理的這篇文章主要介紹了
关于JAVA并发编程你需要知道的——硬件篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
無論程序語言如何千變萬化,他們都深深地根植于目前的計算機體系結構。
左圖是intel CPU的三級高速緩存設計,由于高速緩存對程序員基本不可見,因此可以抽象為右圖。
緩存的設計
首先還是先談談左圖。
相關的問題
明白緩存的設計之后,再看右圖來分析其中的問題
相關的實現
為了解決這些問題,CPU提供了一些指令,其中比如lock和cmpxchg。
- lock 匯編前綴,在Intel奔騰系列之前,這個指令前綴能夠鎖定總線,禁止其他CPU核心操作內存,執行完后邊的指令后釋放總線,在這個過程中其他CPU核心會監聽總線,發現某個內存地址內容被修改,就會將本核心下的對應cache行有效位置0。因為鎖總線會禁止所有內存操作,降低效率,因此在奔騰之后,這個指令前綴不鎖總線而是鎖定相關的cache行,對某個地址修改后直接讓相關cache失效。這樣解決了問題一
- cmpxchg 將寄存器a中的值與內存中比較如果一樣,將寄存器c中的值和內存中的值交換,如果不一樣就設置異常位并將內存中的值讀取到寄存器a。代入到問題二,從內存讀取值到寄存器a,加一后保存到寄存器c,然后執行cmpxchg,執行完后如果有異常,就重新加一,再嘗試寫回,直到成功。這樣解決了問題二
- cmpxchg和lock 在執行完以后會將writebuffer刷到cache并清空readbuffer,這樣解決了問題三。另外X86_64引入了內存屏障指令 lfence、sfence、mfence。lfence前面的讀取操作完成,也就是readbuffer中的內容全部被cpu讀取后,才能執行lfence之后的讀取操作;sfence前面的寫入操作完成,也就是writebuffer全部刷到緩存中,才能執行sfence之后的寫入操作;mfence之前的讀寫操作全部完成,才能進行mfence之后的操作。
轉載于:https://www.cnblogs.com/hanzai/p/6624246.html
總結
以上是生活随笔為你收集整理的关于JAVA并发编程你需要知道的——硬件篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go 语言系列(二)基本数据类型和操作符
- 下一篇: TensorFlow 从零到helloW