java程序員須要知道的底層知識(二)

這次主要記錄與cup相關的知識
  1. cup亂序執行
    image
    (1)、介紹:cpu在進行讀等待的同時執行指令,cpu亂序的根源,不是亂,而是提升效率,如上圖,若是指令1和指令2沒有依賴關係,指令2會優先執行,由於從內存獲取指令1須要等待
    (2)、致使的問題:DCL單例爲何要加volatile(volatile能夠禁止指令重排),由於對象初始化有個中間態,這個時候若是發生指令重排,會有問題,以下圖:
    image
    image
    (3)、如何禁止指令重排segmentfault

    (3-1)、CPU層面:內存屏障:一、sfence:在sfence指令前的寫操做當必須在sfence指令後的寫操做前完成。二、Ifence:在Ifence指令前的讀操做當必須在Ifence指令後的讀操做前完成。三、mfence:在mfence指令前的讀寫操做當必須在mfence指令後的讀寫操做前完成
    鎖總線:intel lock彙編指令:原子指令,如x86上的「lock...」指令是一個Full Barrier,執行時會鎖住內存子系統來確保執行順序(其實是鎖內存總線),甚至跨多個CPU,Software Locks一般使用了內存屏障或原子指令來實現變量的可見性和保存程序順序
    (3-2)、jvm層面(8個hanppens-before原則 4個內存屏障(LL LS SL SS)): JSR內存屏障(cpu的lock指令):對於cpu的原語(sfence、Ifence、mfence)不是每一個cpu都有,而lock指令是大部分cpu都有的,因此jvm採用了偷懶的方式
  2. cpu的合併寫技術
    此技術不重要,作個筆記而已,由於cpu的速度實在太快,因此在cpu內還有一個4字節的buffer,當cpu在向L1緩存寫數據的時候會同時向這個buffer裏面寫,寫滿以後一次性刷到L2,由於L1寫完都是要刷到L2的,乾脆直接寫道這個buffer,滿了就刷一次,總的來講也都是爲了提升效率,此說法針對Intel CPU
  3. UMA和NUMA
    UMA(Uniform Memory Access),統一訪問內存,全部的cpu共享一塊內存,擁有相同的訪問優先級,以下圖:

image

NUMA(Non Uniform Memory Access)非統一訪問內存,在主板上有不一樣的插槽,每一個cpu都有一塊離本身最近的內存,本身的訪問優先級最高(也能夠訪問別人家的內存,只是效率稍低一些),以下圖:

image

4.拓展:as if serial 無論如何重排序,單線程執行結果不會變,看起來像正常的順序執行同樣,好比a=1;y=b;這兩條絕不相關的指令,是能夠進行重排序的緩存

上一篇:https://segmentfault.com/a/11...
下一篇:https://segmentfault.com/a/11...jvm

相關文章
相關標籤/搜索