【发布时间】:2019-04-26 17:21:11
【问题描述】:
我一直在努力了解 mmap() 如何处理磁盘支持的文件,并且大部分时间都在了解它,但我仍然有这个问题。
在一个主进程分叉一堆工作子进程和一个文件支持的只读 mmapped db 的情况下,mmap 是在主进程中发生在分叉之前还是在子进程中是否重要?
我的理解是,如果发生在master进程fork之前,那么在内存页表中,所有的mapped 页面被设置为在读取时发生页面错误,触发内核从磁盘(或页面缓存)加载页面,并且在分叉之后,一个孩子读取页面将意味着该页面在mmap 准备好供其他孩子阅读,而不会导致严重的页面错误。
但是,如果 mmap 发生在 fork 之后的子进程中,其他工作子进程是否会从共享这些加载的页面中受益——它们是否都使用相同的底层 mmap?还是每个工作子进程都必须触发页面错误并自己加载每个页面?
【问题讨论】:
-
页面错误并非特定于进程。文件的一页在内存中,或者不在内存中。
-
@Barmar 这也不完全正确。页面错误中断在触及用户空间地址时是特定于进程的
-
@AnttiHaapala 是不是因为它们可以有不同的保护模式(同一个页面在P1中可以只读但在P2中可以读写),所以它们必须通过缺页机制来检查这?是否必须分页内存仍然没有区别。
标签: linux memory-management fork mmap