4

私の質問は、おそらく言葉遣いが不十分なものであり、メモリ管理に関する私の素人的な理解に由来しています。

私の懸念は次のとおりです。何回もフォークする Perl スクリプトがあります。perldoc の fork ページからわかるように、copy-on-write が実装されています。次に、それぞれの子が を呼び出しsystem()、再度 fork して、外部プログラムを呼び出します。外部プログラムからのデータは子プログラムに読み戻され、保存可能なファイルとしてダンプされます。すべての子プログラムが終了すると、親プログラムによって取得および処理されます。

私が懸念しているのは、この状況のボラティリティの認識です。私が考えている最悪のシナリオを考えてみましょう。それぞれの子について、新しいデータが到着するとすぐに、コピー オン ライト メモリ全体がコピーされます。この場合、いくつかのフォークを作成した後、すぐにメモリの問題が発生します。

しかし、代わりに、コピー オン ライトは、必要なデータを含むメモリの最小のチャンクのみをコピーするのでしょうか? では、このメモリの量は何ですか? サイズはどのように設定されていますか?

私が尋ねていることの詳細が言語に依存しているのか、それとも下位レベルのプロセスに依存しているのかはわかりません。

4

2 に答える 2

6

はい、フォークするとメモリフットプリントが増加します。これが問題になる場合は、アクティブなバックグラウンドプロセスの数を抑えることができるParallel::ProcManagerまたはのようなモジュールを使用してください。Forks::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 に答える
6

メモリはページで構成され、通常はそれぞれ 4K です (これは異なる値に設定でき、ハードウェア固有ですが、標準オペレーティング システムを備えた Intel プラットフォームでは標準です)。子プロセスがコピー オン ライト ページに書き込むと、コピーされます。

于 2011-01-19T19:06:51.157 に答える