35 votes

Que sont les zombies et quelles en sont les causes? Existe-t-il des processus et des objets Zombie?

Je peux trouver des questions à propos de zombies, mais aucun qui traite directement de ce qu'ils sont et pourquoi et comment ils se produisent. Il y a un couple qui traitent de ce zombie processus dans le contexte de répondre à une question précise, mais ne traitent pas la cause.

Il y a également des questions concernant zombie processus et des questions sur Objective-C/Cocoa liées zombie objets. Quelles sont les différences ou comment sont-ils liés? Est un "EXEC_BAD_ACCESS" sur Mac/iPhone (ou d'erreur similaire sur les autres plateformes), synonyme d'un zombie?

Comment peut-on empêcher les zombies et existe-il des pratiques exemplaires qui aideront à éviter?

Il serait utile d'avoir cette information en un seul endroit. Cette question est destinée à être la plate-forme/langue agnostique, si possible.

35voto

Paul Betts Points 41354

Zombie processus et zombie les objets sont totalement étrangers. Zombie processus sont quand un parent commence un processus enfant et le processus fils se termine, mais le parent ne veut pas ramasser de l'enfant code de sortie. Le processus de l'objet a à y rester jusqu'à ce que cela se produit - il ne consomme pas de ressources, et est mort, mais il existe toujours - ainsi, "zombie".

Zombie objets sont une fonctionnalité de débogage de Cacao / CoreFoundation pour vous aider à attraper les erreurs de mémoire - normalement, quand un objet refcount tombe à zéro, il est immédiatement remis en liberté, mais qui rend le débogage difficile. Au lieu de cela, si zombie objets sont activés, l'objet de la mémoire n'est pas instantanément libéré, c'est juste marqué comme un zombie, et les tentatives d'utiliser, il sera enregistré et vous pouvez savoir où dans le code de l'objet a été utilisé delà de sa durée de vie.

EXEC_BAD_ACCESS est votre run-of-the-mill "Vous avez utilisé un pointeur incorrect" l'exception", comme si je l'ai fait:

(*(0x42)) = 5;

8voto

eruciform Points 5176

Lorsqu'un processus se termine, une grande partie de son état, il existe toujours dans le noyau, parce que son parent peut encore envie de regarder un peu les choses, comme sa valeur de retour, qui doit être stocké quelque part. Lorsqu'un parent appelle wait() ou waitpid(), il indique au noyau de jeter tout de suite car il a fait avec elle. Jusqu'à ce qu'il le fait, l'enfant conserve un pid et les utilisations des ressources. Ceux de l'onu-ont récolté des processus enfants sont appelés zombies. Même en tuant un zombie ne vais pas l'enlever, il doit être récolté (attendez-ed-après) par ses parents. Si la mère meurt, ils sont passés à "init" sur les systèmes unix, dont le seul travail consiste à attendre que les choses à nettoyer.

Je n'ai jamais entendu parler de "zombie objets", mais je suppose qu'il fait référence à des choses qui n'ont pas été nettoyée par le garbage collector, ou qui ont des références circulaires ou quelque chose de ce genre, tels qu'ils sont ne va pas être nettoyé par le garbage collector. La métaphore est assez similaire: fork()==malloc(), wait()==free() à un certain niveau. (Pas une métaphore parfaite, bien sûr.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X