web-dev-qa-db-fra.com

Processus Zombie vs processus orphelin

Un zombie est créé lorsqu'un processus parent n'utilise pas l'appel système d'attente après qu'un enfant est mort pour lire son statut de sortie, et un processus orphelin est un processus enfant qui est récupéré par init lorsque le processus parent d'origine se termine avant l'enfant.

En termes de gestion de la mémoire et de la table de processus, comment ces processus sont-ils gérés différemment, en particulier sous UNIX?

Qu'est-ce qu'un exemple ou un cas extrême où la création de zombies ou d'orphelins peut être préjudiciable à une application ou à un système plus étendu?

51
MarkAWard

Quand un enfant quitte, un processus doit wait dessus pour obtenir son code de sortie. Ce code de sortie est stocké dans la table de processus jusqu'à ce que cela se produise. Le fait de lire ce code de sortie s’appelle "récolter" l’enfant. Entre le moment où un enfant sort et est récolté, cela s'appelle un zombie. (Toute la nomenclature est un peu macabre quand on y pense; je recommande de ne pas trop y penser.)

Les zombies n'occupent que de l'espace dans la table de processus. Ils ne prennent ni mémoire ni processeur. Cependant, la table de processus est une ressource finie et un nombre excessif de zombies peuvent la remplir, ce qui signifie qu'aucun autre processus ne peut être lancé. Au-delà de cela, ils sont encombrants et doivent être fortement évités.

Si un processus existe avec des enfants qui courent toujours (et ne tue pas ses enfants; la métaphore reste bizarre), ces enfants sont orphelins. Les enfants orphelins sont immédiatement "adoptés" par init (en fait, je pense que la plupart des gens appellent cela "réparer", mais "l'adoption" semble mieux porter la métaphore). Un orphelin n'est qu'un processus. Il utilisera toutes les ressources qu'il utilise. Il est raisonnable de dire que ce n'est pas du tout un "orphelin" puisqu'il a un parent, mais je les ai souvent entendu appeler.

init récupère automatiquement ses enfants (adoptés ou non). Donc, si vous sortez sans nettoyer vos enfants, ils ne deviendront pas des zombies (du moins pas plus d'un instant).

Mais les zombies existent depuis longtemps. Que sont-ils? Ils sont les anciens enfants d'un processus existant qui ne les a pas récoltés. Le processus peut être bloqué. Ou il peut être mal écrit et oublier de récolter ses enfants. Ou peut-être qu'il est surchargé et qu'il ne l'a pas encore été. Ou peu importe. Mais pour une raison quelconque, le processus parent continue d'exister (ils ne sont donc pas orphelins) et ils n'ont pas été attendus. Ils vivent donc comme des zombies dans la table des processus.

Donc, si vous voyez des zombies plus longtemps, cela signifie qu'il y a quelque chose qui cloche dans le processus parent et que quelque chose devrait être fait pour améliorer ce programme.

86
Rob Napier

Lorsqu'un processus se termine, ses ressources sont désallouées par le système d'exploitation. Cependant, son entrée dans la table de processus doit y rester jusqu’à ce que le parent appelle wait (), car la table de processus contient le statut de sortie du processus. Un processus qui s'est terminé, mais dont le parent n'a pas encore appelé wait (), est appelé processus zombie. Tous les processus passent dans cet état lorsqu'ils se terminent, mais en général ils n'existent que brièvement en tant que zombies. Une fois que le parent appelle wait (), l'identificateur de processus du processus zombie et son entrée dans la table de processus sont libérés.

Examinons maintenant ce qui se produirait si un parent n’invoquait pas wait () mais s’arrêtait à la place, laissant ainsi ses processus enfants comme orphelins. Linux et UNIX répondent à ce scénario en affectant le processus init en tant que nouveau parent aux processus orphelins. Le processus init appelle périodiquement wait (), ce qui permet de collecter le statut de sortie de tout processus orphelin et de libérer l'identificateur de processus et l'entrée de la table de processus d'Orphan.

Source: Concepts du système d'exploitation by Abraham, Peter, Greg

15
opticod

Un processus orphelin est un processus informatique dont parent process Est terminé ou s'est terminé, bien qu'il (processus enfant) continue à s'exécuter lui-même.
Un processus zombie ou processus obsolète est un processus qui a terminé son exécution mais qui a toujours une entrée dans la table des processus car son processus parent n'a pas appelé une wait() appel système.

10
Linkon
  1. Il n'y a pas d'orphelin, mais le processus utilisant le PID 1.

    Du point de vue du processus en cours, le fait que le PID 1 soit parent ou qu'il ait été hérité par le PID 1 n'a pas d'importance, qu'il ait été démarré directement car son parent d'origine (différent du PID 1) s'est terminé. Il est traité comme n'importe quel autre processus.

  2. Chaque processus passe par une sorte d’état de zombie, à la fin, à savoir la phase entre l’annonce de sa fin par l’émission de SIGCHLD et la reconnaissance de son traitement (livraison ou ignorance).

Lorsque l'état zombie a été entré, le processus n'est plus qu'une entrée dans la liste des processus du système.

La seule ressource importante qu'un zombie utilise exclusivement est un PID valide.

2
alk

Un processus qui a terminé l'exécution mais qui a toujours l'entrée dans la table des processus à signaler à son processus parent est appelé processus zombie. Un processus dont le processus parent n’existe plus, c’est-à-dire qu’il est terminé ou terminé sans attendre la fin du processus enfant, est appelé processus orphelin.

1
SAURABH DUBEY