了解 mmap

了解 mmap

我正在查看有关 mmap 的文档这里并尝试使用它来实现它这个视频

我对其实施有几个问题。

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

  2. 一旦文件存储在内存中的该位置,它是否会保留在那里直到调用 munmap 为止?

  3. 该文件是否已移动到内存,或者它只是一个用作重定向的映射表,并且该文件实际上位于虚拟内存(磁盘)中?

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

答案1

按顺序回答问题:

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

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

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

相关内容