了解 MMAP

joh*_*hn 14 memory shared-memory mmap virtual-memory

我所经历的文档中有关MMAP这里,并试图利用来实现它

我对它的实施有一些疑问。

  1. MMAP 提供文件映射并返回物理内存中该位置的指针还是返回映射表的地址?它是否也为该文件分配和锁定空间?

  2. 一旦文件存储在内存中的那个位置,它会一直留在那里直到调用 munmap 吗?

  3. 文件甚至移动到内存中还是只是一个用作重定向的映射表,而文件实际上位于虚拟内存 -(磁盘)中?

  4. 假设它被移动到内存中,其他进程是否可以访问该空间以读取数据,如果他们有地址?

Aus*_*arn 18

依次回答:

  1. 它返回一个指向虚拟内存中位置的指针,并分配了虚拟内存地址空间,但是除非明确锁定文件,否则不会以任何方式锁定该文件(还要注意锁定内存与锁定区域中的区域不同)文件)。由于分页和虚拟内存(否则,它需要在调用完成之前将整个区域读入内存),实际上只有从实际角度来看,mmap() 的有效实现才是可能的。
  2. 不完全是,但这与下一个答案有关,所以我会在那里介绍。
  3. 的种类。大多数情况下实际发生的是 mmap() 提供对页面缓存中该文件数据的写时复制访问。因此,通常缓存对数据生存期的限制适用(如果系统需要空间,页面可以从缓存中删除(如果它们很脏,则刷新到磁盘)并且需要再次出错。
  4. 不,因为虚拟内存是如何工作的。每个进程都有自己的虚拟地址空间,以及自己的虚拟映射。每个想要传输数据的程序都必须在同一个文件(或共享内存段)上调用 mmap(),并且它们都必须使用该MAP_SHARED标志。

值得注意的是, mmap() 不仅适用于文件,您还可以用它做其他事情,例如:

  • 直接映射设备内存(如果您有足够的权限)。这实际上用于许多嵌入式系统,以避免需要为新硬件编写内核模式驱动程序。
  • 映射共享内存段。
  • 显式映射大页面。
  • 分配内存,然后您可以在其上调用 madvise(2)(这反过来可以让您做有用的事情,例如防止数据被复制到 fork(2) 上的子进程,或为 KSM 标记数据(Linux 的内存重复数据删除功能))。