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