Unix中的内存映射I / O.

时间:2015-12-14 13:52:24

标签: c unix memory mmap virtual-memory

我无法理解如何在内存映射I / O中管理文件。正常情况如果我们使用open或fopen打开文件,则返回fd或 文件指针分别。在此打开文件所在的位置进行处理之后。它是在内存中(硬盘中的文件的副本)还是没有?如果它 不在内存中,通过后续读取或写入系统调用获取数据,或者每次调用读取或写入时从硬盘获取数据。 否则,文件的副本将存储在内存中,并通过进程访问文件以进行更进一步的操作,一旦完成该过程,文件将被复制到硬盘。在上面的概念中 哪种情况有效?

以下是Unix环境(第2版)高级编程中内存映射i / o的定义:

  

内存映射I / O允许我们将磁盘上的文件映射到内存中的缓冲区,这样当我们从缓冲区中获取字节时,会读取文件的相应字节。类似地,当我们将数据存储在缓冲区中时,相应的字节会自动写入文件。这使我们可以在不使用读或写的情况下执行I / O.

什么是将文件映射到内存?在这里,他们定义了内存放在堆栈和堆之间。在这个记忆中,什么 映射文件后存在数据类型。它包含文件的副本或驻留在硬盘中的文件的地址。和 上述情况如何变为现实。

有没有人解释内存映射I / O和mmap功能的工作机制?

2 个答案:

答案 0 :(得分:3)

通常,当您打开文件时,系统会设置一些簿记结构(元数据),但不需要读取文件实际数据的任何部分。当您调用read()时,系统会将一大块文件加载到您为此目的分配的(虚拟)内存中。

当您对文件进行内存映射时,系统会再次设置簿记,并设置(虚拟)内存"映射"这意味着一系列有效地址,如果使用,将反映基础文件的读取(或写入)。这并不意味着需要立即读取整个文件,因为它可以在"中分页。按需,即系统可以为您提供一个地址范围,然后在加载任何数据之前等待您实际使用它。这个"页面错误"由称为内存管理单元(MMU)的硬件设备支持。运行可执行文件时使用相同的系统 - 系统只需将其映射到虚拟内存中,并根据需要从磁盘读取页面(块)。

答案 1 :(得分:1)

  

是否在内存中(硬盘中的文件副本)?

根据Computer Programming and Utilization,当您使用fopen打开文件时,其内容将被加载到内存中。 (部分或全部)。

  

如果它不在内存中,则通过后续读取来获取数据   写系统调用

当你写入一些数据时,它最终被复制到内核中,然后在缓冲后将其写入磁盘(或任何地方)。通常,为了写入,不需要加载文件的任何部分。

what is mapping a file into memory? enter image description here有关详情,请参阅here

  

在此内存中,映射文件后会显示哪种类型的数据。它   包含文件的副本或驻留的文件的地址   硬盘。

内存映射文件是虚拟内存的一段,它已被分配了与文件或文件类资源的某些部分直接逐字节相关。参考this

可以将文件映射到内存区域。完成此操作后,可以像程序中的数组一样访问该文件。这比读取或写入更有效,因为只加载程序实际访问的文件区域。对mmapped区域中尚未加载的部分的访问以与换出页面相同的方式处理。