Processus zombie

En informatique, sous les systèmes de type UNIX et similaires, zombie (on utilise plutôt l'orthographe anglaise) est un terme désignant un processus qui s'est achevé, mais qui dispose toujours d'un identifiant de processus (PID) et reste donc encore visible dans la table des processus. On parle aussi de processus défunt (en anglais "defunct").

Au moment de la terminaison d'un processus, le système désalloue les ressources que possède encore le processus mais ne détruit pas son bloc de contrôle. Le système passe ensuite l'état du processus à la valeur TASK_ZOMBIE (représenté généralement par un Z dans la colonne « statut » lors du listage des processus par la commande ps). Le signal SIGCHLD est alors envoyé au processus père du processus qui s'est terminé, afin de l'informer de ce changement. Dès que le processus père a obtenu le code de fin du processus achevé au moyen des appels systèmes wait ou waitpid, le processus terminé est définitivement supprimé de la table des processus.

Il existe un bug classique dans le développement de programme UNIX gérant plusieurs processus : un processus qui crée des fils, mais n'attend pas leurs valeurs de retours. Ces fils restent donc sous forme de zombies pendant (au moins) toute la durée d'exécution du processus père. Étant donné que les processus zombies ne peuvent pas être supprimés par les méthodes classiques (y compris pour les utilisateurs privilégiés), le système se retrouve alors encombré de processus achevés (« morts ») mais encore visibles. Ceux-ci ne consomment, à proprement parler, pas plus de ressources systèmes que les quelques octets de mémoire occupés par le bloc de contrôle dans la table des processus ; toutefois, le nombre de processus étant limité par le nombre possible de PID, un trop grand nombre de zombies peut empêcher le système de créer de nouveaux processus. Cette métaphore de horde de processus défunts, impossibles à tuer car déjà morts, est à l'origine du terme de « zombie ».

La seule manière d'éliminer ces processus zombies est de causer la mort du processus père, par exemple au moyen du signal SIGKILL. Les processus fils sont alors automatiquement rattachés au processus n°1, généralement init, qui se charge à la place du père original d'appeler wait sur ces derniers. Si ce n'est pas le cas, cela signifie que init est défaillant (ou que le processus n°1 n'est pas init, mais un autre programme n'ayant pas été prévu pour ça) ; le seul moyen de se débarrasser des zombies, dans ce cas, est le redémarrage du système.

Voir aussi