浅谈什么是内存屏障(Memory Barrier)
顺序执行的性能问题
从常识来看,CPU肯定都是按顺序执行指令,因为我们写的程序相当于是一大批指令的集合,CPU执行我们的程序相当于从我们写的main函数开始(不考虑操作系统的工作),一条条指令按顺序执行。
按顺序执行看起来没毛病,但是这里会有一点点性能问题,假设CPU要执行一组指令,执行到某一条指令时,要从主存里读取数据,我们知道从CPU从内存读取数据大约要耗费400个时钟周期(Cycle),假如这一条指令和这条数据没什么关系,按道理是不需要等待这么多时钟周期的,但是因为是顺序执行,所以CPU只能等数据读取到寄存器里之后再执行下一条指令。
我们现在用的CPU性能可以达到5GHZ,相当于每秒能处理50亿个时钟周期的运算,看起来400并不多,但是累计下来,这个优化的空间还是蛮大的。
乱序执行
乱序执行技术是现代CPU为了提高指令执行吞吐率的一个优化技术,它可以用来最大化减少pipeline stall。
pipeline stall 就是上面说的时钟等待问题,因为cpu是通过流水线(pipeline)来执行指令的,所以如果遇到了时钟等待问题,那整个流水线就停滞了。
如果某一条指令遇到了时钟等待问题,并且后续的指令和这条指令不相关,乱序执行技术可以把这条等待的指令弹回指令队列,这样本来浪费的时钟周期就可以用来执行其他指令。
内存屏障
内存屏障是一个程序指令,这个指令看可以让CPU执行一段指令期间,不乱序执行。相当于在某一个阶段,禁止CPU的乱序执行优化。
内存屏障在大多数情况是没有必要使用的,因为会带来一些性能损失,但是在一些关键部分,例如某些多线程场景,指令的执行顺序可能会影响程序的结果,这个场景下内存屏障就可以规避一些异常结果了。