数据量和代码量如何影响Perl中的fork()性能?

时间:2012-06-26 17:44:22

标签: perl fork

关于Perl自己的数据结构,Perl中fork()的开销是多少? 1)代码大小(语法树)和2)变量/引用中的数据量是否会影响分叉所花费的时间?

4 个答案:

答案 0 :(得分:5)

不是Perl问题,因为fork是系统调用。无论该进程是否为Perl都无关紧要,它总是做同样的事情。它并不关心进程的局部内部,只有总内存大小才有效。

现代操作系统(如Linux)实现COW,因此fork通常会很快返回,每个进程几乎相同。

答案 1 :(得分:4)

正如其他人所说,简短的回答是,代码/数据的数量与fork()的性能无关,超出了系统实现的一般隐含意义。

但是,在调用fork per the documentation之前,perl本身将刷新打开的文件句柄。所以,是的,打开perl文件句柄的数量对fork()性能有一些影响。

(线程perl版本还会抛出一个内部互斥锁保护内存分配,至少在我的系统上不到5.16。像这样的小型内部同步可能因系统而异,从perl版本到perl版本。)

答案 2 :(得分:2)

Forking创建整个过程的单独副本 - 代码和数据 - 除了I / O句柄之外的所有内容。因此,任何增加程序内存占用的因素(在边缘)都会使fork操作花费更长的时间。

对于处理大量数据和多个子进程的程序,需要考虑的一件事是保持父进程的占用空间尽可能小,并在子进程启动后加载数据。

答案 3 :(得分:1)

fork本身不使用任何记忆。父进程的内存页面与子进程共享,直到子进程尝试写入共享页面为止,此时会生成页面副本,以便每个进程都有自己的页面副本。

如果代码和只读数据与可写数据分开,则会导致许多页面始终被共享。

但是,Perl中没有代码和数据的分离。不仅在与数据相同的内存池中创建操作码,操作码具有可写组件!这意味着,我想,分叉的孩子最终通常最终会被取消共享。

要确定,您必须在流程运行时挖出ps