乐趣区

关于服务器:java程序员需要知道的底层知识二

此次次要记录与 cup 相干的常识
  1. 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 采纳了偷懒的形式
  2. cpu 的合并写技术
    此技术不重要,做个笔记而已,因为 cpu 的速度切实太快,所以在 cpu 内还有一个 4 字节的 buffer,当 cpu 在向 L1 缓存写数据的时候会同时向这个 buffer 外面写,写满之后一次性刷到 L2,因为 L1 写完都是要刷到 L2 的,罗唆间接写道这个 buffer,满了就刷一次,总的来说也都是为了提高效率,此说法针对 Intel CPU
  3. 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…

退出移动版