如果fork()和forked(子)进程退出,所有VM页面仍然在父级中标记为COW?

Elo*_*off 5 c linux fork virtual-memory

在Linux上,如果fork()和forked(子)进程退出,所有虚拟内存页仍然标记为父级中的写时复制?

我认为这些页面将保持标记为COW,因为实现其他任何可能都非常昂贵,可能需要每页引用计数和其他昂贵的簿记.但是前几天我想知道,如果我分叉一个进程来执行当前进程的"稳定快照"中的某些代码.子进程退出后会发生什么?父母中的所有内存页面是否都标记为写入时复制?这意味着在具有大量虚拟内存(例如128GB +)的进程中分叉只执行一些代码几分钟会导致父进程中的性能持续下降几小时甚至几天(更不用说fork调用本身)这不便宜.)

我只是好奇Linux上的实际行为(我不知道如何测试它.)

jbr*_*jbr 9

除了写时复制位之外,页表中还有一个引用计数.因此,当孩子分叉时,parentent中的所有非私人页面都标记为COW,并且引用计数递增.

然后,当子进程正在运行,并且父进程写入页面时,它将出现页面错误,并且页面将按照您的预期进行复制,并且引用计数会减少.当子进入时,它会减少所有页面引用的一个,并且引用计数为零的页面将被丢弃.

现在,当父级写入一个设置了COW位的页面,并且引用计数为1时,COW位将被忽略.