此次次要记录与cup相干的常识
cup乱序执行
(1)、介绍:cpu在进行读期待的同时执行指令,cpu乱序的本源,不是乱,而是提高效率,如上图,如果指令1和指令2没有依赖关系,指令2会优先执行,因为从内存获取指令1须要期待
(2)、导致的问题:DCL单例为什么要加volatile(volatile能够禁止指令重排),因为对象初始化有个两头态,这个时候如果产生指令重排,会有问题,如下图:
(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采纳了偷懒的形式
- cpu的合并写技术
此技术不重要,做个笔记而已,因为cpu的速度切实太快,所以在cpu内还有一个4字节的buffer,当cpu在向L1缓存写数据的时候会同时向这个buffer外面写,写满之后一次性刷到L2,因为L1写完都是要刷到L2的,罗唆间接写道这个buffer,满了就刷一次,总的来说也都是为了提高效率,此说法针对Intel CPU - UMA和NUMA
UMA(Uniform Memory Access),对立拜访内存,所有的cpu共享一块内存,领有雷同的拜访优先级,如下图:
NUMA(Non Uniform Memory Access)非对立拜访内存,在主板上有不同的插槽,每个cpu都有一块离本人最近的内存,本人的拜访优先级最高(也能够拜访他人家的内存,只是效率稍低一些),如下图:
4.拓展:as if serial 不论如何重排序,单线程执行后果不会变,看起来像失常的程序执行一样,比方a=1;y=b;这两条息息相关的指令,是能够进行重排序的
上一篇:https://segmentfault.com/a/11...