Comment Linux gère le processus zombie

12

Les processus zombies sont créés dans les systèmes Unix / Linux. Nous pouvons les supprimer via la killcommande.

Mais existe-t-il un mécanisme de nettoyage intégré sous Linux pour gérer les processus zombies?

Atur
la source

Réponses:

18

Les processus zombies sont déjà morts. Vous ne pouvez pas les tuer. La killcommande ou l'appel système n'a aucun effet sur un processus zombie. (Vous pouvez faire partir un zombie kill, mais vous devez tirer sur le parent, pas sur le zombie, comme nous le verrons dans une minute.)

Un processus zombie n'est pas vraiment un processus, c'est seulement une entrée dans la table des processus. Il n'y a pas d'autres ressources associées au processus zombie: il n'a pas de mémoire ou de code en cours d'exécution, il ne contient aucun fichier ouvert, etc.

Lorsqu'un processus meurt, la dernière chose à faire, après le nettoyage de toutes les autres ressources, est l'entrée dans la table de processus. Cette entrée est conservée, formant un zombie, pour permettre au processus parent de suivre l'état de sortie de l'enfant. Le parent lit l'état de sortie en appelant l'un des membres de la waitfamille des appels système; à ce stade, le zombie disparaît. Appel waitest dit récolter l'enfant, l' extension de la métaphore d'un zombie étant mort , mais d'une manière encore pas complètement transformé en la vie après la mort. Le parent peut également indiquer qu'il s'en fiche (en ignorant le signal SIGCHLD, ou en appelant sigactionavec l' SA_NOCLDWAITindicateur), auquel cas l'entrée dans la table de processus est supprimée immédiatement lorsque l'enfant meurt.

Ainsi, un zombie n'existe que lorsqu'un processus est mort et que son parent n'a pas waitencore appelé . Cet état ne peut durer que tant que le parent est toujours en cours d'exécution. Si le parent décède avant l'enfant ou décède sans lire le statut de l'enfant, le processus parent du zombie est défini sur le processus avec PID 1, qui est init. L'une des tâches de initest d'appeler waiten boucle et de récolter ainsi tout processus zombie laissé par son parent.

Gilles 'SO- arrête d'être méchant'
la source
6

Vous n'avez pas de killprocessus zombie, car il est déjà mort.

Les processus zombies doivent être waitédités par leurs parents, afin que leur statut de sortie soit collecté.

Le seul "mécanisme de nettoyage intégré" qui existe sous Linux fonctionne pour le cas où tout processus parent meurt avant de collecter le statut de sortie de ses enfants. Dans ce cas, chaque enfant est hérité par le initprocessus qui, waitsur l'enfant, collectera son état de sortie et supprimera son entrée dans la table de processus.

chrk
la source
3

Dès que le parent d'un processus décède, le processus devient orphelin - sans tenir compte du fait qu'il s'agit d'un zombie ou non. Qu'arrive-t-il aux orphelins? Ils obtiennent un nouveau parent, appelé init. initsera waitsur chaque orphelin qu'il a collecté, récoltant ainsi l'orphelin (qui peut aussi avoir été un zombie).

Philipp Murry
la source
1
Non. Être précis, initne tue aucun processus. Il waitn'appartient qu'à ses enfants de récupérer leur statut.
chrk
1
@chrk, Philipp: le terme habituel est moissonner .
Gilles 'SO- arrête d'être méchant'
1

Non, il n'y a pas de mécanisme de nettoyage intégré pour les zombies. Les zombies vont au paradis des zombies une fois que leurs parents sont tués. Jusque-là, le système d'exploitation les garde pour retourner le statut de sortie au parent.

unnut
la source
alors .. est-ce que cela n'a pas d'effet négatif sur la mémoire, etc.?
1
En fait, lorsque le parent des matrices de zombies, le initprocessus prend le relais et appellera waitil
Non, toutes les ressources allouées au processus sont libérées, à l'exception de l'entrée dans la table de processus.
unxnut