CPU的乱序执行

本文探讨了CPU乱序执行的原因和优化措施,包括内存屏障的使用,如Intel的sfence、lfence和mfence指令,以及JVM层面的内存屏障和happens-before原则。同时介绍了禁止乱序的手段,如Intel的lock指令。内容涵盖了从硬件到软件层面的并发控制策略。
摘要由CSDN通过智能技术生成
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的写入对所有处理器可见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值