主要学习即读和即写栅栏,以指令重排为前提,这对程序指令按照指定顺序执行,支持语言多线程特性有重要意义。通过了解CPU原语,对高级语言的某些特性抽丝剥茧。

概述

CPU原语级别提供支持,调度者通过对操作指令插入相关指令,强制干预指令优化。例如,写操作后插入写屏障,强制刷新cache到主内存,并对所有处理单元可见。读操作之前插入读屏障,确保跃过cache。

应用

下面用java语言来对应用和指令进行剖析,无码无真相

Java语言的原子操作和原子域

LoadLoad屏障:

抽象场景:Load1; LoadLoad; Load2

Load1 和 Load2 代表两条读取指令。在Load2要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

 

StoreStore屏障:

抽象场景:Store1; StoreStore; Store2

Store1 和 Store2代表两条写入指令。在Store2写入执行前,保证Store1的写入操作对其它处理器可见

 

LoadStore屏障:

抽象场景:Load1; LoadStore; Store2

在Store2被写入前,保证Load1要读取的数据被读取完毕。

 

StoreLoad屏障:

抽象场景:Store1; StoreLoad; Load2

在Load2读取操作执行前,保证Store1的写入对所有处理器可见。StoreLoad屏障的开销是四种屏障中最大的。