概述 #
理想很丰满,现实很骨感,你的程序也一样,不一定会按照你的预期走
1.什么是内存屏障 #
是确保某些指令一定要在另外一些指令之前执行的一种机制,本质上讲是一条指令。
从软件的角度讲内存屏障和内存没有什么直接的关系,它仅仅是叫内存屏障。
2.为什么需要内存屏障 #
主要是为了解决指令顺序一致性问题。
2.1 什么是顺序一致性 #
软件的顺序分为两种
- 软件编写时顺序
- 软件执行时顺序
所谓顺序一致就是指软件的两种顺序要一致,也就是程序的执行和程序编写者的预期是一致的。
2.2 为什么会不一致 #
原因主要是如下三个:
编译器原因
编译器在编译时,会对代码进行编译优化,从而提高代码执行效率,这个时候就可能会改变代码的执行顺序。也就是所谓的基于依赖的优化。
代码乱序执行
现代CPU多具备多发射,乱序执行等功能,主要是提高效率,但这必然会有一致性的问题产生。
多处理器同步
在多CPU的系统中,当一个CPU在进行读写操作时,可能有其他的CPU会进行读写操作,就可能会出现不一致的问题。
3.通过内存屏障来解决一致性问题 #
内存屏障简单来讲就是一条CPU指令,每个平台上实现不一样,在ARM架构实现如下:
#define isb() asm volatile("isb" : : : "memory")
#define dmb(opt) asm volatile("dmb " #opt : : : "memory")
#define dsb(opt) asm volatile("dsb " #opt : : : "memory")
#define mb() dsb(sy)
#define rmb() dsb(ld)
#define wmb() dsb(st)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
如何使用,通过伪代码来展示
foo(){
Instruction-1;
mb();
Instruction-2
}
1
2
3
4
5
6
2
3
4
5
6
在上面的伪代码中,可以确保Instruction-2在Instruction-1之后执行。
4.缓存一致性是否需要内存屏障来解决 #
缓存一致性是指多CPU系统中,一个CPU对某个地址内容修改过后,要保证另外一个CPU访问这个地址后,拿到的值是最新的。 但是这个需要内存一致性来解决吗?答案是不需要,这个是由硬件通过协议来完成的,不需要软件的任何参于。