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

时间:2011-01-19 18:47:36

标签: perl memory-management fork copy-on-write

我的问题可能是措辞不佳,源于我对记忆管理的业余理解。

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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