V systému Linux můžete použít posix_spawn(2)
s POSIX_SPAWN_USEVFORK
příznak, abyste se vyhnuli režii kopírování tabulek stránek při větvení z velkého procesu.
Viz Minimalizace využití paměti pro vytváření aplikačních dílčích procesů pro dobré shrnutí posix_spawn(2)
, jeho výhody a některé příklady.
Chcete-li využít výhod vfork(2)
, ujistěte se, že máte #define _GNU_SOURCE
před #include <spawn.h>
a pak jednoduše posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Mohu potvrdit, že to funguje na Debianu Lenny a poskytuje obrovské zrychlení při vytváření větví z velkého procesu.
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)
Výsledek :Chtěl jsem jít cestou brzy vytvořeného pomocného subprocesu, jak navrhovaly jiné odpovědi zde, ale pak jsem narazil na to, že používám obrovskou podporu stránek ke zlepšení výkonu rozvětvení.
Když jsem to sám vyzkoušel pomocí libhugetlbfs, abych jednoduše přinutil všechny malloc mé aplikace alokovat velké stránky, dostávám se nyní kolem 2400 forků/s bez ohledu na velikost procesu (přes rozsah, který mě každopádně zajímá). Úžasné.