Linux下多进程mmap同一文件时,物理内存何时共享?
首先明确核心前提:多进程通过mmap共享物理内存的必要条件是指定MAP_SHARED标志,和是否使用同一文件描述符无关——内核是基于文件的inode来关联映射的,不是文件描述符本身。下面针对你提到的三个场景逐一说明:
场景1:每个进程各自打开该文件
只要所有进程在mmap时都指定了MAP_SHARED,且映射的是文件的同一区域,背后的物理内存就会被共享。哪怕每个进程用自己独立打开的文件描述符,只要这些描述符指向同一个文件(inode相同),内核就会把它们的映射关联到同一份物理页缓存上。场景2:一个进程以只读方式打开,另一个以可写方式打开
同样,只要双方都用MAP_SHARED映射同一文件区域,物理内存会共享。但要注意权限匹配:只读打开文件的进程,mmap时不能设置PROT_WRITE权限(会触发EACCES错误);可写打开的进程则可以根据需求设置PROT_READ或PROT_WRITE。一旦映射成功,可写进程对内存的修改会同步到物理页,并最终回写到文件,只读进程也能看到这些修改。场景3:一个进程以
PROT_READ权限mmap,另一个以PROT_WRITE权限mmap
只要两个进程都使用MAP_SHARED,且映射的是同一文件区域,物理内存就会共享。这里需要保证:设置PROT_WRITE权限的进程,其文件打开权限必须包含可写(否则mmap会失败)。共享后,PROT_WRITE进程的写入操作会直接修改共享物理页,PROT_READ进程能实时读取到更新后的内容,修改最终也会同步到文件中。
内容的提问来源于stack exchange,提问作者Samuel Hapak

