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