内存屏障

更新时间:
2024-03-14
下载文档

内存屏障

内存屏障

在早期处理器中,处理器的指令执行顺序与代码编写顺序是保持一致的,这种执行顺序称为 按序执行 。但是如果某一条指令需要等待之前指令的执行结果,那么该指令之后的所有的指令均需要等待。为了充分发挥指令流水线以及多个执行单元的优势,处理器引入了 乱序执行 的概念。

乱序执行 是指多条指令不按程序原有顺序执行。乱序执行要求这两条指令没有数据依赖关系或者控制依赖关系,如果存在依赖关系,则不能乱序执行。

在单核处理器中,乱序执行不会导致程序的执行结果远离预期结果,但是在多核环境下就很难保证程序执行结果的正常。

在多核环境下,每个核的指令都可能被乱序,并且由于处理器还有多层缓存机制(如 L1,L2 等)。如果我们在一个核上对数据执行写入操作,并且通过一个标记来表示此数据已经写入完毕,另一个核通过此标记来判断数据是否已经写入完毕,就可能存在风险,这是因为标记可能已经被修改,但是数据操作还未完成,最终导致另一个核未能使用到正确的数据,从而带来不可预估的后果。

乱序执行的目的是为了提升处理器的性能,但是在多核的环境中很可能会出现问题,因此需要引入一种机制来消除这种不良影响,用来禁止处理器对某些地方的乱序执行,这种机制就是内存屏障。

内存屏障 ,也称内存栅栏,内存栅障,屏障指令等。是一类同步屏障指令,是处理器或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。内存屏障可以抑制乱序,维持程序所期望的逻辑。

内存屏障阻碍了处理器采用优化技术来降低内存操作延迟,因此必须考虑使用内存屏障带来的性能损失。

SylixOS 内存屏障有三种:多核读屏障、多核写屏障以及多核读写屏障,如下表所示。

名称函数名作用
多核读屏障KN_SMP_RMB在多核之间设置一个读屏障
多核写屏障KN_SMP_WMB在多核之间设置一个写屏障
多核读写屏障KN_SMP_MB在多核之间设置一个完全读写屏障

多核读屏障

一个特定 CPU 在内存屏障之前的所有读操作相比内存屏障之后的读操作,优先被所有 CPU 所感知。

读内存屏障仅仅保证装载顺序,因此所有在读内存屏障之前的装载,将在所有之后的装载前完成。

多核写屏障

所有在写内存屏障之前的写操作都将比随后的写操作,优先被所有 CPU 所感知。

多核写内存屏障仅仅保证写之间的顺序,所有在内存屏障之前的存储操作,将在其后的存储操作完成之前完成。

注意,多核写屏障通常应当与多核读或者多核读写屏障配对使用。

多核读写屏障

所有在内存屏障之前的内存访问(装载和存储)(KN_SMP_MB)都将比随后的内存访问先被所有 CPU 所感知。

读写屏障保证屏障之前的加载、存储操作都将在屏障之后的加载、存储操作之前被系统中的其他组件看到。

读写屏障隐含读和写内存屏障,因此也可以替换它们中的任何一个。

文档内容是否对您有所帮助?
有帮助
没帮助