4

我的问题也许是一个措辞不佳的问题,源于我对内存管理的业余理解。

我担心的是:我有一个 Perl 脚本,它会分叉很多次。正如我从 perldoc 中的 fork 页面所了解的那样,正在实施写时复制。然后每个孩子调用system(),再次分叉,调用外部程序。来自外部程序的数据被读回子程序,并作为可存储文件转储,以便在所有子程序退出后由父程序获取和处理。

我担心的是我对这种情况的感知波动。考虑一下我在脑海中看到的最坏情况:对于每个孩子,只要有新数据到达,整个写时复制内存就会被复制。如果是这种情况,我将在创建几个分叉后很快遇到内存问题。

但或者,写时复制是否只复制包含所需数据的最小内存块?那么这个内存量是什么?它的尺寸是如何设置的?

我不确定我所要求的具体内容是依赖于语言还是依赖于某些较低级别的过程。

4

2 回答 2

6

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

于 2011-01-19T19:06:51.157 回答
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
于 2011-01-19T20:02:59.527 回答