A memory barrier, also known as a membar, memory fence or fence instruction, 是一种屏障指令,它使中央处理单元(CPU)或编译器对在屏障指令之前和之后发出的内存操作强制执行排序约束。这通常意味着,在 屏障之前发出的操作 保证在 屏障之后发出的操作 之前执行。
当程序在单CPU计算机上运行时,硬件执行必要的簿记,以确保程序执行时就像所有内存操作都按照程序员指定的顺序执行一样(程序顺序),因此不需要内存屏障。但是,当内存与多个设备共享时,例如多处理器系统中的其他CPU或内存映射的外围设备,无序访问可能会影响程序行为。例如,第二CPU可以看到第一CPU在与程序顺序不同的序列中进行的存储器更改。
以下两个处理器程序给出了这种无序执行如何影响程序行为的示例:最初,内存位置x和f都保持值0。在处理器#1上运行的程序在f为零时循环,然后打印x的值。在处理器#2上运行的程序将值42存储到x中,然后将值1存储到f中。这两个程序片段的伪代码如下所示.程序的步骤对应于各个处理器指令。
Processor #1:
while (f == 0); // Memory fence required here print x;
Processor #2:
x = 42; // Memory fence required here f = 1;
类似地,处理器#1的加载操作可能会被无序执行,并且在检查f之前可以读取x,因此print语句可能再次打印出一个意外的值。对于大多数程序来说,这两种情况都是可以接受的。
可以在处理器#2分配给f之前插入内存屏障,以确保在f值变化时或之前,其他处理器都可以看到x的新值。另一个可以插入到处理器#1对x的访问之前,以确保在看到f值的变化之前,不读取x的值。