在文件上使用 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()返回的虚拟内存地址时,数据传输的路径是什么?幕后中间是否涉及内核空间中的任何缓冲区?
当映射是文件支持时,数据被读入页缓存,内核允许mmap
ping 进程直接访问内存中相应的物理页(通过单独的页映射)。幕后不涉及任何缓冲区,至少只要进程不写入页面(并且行为取决于标志mmap
)。
就数据传输路径而言,mmap() 是否比 read()/write() 有优势?
这已经在中详细讨论过你链接到的SO问题。mmap
避免了一些复制,但总体上是否比read
/更好write
取决于调用者正在做什么的细节。
在某些情况下,Linux 上的其他系统调用将提供更好的性能;参见例如sendfile
,copy_file_range
, 和splice
。