Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 读记忆障碍的含义是什么?_Linux_Kernel_Memory Barriers - Fatal编程技术网

Linux 读记忆障碍的含义是什么?

Linux 读记忆障碍的含义是什么?,linux,kernel,memory-barriers,Linux,Kernel,Memory Barriers,我看过一些关于Linux内存障碍的文档。它提到了读记忆屏障和写记忆屏障。我很容易理解写记忆屏障的含义,我不认为读记忆屏障的必要性 它只是为了保持内存区域的读取顺序吗?如果顺序是相反的,我认为这个值应该还是正确的,不是吗 读存储器屏障也是如此:读操作屏障读操作还是写操作屏障读操作 这把我弄糊涂了 读存储器屏障强制在它之前读取,在它之后读取之前完成。例如,这对于内存映射I/O非常有用,其中从内存读取实际上是从连接到系统的某个设备读取 MMIO读取需要按程序顺序执行,因为它们可能会对正在读取的设备产生

我看过一些关于Linux内存障碍的文档。它提到了读记忆屏障和写记忆屏障。我很容易理解写记忆屏障的含义,我不认为读记忆屏障的必要性

它只是为了保持内存区域的读取顺序吗?如果顺序是相反的,我认为这个值应该还是正确的,不是吗

读存储器屏障也是如此:读操作屏障读操作还是写操作屏障读操作


这把我弄糊涂了

读存储器屏障强制在它之前读取,在它之后读取之前完成。例如,这对于内存映射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文档指出“读屏障通常应该与写屏障配对”