假设我:
open
来自进程F
的{{1}}字节长的只读文件N
A
及其mmap
只读(fd
)和PROT_READ
MAP_SHARED
返回的内存范围。我的理解是,由于mlock
,文件中的数据现在已驻留并由N
个字节的物理内存页支持。内存范围的读取性能应与分配给mlock
的普通内存相同。
现在,如果我在进程malloc
仍在运行时创建第二个进程B
,并执行与进程A
完全相同的步骤,则B
个字节将支持mmaped文件的物理内存页面与进程N
中的物理页面相同吗?
也就是说,A
和A
会一起使用B
个字节的物理内存吗?还是他们将使用N
个字节的物理内存?
答案 0 :(得分:2)
映射文件时,页面来自内核页面缓存,该页面维护文件的内核视图。内核中只有一个相同文件的视图。当您多次映射文件(无论使用哪个进程)时,映射的页面与内核页面缓存中的物理页面完全相同。
否则,当一个进程修改其MAP_SHARED
文件映射时,保持不同的内存页面同步将是非常昂贵的。
换句话说,进程A
和B
一起共享用于映射同一文件的相同N
字节物理内存。
答案 1 :(得分:0)
在现代操作系统中,当两个程序映射相同的文件时,每个进程都有自己的内存页表,该页表可能指向与其他用户和内核进程共享的物理内存页。
使用MAP_SHARED
,可以共享此映射:映射的更新对于其他映射此文件的进程是可见的,并一直传递到基础文件。在调用msync
或munmap()
之前,实际上可能不会更新文件。