4

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

4

4 回答 4

5

不是 Perl 问题,因为fork是系统调用。这个过程是否是 Perl 并不重要,它总是做同样的事情。它不关心进程的部分内部结构,只有总内存大小有影响。

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

于 2012-06-26T18:05:46.903 回答
4

fork()正如其他人所说,简短的回答是,代码/数据的数量与系统实现通常暗示的性能无关。

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

(线程化的 perl 构建也会抛出一个内部互斥锁来保护内存分配,至少在我的系统上低于 5.16。像这样的小型内部同步可能会因系统和 perl 版本而异。)

于 2012-06-26T18:22:38.247 回答
3

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

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

于 2012-06-26T18:01:19.557 回答
1

fork本身不使用内存。父进程的内存页面与子进程共享,直到子进程尝试写入共享页面,此时会制作该页面的副本,以便每个进程都有自己的页面副本。

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

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

要确定,您必须ps在进程运行时进行挖掘。

于 2012-06-26T18:21:33.137 回答