本次主要记录与cups相关的知识1.cup执行乱序(一),介绍:CPU在等待读取时执行指令,CPU的root乱序顺序,不是乱,而是为了提高效率,如上图,如果指令1和指令2之间没有依赖关系,指令2会先执行,因为从内存中获取指令1需要等待(2),导致问题中:DCL单例为什么要加Volatile(volatile可以禁止指令重排),因为对象初始化有一个中间状态,如果此时发生指令重排,就会出现问题,如下图:(3)、如何禁止指令重排(3-1)、CPU级:内存屏障:1、sfence:sfence指令之前的写操作必须在sfence指令之后的写操作之前完成。2、Ifence:Ifence指令之前的读操作必须在Ifence指令之后的读操作之前完成。3.mfence:mfence指令之前的读写操作必须在mfence指令之后的读写操作之前完成。Bus:intellockassemblyinstruction:原子指令,比如x86上的“lock...”指令是一个FullBarrier,在执行过程中会锁住内存子系统保证执行顺序(实际上是锁住内存总线),甚至跨越多个CPU,SoftwareLocks通常使用内存屏障或原子指令来实现变量可见性并保持程序顺序(3-2),jvm级别(8个hanppens-before原则和4个内存屏障(LLLSSLSS)):JSR内存屏障(cpulockinstruction):不是每个cpu都有,lock指令大部分cpu都有,所以jvm采用了lazy的方式,里面还有一个4字节的buffer。当CPU向L1缓存写入数据时,会同时写入这个缓冲区。写满后会一次性刷到L2,因为L1写完必须刷到L2。直接写这个buffer,满了就刷新,总的来说是为了提高效率。本声明针对的是IntelCPU3。访问优先级相同,如下图:NUMA(NonUniformMemoryAccess)内存非统一访问,主板上有不同的插槽,每个CPU都有一块离自己最近的内存,有自己的访问优先级是最高的(也可以访问别人的内存,但是效率略低),如下图:4.扩展:无论asifserial怎么重排序,单线程执行结果都不会改变,它看起来像一个正常的顺序执行,例如a=1;y=b;这两条不相关的指令可以重新排序上一篇:https://segmentfault.com/a/11...下一篇:https://segmentfault.com/a/11...
