我一直在努力理解mmap()如何与磁盘支持的文件配合使用,现在我基本上已经懂了,但我还有一个问题。
在主进程分叉出许多工作子进程,并使用文件支持的只读mmapped db的情况下,如果mmaps在分叉之前发生在主进程中,还是在子进程中,这是否重要?
我的理解是,如果在分叉之前它发生在主进程中,则在内存页表中,所有映射的页面都会被设置为在读取时引发页故障,从而触发内核从磁盘(或页面缓存)加载页面,在分叉后,一个子进程对页面的读取将使页面在mmap中准备好供其他子进程读取,而不会导致重大页故障。
但是,如果在分叉后映射在子进程中发生,其他工作子进程是否可以共享这些已加载的页面的好处 - 他们实际上是否在使用相同的底层mmap?还是每个工作子进程都必须触发一个页故障并自己加载每个页面?
在主进程分叉出许多工作子进程,并使用文件支持的只读mmapped db的情况下,如果mmaps在分叉之前发生在主进程中,还是在子进程中,这是否重要?
我的理解是,如果在分叉之前它发生在主进程中,则在内存页表中,所有映射的页面都会被设置为在读取时引发页故障,从而触发内核从磁盘(或页面缓存)加载页面,在分叉后,一个子进程对页面的读取将使页面在mmap中准备好供其他子进程读取,而不会导致重大页故障。
但是,如果在分叉后映射在子进程中发生,其他工作子进程是否可以共享这些已加载的页面的好处 - 他们实际上是否在使用相同的底层mmap?还是每个工作子进程都必须触发一个页故障并自己加载每个页面?