CPU在进行读等待的同时执行指令,是CPU乱序的根源CPU乱序执行,是为了提高效率
CPU层面如何禁止重排序?
内存屏障, 对某部分内存做操作时前后添加的屏障, 屏障前后的操作不可以乱序执行
如何禁止乱序:
CPU层面:Intel 》》》原语(mfence lfence sfence) 或者锁总线
JVM层级:8个hanppens-before原则 4个内存屏障 (LL LS SL SS)
as-if-serial:不管硬件什么顺序,单线程执行的结果不变,看上去像是serial
X86 CPU内存屏障:
sfence:在sfence指令前的写操作,必须在sfence指令后的写操作前完成。lfence:在lfence指令前的读操作,必须在lfence指令后的读操作前完成。mfence:在mfence指令前的读写操作,必须在mfence指令后的读写操作前完成。
intel lock汇编指令:
原子指令,如x86上的”lock …” 指令是一个Full Barrier,执行时会锁住内存子系统来确保执行顺 序,甚至跨多个CPU。Software Locks通常使用了内存屏障或原子指令来实现变量可见性和保持程序顺序。
JSR内存屏障:
LoadLoad屏障:对于这样的语句Load1;LoadLoad;Load2, 在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。StoreStore屏障:对于这样的语句Store1;StoreStore;Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。LoadStore屏障: 对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。