Linux では、posix_spawn(2)
を使用できます。 POSIX_SPAWN_USEVFORK
で 大きなプロセスから fork するときにページ テーブルをコピーするオーバーヘッドを回避するためのフラグ。
アプリケーション サブプロセスを作成するためのメモリ使用量の最小化を参照してください。 posix_spawn(2)
の概要 、その利点といくつかの例。
vfork(2)
を活用するには 、あなたが #define _GNU_SOURCE
であることを確認してください #include <spawn.h>
より前 そして単純に posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
これが Debian Lenny で動作することを確認でき、大規模なプロセスから fork するときに大幅なスピードアップを実現します。
benchmarking the various spawns over 1000 runs at 100M RSS
user system total real
fspawn (fork/exec): 0.100000 15.460000 40.570000 ( 41.366389)
pspawn (posix_spawn): 0.010000 0.010000 0.540000 ( 0.970577)
結果 :ここでの他の回答で示唆されているように、初期に生成されたヘルパー サブプロセス ルートをたどるつもりでしたが、フォークのパフォーマンスを向上させるために巨大なページのサポートを使用しているのに出会いました。
libhugetlbfs を使用して、自分のアプリのすべての malloc に巨大なページを割り当てさせるだけで試してみたところ、プロセス サイズに関係なく、約 2400 フォーク/秒になりました。 (とにかく興味のある範囲で)。すごい。