Linux 读记忆障碍的含义是什么?
我看过一些关于Linux内存障碍的文档。它提到了读记忆屏障和写记忆屏障。我很容易理解写记忆屏障的含义,我不认为读记忆屏障的必要性 它只是为了保持内存区域的读取顺序吗?如果顺序是相反的,我认为这个值应该还是正确的,不是吗 读存储器屏障也是如此:读操作屏障读操作还是写操作屏障读操作Linux 读记忆障碍的含义是什么?,linux,kernel,memory-barriers,Linux,Kernel,Memory Barriers,我看过一些关于Linux内存障碍的文档。它提到了读记忆屏障和写记忆屏障。我很容易理解写记忆屏障的含义,我不认为读记忆屏障的必要性 它只是为了保持内存区域的读取顺序吗?如果顺序是相反的,我认为这个值应该还是正确的,不是吗 读存储器屏障也是如此:读操作屏障读操作还是写操作屏障读操作 这把我弄糊涂了 读存储器屏障强制在它之前读取,在它之后读取之前完成。例如,这对于内存映射I/O非常有用,其中从内存读取实际上是从连接到系统的某个设备读取 MMIO读取需要按程序顺序执行,因为它们可能会对正在读取的设备产生
这把我弄糊涂了 读存储器屏障强制在它之前读取,在它之后读取之前完成。例如,这对于内存映射I/O非常有用,其中从内存读取实际上是从连接到系统的某个设备读取
MMIO读取需要按程序顺序执行,因为它们可能会对正在读取的设备产生副作用。例如,如果设备正在传输数据,则读取该值可能会导致设备将其替换为新值。它还可能导致在不同MMIO位置触发更改的操作。因此,必须对这两个位置的读取进行排序,因为结果取决于它们的执行顺序。即使没有副作用的读取有时也必须进行排序。考虑下面的成语:
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
假设其他线程将首先写入消息_数据,然后写入消息_is_ready_标志
如果在上面的代码中,第二次读取首先发生,那么它可能不会读取预期的值。请注意,写入线程需要使用相应的写入程序屏障。这就是为什么Linux文档指出“读屏障通常应该与写屏障配对”