标记为copy-on-write的所有内存是否在单次更改一个数据后被复制?

EMi*_*ler 4 perl fork memory-management copy-on-write

我的问题可能是一个措辞不好的问题,源于我对记忆管理的业余理解.

我担心的是:我有一个多次出现的Perl脚本.据我所知,在perldoc的fork页面中,正在实现copy-on-write.然后system(),每个孩子再次呼叫,呼叫外部程序.来自外部程序的数据被读回到子项中,并作为可存储文件转储,以便在所有子项退出后由父项处理并处理.

我担心的是我对这种情况的波动性.考虑一下,在我看来,最糟糕的情况:对于每个孩子,一旦新数据到达,整个写时复制内存就会被复制.如果是这种情况,我会在创建一些分支后快速遇到内存问题.

但另外,copy-on-write是否只复制包含所需数据的最小内存块?那么这个量子的记忆是什么?它的大小如何设定?

我不确定我所询问的细节是否依赖于语言或依赖于某些较低级别的过程.

Eme*_*ger 6

内存以页面形式组织,通常每个4K(这可以设置为不同的值,并且是特定于硬件的,但这是具有标准操作系统的英特尔平台上的标准).当子进程写入写入时复制页面时,它将被复制.


mob*_*mob 6

是的,分叉会增加你的内存占用.如果这是一个问题,请使用类似Parallel::ProcManagerForks::Super可以限制活动后台进程数量的模块.当您的进程受CPU限制,I/O限制或有可能过度使用计算机上的任何其他有限资源时,限制活动分支的数量也是一个好主意.

use Forks::Super MAX_PROC => 10, ON_BUSY => block;

...
$pid = fork();        # blocks if there are already 10 child processes
...                   # unblocks when one of the children finishes
Run Code Online (Sandbox Code Playgroud)