gpt4 book ai didi

linux - 在 fork 之前或之后在磁盘文件上调用 mmap() 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 16:18:29 26 4
gpt4 key购买 nike

我一直在努力了解 mmap() 如何处理磁盘支持的文件,并且大部分都明白了,但我仍然有这个问题。

在主进程 fork 一堆工作子进程和文件支持的只读 mmapped 数据库的情况下,mmap 发生在 fork 之前的主进程中还是子进程中是否重要? ?

我的理解是,如果发生在master进程fork之前,那么在内存页表中,所有映射的页面被设置为在读取时产生页面错误,触发内核从磁盘(或页面缓存)加载页面,并且在 fork 后,一个子级读取页面将意味着该页面存在于mmap 已准备好供其他子级读取,而不会导致主要页面错误。

但是,如果 mmap 发生在 fork 之后的子进程中,其他工作子进程是否会从共享这些加载的页面中受益 - 它们是否都使用相同的底层 mmap 有效?或者每个工作子进程是否必须触发页面错误并自行加载每个页面?

最佳答案

这对页面错误事件没有影响。文件的页面映射对于操作系统来说是全局的,它表示特定页面是否在 RAM 中。每个映射文件的进程的 PTE 都指向这个公共(public)数据结构。只有第一个尝试访问不在 RAM 中的页面的进程才会出现页面错误。这将触发它被读入,并且尝试访问同一页面的其他进程将能够使用该 RAM。

两种场景之间的一个区别是分配给映射 block 的虚拟地址是否相同。如果在 fork 之前调用 mmap,该地址将被复制到所有子进程中。如果你在 fork 后调用 mmap,它们可能会得到不同的地址。如果需要,在所有进程中使用相同的地址允许您将指针传递到进程之间的映射 block 中。 block 内的对象之间可以有指针。如果它们不都在同一地址,则需要使用偏移量,并且所有进程都必须将偏移量添加到基地址。

关于linux - 在 fork 之前或之后在磁盘文件上调用 mmap() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55889295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com