mmap 相同的文件,相同的物理内存?

mmap same file, same physical memory?

假设我:

  1. open 来自进程 A
  2. N 字节长度的只读文件 F
  3. mmapfd 只读 (PROT_READ) 和 MAP_SHARED
  4. mlock返回的内存范围。
  5. 进入无限循环。

我的理解是,由于 mlock,文件中的数据现在驻留并由 N 字节的物理内存页支持。内存范围的读取性能应该与分配的普通内存相同,例如 malloc.

现在,如果我在进程 A 仍然是 运行 时创建第二个进程 B 并从进程 B 执行完全相同的步骤,N 字节的支持 mmaped 文件的物理内存页面与进程 A?

中的物理页面相同

也就是说,AB 一起使用 N 字节的物理内存吗?或者他们会使用 2*N 字节的物理内存吗?

映射文件时,页面来自维护文件内核视图的内核页面缓存。内核中同一个文件只有一个视图。当您多次映射文件时(无论来自哪个进程),映射的页面与内核页面缓存中的物理页面完全相同。

否则,当一个进程修改其 MAP_SHARED 文件映射时,同步维护不同内存页的成本将过高。

换句话说,进程 AB 一起共享用于映射同一文件的相同 N 字节物理内存。

在现代操作系统中,当 2 个程序映射同一个文件时,每个进程都有自己的内存页 table,它可能指向与其他用户和内核进程共享的物理内存页。

对于 MAP_SHARED,此映射是共享的:对映射的更新对映射此文件的其他进程可见,并传递到基础文件。在调用 msyncmunmap() 之前,文件可能不会真正更新。