假设我:
打开
来自进程A
的N
字节长度的只读文件F
mmap
其fd
只读 (PROT_READ
) 和MAP_SHARED
mlock
返回的内存范围。- 进入无限循环。
我的理解是,由于 mlock
,文件中的数据现在驻留并由 N
字节物理内存页支持。内存范围的读取性能应该与使用 malloc
分配的普通内存相同。
现在,如果我在进程 A
仍在运行时创建第二个进程 B
,并执行与进程 B
完全相同的步骤,支持映射文件的 N
字节物理内存页与进程 A
中的物理页相同吗?
也就是说,A
和B
会一起使用N
字节的物理内存吗?或者他们会使用 2*N
字节的物理内存?
最佳答案
当您映射文件时,页面来自内核页面缓存,该缓存维护文件的内核 View 。内核中同一个文件只有一个 View 。当您多次映射文件时(无论来自哪个进程),映射的页面与内核页面缓存中的物理页面完全相同。
否则,当一个进程修改其 MAP_SHARED
文件映射时,保持不同内存页面同步的成本将极其高昂。
换句话说,进程A
和B
一起共享用于映射同一文件的相同N
字节物理内存。
关于c - mmap 相同的文件,相同的物理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55380054/