java程序员需要知道的底层知识(二)

此次主要记录与cup相关的知识
  1. cup乱序执行
    java程序员需要知道的底层知识(二)_第1张图片
    (3)、如何禁止指令重排

    (3-1)、CPU层面:内存屏障:1、sfence:在sfence指令前的写操作当必须在sfence指令后的写操作前完成。2、Ifence:在Ifence指令前的读操作当必须在Ifence指令后的读操作前完成。3、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共享一块内存,拥有相同的访问优先级,如下图:

java程序员需要知道的底层知识(二)_第2张图片

NUMA(Non Uniform Memory Access)非统一访问内存,在主板上有不同的插槽,每个cpu都有一块离自己最近的内存,自己的访问优先级最高(也可以访问别人家的内存,只是效率稍低一些),如下图:

java程序员需要知道的底层知识(二)_第3张图片

4.拓展:as if serial 不管如何重排序,单线程执行结果不会变,看起来像正常的顺序执行一样,比如a=1;y=b;这两条毫不相关的指令,是可以进行重排序的

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

你可能感兴趣的:(服务器,linux)