Linux read()是否将数据复制到进程地址空间

Linux read()是否将数据复制到进程地址空间,linux,caching,io,Linux,Caching,Io,我试图理解read()和mmap()之间的具体区别。我对这两个方面都有基本的了解,但有一些基本的东西我没有理解 我想答案很简单,但问题是: 假设您打开一个文件“test.txt”,该文件不在文件缓存中,您希望读取前64个字节。我的理解是,第一个4k字节被读入页面缓存,然后64个字节被复制到用于read()调用的缓冲区中 我的问题是: 1) 当您通过read()读入数据并将4k存储在文件系统缓存中时,这会占用进程的虚拟内存地址空间,还是只是磁盘缓存空间,以后可能/将被调出?我知道mmap会将文件(

我试图理解read()和mmap()之间的具体区别。我对这两个方面都有基本的了解,但有一些基本的东西我没有理解

我想答案很简单,但问题是:

假设您打开一个文件“test.txt”,该文件不在文件缓存中,您希望读取前64个字节。我的理解是,第一个4k字节被读入页面缓存,然后64个字节被复制到用于read()调用的缓冲区中

我的问题是:

1) 当您通过read()读入数据并将4k存储在文件系统缓存中时,这会占用进程的虚拟内存地址空间,还是只是磁盘缓存空间,以后可能/将被调出?我知道mmap会将文件(或文件的一部分)映射到进程地址空间,但我无法确定read()是否使用进程地址空间。我猜这不是因为read()不允许您随机访问文件的某些部分(正确吗?)

2) 复制到read()返回的缓冲区中供进程使用的64个字节,这些数据是占用进程地址空间还是只占用磁盘空间缓存

我的理解是,第一个4k字节被读入页面缓存,然后64个字节被复制到用于read()调用的缓冲区中

总的来说,这是正确的。(但总有例外——在这种情况下。你真的不需要太担心,除非你在处理一些I/O死角案例…)

当您通过read()读入数据并将4k存储在文件系统缓存中时,这会占用进程的虚拟内存地址空间,还是只是磁盘缓存空间,以后可能/将被调出

后者——磁盘缓存是内核空间中的内存,用于缓存磁盘上的数据内容。而且它可以被分页(就像大多数内存页一样)

复制到read()返回的缓冲区中供进程使用的64个字节,这些数据是占用进程地址空间还是只占用磁盘空间缓存

数据从磁盘缓存(内核内存)复制到用户空间的缓冲区中。所以数据都在这两个地方。(这是直接I/O的原因-消除了额外的复制步骤和数据本身的额外复制)

I/O性能是一个复杂的主题。在一种情况下速度最快的东西在另一种情况下可能根本就不是最快的。从CPU速度到内存带宽,到PCI总线带宽,再到磁盘控制器特性,再到SATA/SAS/SCSI/FC/iSCSI带宽和延迟,再到实际的物理磁盘性能规格,一切都很重要。数据在磁盘上的布局方式很重要。如何访问数据很重要。几乎不可能说
mmap()
read()
快,或者反过来说

可以考虑获得最佳I/O性能,就像高端立体声系统上的阻抗匹配扬声器一样,以获得最佳声音,但影响“最佳”答案的变量要多得多。要获得绝对最佳的性能,一切都必须匹配—从物理磁盘上数据的实际布局到用户空间应用程序用于访问数据的确切模式

一般来说,这真的不值得费心-几乎每一个开箱即用的设置都会使您的硬件能够提供至少80%左右的最大性能,只要您不做一些不好的事情,比如一次只反向读取一个字符的文件