读取内存屏障的含义是什么?

时间:2014-03-05 17:26:09

标签: linux kernel memory-barriers

我见过一些关于Linux内存障碍的文档。它提到有读取内存屏障和写入内存屏障。我很容易理解写内存屏障的含义,我没有看到读内存屏障的必要性!

只是保持内存区域的读取顺序吗?如果订单是反向的,我认为价值仍然是正确的,不是吗?

读存储器屏障是这样的:读操作屏障读操作还是写操作屏障读操作?

让我感到困惑!

2 个答案:

答案 0 :(得分:2)

读取内存屏障会在读取之前强制读取,然后再读取。例如,这对于内存映射I / O很有用,其中从内存中读取实际上是从连接到系统的某些设备读取的。

MMIO读取需要按程序顺序执行,因为它们可能会对您正在读取的设备产生副作用。例如,如果设备是流数据,则读取该值可能会导致设备用新值替换它。它还可能导致可能在不同的MMIO位置触发更改的操作。因此,必须对这两个位置进行读取,因为结果取决于它们的执行顺序。

答案 1 :(得分:1)

有时甚至必须订购没有副作用的读数。请考虑以下习语:

extern some_flag_type message_is_ready_flag;
extern some message_type message_data;
while(message_is_ready_flag)     // First read
    continue;
... = message_data;              // Second read

假设某个其他线程首先写入message_data,然后写入message_is_ready_flag。

如果在上面的代码中,第二次读取首先发生,则可能无法读取预期值。请注意,写入线程需要使用相应的写入器屏障。这就是为什么Linux文档指出“读取障碍通常应该与写入障碍配对”。