了解MMAP


10

我在这里浏览有关MMAP的文档,并尝试使用文档来实现

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

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

  2. 将文件存储在内存中的那个位置后,它会一直保持在那里直到munmap被调用吗?

  3. 该文件是否甚至移至内存中,还是只是用作重定向的映射表,而该文件实际上位于虚拟内存-(disk)中?

  4. 假设将其移到内存中,如果其他进程具有地址,其他进程可以访问该空间以读取数据吗?


2
您没有实现, mmap但您正在使用
Basile Starynkevitch

Answers:


13

依次回答问题:

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

值得注意的是,mmap()不仅适用于文件,还可以使用它执行其他操作,例如:

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

感谢您提供如此详细的答案。请澄清第1点。如果我尝试访问返回的虚拟内存地址。它将首先通过为该进程创建的地址映射,然后重定向到实际位置-可能是磁盘,高速缓存或内存。其次,如果MAP_SHARED标志处于打开状态,并且两个进程的表返回相同的物理地址值,则文件可以共享?
约翰(John)

1.是的,它将使用虚拟内存映射表。2.每个进程中的地址都无关紧要,只是它们已使用MAP_SHARED映射了同一文件的同一区域。
奥斯汀·海默尔加恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.