我知道当页面缓存页面被修改时,它被标记为脏并需要写回,但是在以下情况下会发生什么:
场景: 文件 /apps/EXE 是一个可执行文件,被完全分页到页面缓存中(它的所有页面都在缓存/内存中)并被进程 P 执行
然后持续发布将 /apps/EXE 替换为全新的可执行文件。
假设 1: 我假设进程 P(以及具有引用旧可执行文件的文件描述符的任何其他人)将继续使用旧的,在内存中 /apps/EXE 没有问题,并且任何尝试执行该路径的新进程都会得到新的可执行文件。
假设2: 我假设如果不是文件的所有页面都映射到内存中,那么一切都会好起来的,直到出现页面错误需要文件中的页面已被替换,并且可能会发生段错误?
问题 1: 如果你使用 vmtouch 之类的东西来锁定文件的所有页面,这会改变场景吗?
问题 2: 如果 /apps/EXE 位于远程 NFS 上,那会有什么不同吗?(我假设不是)
请更正或验证我的 2 个假设并回答我的 2 个问题。
假设这是一个带有某种 3.10.0-957.el7 内核的 CentOS 7.6 机器
更新:进一步考虑,我想知道这个场景是否与任何其他脏页场景没有什么不同..
我想写入新二进制文件的进程将执行读取并获取所有缓存页面,因为它全部被分页,然后所有这些页面都将被标记为脏。如果它们被锁定,它们将只是在 ref 计数变为零后占用核心内存的无用页面。
我怀疑当当前执行的程序结束时,其他任何东西都会使用新的二进制文件。假设这一切都是正确的,我想只有当只有部分文件被分页时才有趣。