此次主要记录与cup相关的知识

1. cup乱序执行

image

(1)、介绍:

cpu在进行读等待的同时执行指令,cpu乱序的根源,不是乱,而是提高效率,如上图,如果指令1和指令2没有依赖关系,指令2会优先执行,因为从内存获取指令1需要等待

(2)、导致的问题:

DCL单例为什么要加volatile(volatile可以禁止指令重排),因为对象初始化有个中间态,这个时候如果发生指令重排,会有问题,如下图:
image
image

(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共享一块内存,拥有相同的访问优先级,如下图:
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...


萌妹子_liu
28 声望43 粉丝

萌萌哒,程序猿