Leçon 6 : fork() — Créer un processus enfant
fork() est le syscall qui double le nombre de processus : il crée une copie exacte du processus actuel. Comprendre fork() est essentiel pour tout ingénieur systèmes — nvidia-docker et l'allocateur GPU de Slurm l'utilisent pour créer des environnements isolés pour chaque job GPU. Quand quelque chose
fork() c'est comme photocopier tout le contenu de ton cerveau et le mettre dans un autre corps — soudain il y a deux personnes qui se souviennent de tout jusqu'au moment de la copie. La seule différence est que l'une a un numéro d'ID différent de l'autre.
- fork()
- Un syscall qui crée un processus enfant qui est une copie du processus parent. fork() retourne 0 au processus enfant, le PID de l'enfant au parent, et -1 s'il échoue.
- Copy-on-Write (COW)
- Une optimisation de fork() : le noyau ne copie pas physiquement toute la mémoire immédiatement. Les pages de mémoire sont partagées avec le parent jusqu'à ce que l'un d'eux écrive — alors seule cette page est copiée.
- Processus enfant
- Un processus créé par fork(). L'enfant reçoit un nouveau PID, mais son PPID est le PID du parent. L'enfant a une copie indépendante de l'espace d'adressage.
- getpid() / getppid()
- Des syscalls qui retournent le PID du processus actuel et le PID de son parent respectivement. Utiles après fork() pour distinguer le parent de l'enfant.
- Duplication de l'espace d'adressage
- fork() crée pour l'enfant un espace d'adressage virtuel indépendant avec les mêmes adresses que le parent. Modifier une variable dans l'enfant n'affecte pas le parent et vice versa (grâce à Copy-on-Write).