使用内存映射文件时数据传输的路径是什么?

使用内存映射文件时数据传输的路径是什么?

在文件上使用 read()/write() 和使用 mmap() 的数据传输路径有什么区别吗?

"kernel" 是什么意思https://stackoverflow.com/a/41419353

mmap 不需要来自的文件数据的副本核心到用户空间。

read() 将数据从文件复制到内核空间的缓冲区,然后从内核缓冲区复制到用户空间的缓冲区,这是否正确?

当在文件上调用 mmap() 时,它是否将虚拟内存地址直接映射到文件,而中间没有任何内容(例如内核空间中的缓冲区)?

访问mmap()返回的虚拟内存地址时,数据传输的路径是什么?幕后中间是否涉及内核空间中的任何缓冲区?

就数据传输路径而言,mmap() 是否比 read()/write() 有优势?

答案1

在文件上使用 read()/write() 和使用 mmap() 的数据传输路径有什么区别吗?

是的,请参阅下文了解详细信息。

"kernel" 是什么意思https://stackoverflow.com/a/41419353

mmap 不需要来自的文件数据的副本核心到用户空间。

这是指映射到内核地址空间的内存。

read() 将数据从文件复制到内核空间的缓冲区,然后从内核缓冲区复制到用户空间的缓冲区,这是否正确?

是的,它必须:read读入用户空间提供的缓冲区,没有对齐约束,并且一旦读取数据,数据就应该与文件描述符完全分离。因此,内核读取满足所需的任何数据read(如果有的话 - 数据可能已经在页面缓存中,或在管道缓冲区中,或......),然后将请求的数据复制到用户空间提供的缓冲区中。

访问mmap()返回的虚拟内存地址时,数据传输的路径是什么?幕后中间是否涉及内核空间中的任何缓冲区?

当映射是文件支持时,数据被读入页缓存,内核允许mmapping 进程直接访问内存中相应的物理页(通过单独的页映射)。幕后不涉及任何缓冲区,至少只要进程不写入页面(并且行为取决于标志mmap)。

就数据传输路径而言,mmap() 是否比 read()/write() 有优势?

这已经在中详细讨论过你链接到的SO问题mmap避免了一些复制,但总体上是否比read/更好write取决于调用者正在做什么的细节。

在某些情况下,Linux 上的其他系统调用将提供更好的性能;参见例如sendfile,copy_file_range, 和splice

相关内容