Leçon 7 : wait() — Récupérer les processus enfants et prévenir les zombies
Quand un processus enfant termine son exécution, il reste à l'état zombie jusqu'à ce que le processus parent appelle wait(). Chez NVIDIA, les serveurs d'inférence qui exécutent plusieurs workers doivent les nettoyer avec wait(). Les processus zombies qui détiennent un contexte CUDA gardent la VRAM a
Un processus zombie, c'est comme un employé qui a remis sa lettre de démission, mais dont le manager n'a pas encore signé le formulaire. Il ne travaille plus, mais il occupe encore un bureau. wait() est la signature du manager — ce n'est qu'à ce moment-là que le bureau (la mémoire) est libéré.
- Processus Zombie
- Un processus qui a fini de s'exécuter (exit() a été appelé) mais dont l'entrée dans la table des processus existe encore parce que le parent n'a pas appelé wait(). État Z dans ps. Un processus zombie ne consomme pas de CPU mais retient un PID et peut retenir des ressources GPU.
- wait() / waitpid()
- Des syscalls qui attendent la fin d'un processus enfant et nettoient son entrée. wait() attend n'importe quel enfant, waitpid(pid, &status, 0) attend un enfant spécifique. Il faut les appeler pour éviter les zombies.
- WIFEXITED
- Une macro qui vérifie si un processus enfant s'est terminé normalement (via exit/return) et non par un signal. WIFEXITED(status) retourne true si la terminaison était normale.
- WEXITSTATUS
- Une macro qui extrait le code de sortie du status renvoyé par wait(). WEXITSTATUS(status) retourne la valeur passée à exit() ou retournée par main().
- Processus Orphan
- Un processus dont le processus parent a fini de s'exécuter avant lui. Le noyau réattribue les processus orphan à init (PID 1), qui appellera wait() pour eux. Différent du zombie — l'orphan s'exécute, le zombie a fini.