代码改变世界

1.2 cpu运行特性

2020-11-25 13:25  kuter  阅读(245)  评论(0)    收藏  举报

cpu 乱序执行:

cpu两条指令没有依赖关系,有可能发生指令的重排序,即乱序执行;

禁止指令重排实现方式:

1、inter cpu原语:lfence(load读屏障),mfence(mixed读写屏障),sfence(save写屏障)

  lfence:在lfence指令前的读操作必须在lfence指令后的读操作前完成;

  mfence:在mfence指令前的读写操作必须在mfence指令后的读写操作前完成;

  sfence:在sfence指令前的写操作必须在sfence指令后的写操作前完成;

2、总线锁 lock汇编指令:原子指令,是一个Full Barrier,执行时会锁住内存子系统来确保执行顺序,甚至跨多个cpu。software locks通常使用了内存屏障或原子指令来实现变量可见性

和保持程序顺序

在jvm中:LoadLoad屏障,StoreStore屏障,LoadStore屏障,StoreLoad屏障;

Load1;LoadLoad;Load2;在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完成。

Store1;StoreStore;Store2;在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

Load1;LoadStore;Store2;在Store2及后续写入操作前,保证Load1要读取的数据读取完毕。

Store1;StoreLoad;Load2;在Load2及后续要读取操作前,保证Store1的写入操作对所有处理器可见。

volatile关键字jvm实现:

写操作:

StoreStoreBarrier

volatile 写操作

StoreLoad

读操作:

LoadLoadBarrier

volatile 读操作

LoadStoreBarrier

as-if-serial:不管硬件什么顺序,单线程执行结果不变,看上去像是顺序执行!

cpu合并写技术:wc - write combining(一般写满4个字节,刷入缓存L2)

为了提高效率:cpu写入L1的同时wc写入L2

cpu:NUMA:Non Uniform Memory Access,非统一内存访问:cpu对离自己最近的内存的访问速度效率特别高,分配内存的时候会优先分配到cpu最近的内存里

java垃圾回收:ZGC-NUMA aware