Skip to content
On this page

概述

理想很丰满,现实很骨感,你的程序也一样,不一定会按照你的预期走

1.什么是内存屏障

是确保某些指令一定要在另外一些指令之前执行的一种机制,本质上讲是一条指令。

从软件的角度讲内存屏障和内存没有什么直接的关系,它仅仅是叫内存屏障。

2.为什么需要内存屏障

主要是为了解决指令顺序一致性问题。

2.1 什么是顺序一致性

软件的顺序分为两种

  1. 软件编写时顺序
  2. 软件执行时顺序

所谓顺序一致就是指软件的两种顺序要一致,也就是程序的执行和程序编写者的预期是一致的。

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)

如何使用,通过伪代码来展示

foo(){
	Instruction-1;
	mb();
    Instruction-2
}

在上面的伪代码中,可以确保Instruction-2在Instruction-1之后执行。

4.缓存一致性是否需要内存屏障来解决

缓存一致性是指多CPU系统中,一个CPU对某个地址内容修改过后,要保证另外一个CPU访问这个地址后,拿到的值是最新的。 但是这个需要内存一致性来解决吗?答案是不需要,这个是由硬件通过协议来完成的,不需要软件的任何参于。

Released under the MIT License.