En Linux, puede usar posix_spawn(2)
con el POSIX_SPAWN_USEVFORK
marca para evitar la sobrecarga de copiar tablas de páginas cuando se bifurca de un proceso grande.
Consulte Minimización del uso de memoria para crear subprocesos de aplicaciones para un buen resumen de posix_spawn(2)
, sus ventajas y algunos ejemplos.
Para aprovechar vfork(2)
, asegúrese de #define _GNU_SOURCE
antes de #include <spawn.h>
y luego simplemente posix_spawnattr_setflags(&attr, POSIX_SPAWN_USEVFORK)
Puedo confirmar que esto funciona en Debian Lenny y proporciona una aceleración masiva cuando se bifurca desde un proceso grande.
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)
Resultado :Iba a ir por la ruta del subproceso de ayuda generado temprano como lo sugieren otras respuestas aquí, pero luego me encontré con esta reutilización de soporte de página enorme para mejorar el rendimiento de la bifurcación.
Después de haberlo probado yo mismo usando libhugetlbfs para simplemente hacer que todos los mallocs de mi aplicación asignen páginas grandes, ahora obtengo alrededor de 2400 bifurcaciones/s independientemente del tamaño del proceso (sobre el rango que me interesa de todos modos). Increíble.