Su Linux, puoi usare posix_spawn(2)
con il POSIX_SPAWN_USEVFORK
flag per evitare l'overhead della copia delle tabelle delle pagine durante il fork da un processo di grandi dimensioni.
Vedere Riduzione al minimo dell'utilizzo della memoria per la creazione di processi secondari dell'applicazione per un buon riassunto di posix_spawn(2)
, i suoi vantaggi e alcuni esempi.
Per approfittare di vfork(2)
, assicurati di #define _GNU_SOURCE
prima del #include <spawn.h>
e poi semplicemente posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Posso confermare che funziona su Debian Lenny e fornisce un'enorme accelerazione durante il fork da un processo di grandi dimensioni.
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)
Risultato :stavo per seguire il percorso del sottoprocesso dell'helper generato all'inizio come suggerito da altre risposte qui, ma poi mi sono imbattuto in questo utilizzo dell'enorme supporto della pagina per migliorare le prestazioni del fork.
Dopo averlo provato io stesso utilizzando libhugetlbfs per fare semplicemente in modo che tutti i malloc della mia app allochino pagine enormi, ora sto ottenendo circa 2400 fork/s indipendentemente dalla dimensione del processo (oltre la gamma che mi interessa comunque). Incredibile.