Lección 6: fork() — creación de un proceso hijo
fork() es la syscall que duplica la cantidad de procesos: crea una copia exacta del proceso actual. Entender fork() es esencial para todo ingeniero de sistemas — nvidia-docker y el asignador de GPU de Slurm lo usan para crear entornos aislados para cada job de GPU. Cuando algo falla con procesos de
fork() es como fotocopiar todo el contenido de tu cerebro y ponerlo en otro cuerpo — de repente hay dos personas que recuerdan todo hasta el momento de la copia. La única diferencia es que una tiene un número de ID distinto al de la otra.
- fork()
- Una syscall que crea un proceso hijo que es una copia del proceso padre. fork() devuelve 0 al hijo, el PID del hijo al padre, y -1 si falla.
- Copy-on-Write (COW)
- Una optimización de fork(): el kernel no copia físicamente toda la memoria de inmediato. Las páginas de memoria se comparten con el padre hasta que uno de los dos escribe — y entonces solo se copia esa página.
- Proceso hijo
- Un proceso creado por fork(). El hijo recibe un PID nuevo, pero su PPID es el PID del padre. El hijo tiene una copia independiente del espacio de direcciones.
- getpid() / getppid()
- Syscalls que devuelven el PID del proceso actual y el PID de su padre, respectivamente. Útiles después de fork() para distinguir al padre del hijo.
- Duplicación del espacio de direcciones
- fork() crea para el hijo un espacio de direcciones virtual independiente con las mismas direcciones que el padre. Cambiar una variable en el hijo no afecta al padre y viceversa (gracias a Copy-on-Write).