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

问题描述 投票:1回答:2

假设我:

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

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

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

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

c linux mmap
2个回答
2
投票

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

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.