【发布时间】:2013-03-06 21:25:45
【问题描述】:
有没有办法在分叉之前将只读变量加载到内存中,并在不使用 virt 内存 x 子节点数的情况下将它们保留在那里?
只读内存默认共享并在写入时复制似乎是一个普遍的观点。我进行了测试,发现这是不真实的:
#!/usr/bin/perl
my $data;
$$data = 'a'x 1_000_000; #keep it in a ref just in case that matters
foreach (0..10){
last unless my $pid = fork();
}
<STDIN>;
当进程位于 STDIN 上时,我检查顶部:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15982 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15983 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15984 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15985 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15986 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15987 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15988 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15989 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15990 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15991 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
15992 wdev 20 0 121m 2540 188 S 0.0 0.1 0:00.00 foo.t
果然,几乎所有的内存都在单独的子进程中。
我是否遗漏了什么,或者派生一个 perl 进程是否真的为每个孩子复制了整个数据结构集?
【问题讨论】:
-
您使用了错误的测试。您需要使用能够真正区分共享页面和非共享页面的东西。该工具可能是特定于操作系统的;在 Linux 上,我们使用
Linux::Smaps。