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

时间:2019-03-27 14:45:43

标签: c linux mmap

假设我:

  1. open来自进程F的{​​{1}}字节长的只读文件N
  2. A及其mmap只读(fd)和PROT_READ
  3. MAP_SHARED返回的内存范围。
  4. 进入无限循环。

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

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

也就是说,AA会一起使用B个字节的物理内存吗?还是他们将使用N个字节的物理内存?

2 个答案:

答案 0 :(得分:2)

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

否则,当一个进程修改其MAP_SHARED文件映射时,保持不同的内存页面同步将是非常昂贵的。

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

答案 1 :(得分:0)

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

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