内存屏障
来自智得网
简介
程序执行的顺序和代码的顺序不一定是一致的,因为程序编译期间的优化、cache访问的优化以及多核等因素都会导致CPU指令乱序执行,这些乱序可能会导致程序的运行结果不符合预期。
内存屏障会设置同步点,即使在多核的情况下也可以保障屏障前后的内存访问的一致性。
原理
编译屏障
编译屏障告诉编译器不要对当前代码进行过度的优化,保证生成的汇编代码的指令顺序尽量和编程语言的代码顺序保持一致。编译屏障对CPU执行时产生的重排序没有任何作用。
写内存屏障
写内存屏障可以起到两个作用:
- 指令重排的限制,写内存屏障之前的写操作将在屏障后的写操作之前发生。
- 写内存屏障之后的写入指令之前,会清空当前CPU存储缓冲中的所有写操作,将这些数据全部写入到主存中。这样的话系统中的其它的CPU,其他的线程就可以看到写内存屏障之后的写入数据之前先看到写内存屏障之前的写入数据。
读内存屏障
写内存屏障可以起到两个作用:
- 指令重排的限制,读内存屏障之前的读操作将在屏障后的读操作之前发生。
- 在执行读内存屏障之后的读取指令之前,一定要保证处理完当前CPU的无效队列。这样的话,当前CPU的缓存状态将完全遵照MESI协议,可以保证缓存数据一致性。
读写内存屏障
读写内存屏障可以起到两个作用:
- 通用内存屏障也会对处理器指令重排做出一些限制,也就是在通用内存屏障之前的写入和读取指令一定不会被重排序到通用内存屏障之后的写入和读取指令之后。
- 其次,在执行通用内存屏障之后的任何写入和读取取指令之前,一定要保证清空当前CPU存储缓冲中的所有写操作,并且还要处理完当前CPU的无效队列。