开放系统调用的工作

Aka*_*uja 3 file-io operating-system file memory-mapped-files

我正在阅读有关内存映射文件的消息,该消息称,它比传统方法更快地打开文件或读取文件(如开放系统调用和读取系统调用),而不会给出如何打开或读取系统调用的说明.

那么我的问题 是开放系统调用是如何工作的?

据我所知,它会将文件加载到内存中,而通过使用映射文件,只有它们的地址将保存在内存中,并在需要时将所请求的页面带入内存.

我希望澄清我迄今为止的理解.

编辑

我之前的理解几乎是错误的,因为正确的解释是指Pawel接受的答案.

Paw*_*pak 6

既然你没有给出任何细节,我假设你对类Unix系统的行为感兴趣.

实际上open()系统调用只创建一个文件描述符,然后可以由mmap()或使用read().

内存映射I/O和标准I/O都通过页面缓存在内部访问磁盘上的文件,缓存中缓存文件以减少I/O操作的数量.

标准I/O方法(使用write()read())涉及执行系统调用,然后将数据从(或编写时)页缓存复制到应用程序选择的缓冲区.除了非顺序访问需要另一个系统调用lseek().系统调用很昂贵,复制数据也是如此.

当文件通过内存映射时,通常将进程地址空间中的内存区域直接映射到页面缓存,以便可以在没有任何额外延迟的情况下执行已加载数据的所有读取和写入(无需系统调用,无数据复制).仅当应用程序尝试访问尚未加载的文件区域时,才会发生页面错误,并且内核从磁盘加载所需的数据(整页).

编辑: 我看到我还要解释内存分页.在大多数现代架构中,存在物理内存,它是真实的硬件和虚拟内存,为进程创建地址空间.内核决定虚拟内存中的地址如何映射到物理内存中的地址.最小的单位是一个记忆页面(通常,但不总是4K).它不必是1:1映射,例如,所有虚拟内存页面可以映射到相同的物理地址.

在内存映射的I/O部分应用程序地址空间和内核的页面缓存映射到相同的物理内存区域,因此程序能够直接访问页面缓存.