Was sind Zombies und was verursacht sie? Gibt es Zombie-Prozesse und Zombie-Objekte?
Finde ich Fragen über zombies, aber keine, die direkt behandelt, was Sie sind und warum und wie Sie auftreten. Es gibt ein paar, die Adresse, was zombie-Prozesse sind im Rahmen der Beantwortung einer bestimmten Frage, aber nicht die Ursache anzugehen.
Gibt es auch Fragen zu zombie-Prozesse und Fragen über Objective-C/Cocoa-related zombie-Objekte. Was sind die Unterschiede bzw. wie sich diese zueinander? Ist ein "EXEC_BAD_ACCESS" auf dem Mac/iPhone (oder ähnliche Fehler auf anderen Plattformen) gleichbedeutend mit einem zombie?
Wie kann man verhindern zombies und gibt es irgendwelche bewährten Methoden, die Ihnen helfen, Sie zu vermeiden?
Wäre es hilfreich, wenn diese Informationen an einem Ort. Diese Frage soll Plattform - /sprachneutral, wenn möglich.
InformationsquelleAutor der Frage yabada | 2010-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zombie-Prozesse und zombie-Objekte sind völlig unabhängig voneinander. Zombie-Prozesse sind, wenn ein Elternteil startet einen untergeordneten Prozess-und der Kind-Prozess beendet, aber die Eltern nicht abholen des Kindes exit-code. Das Prozess-Objekt hat zu bleiben, bis das geschieht - es verbraucht keine Ressourcen und ist tot, es existiert aber noch - damit, "zombie".
Zombie Objekte sind eine debugging-Funktion für Kakao - /CoreFoundation, um Ihnen zu helfen fangen Speicher-Fehler - in der Regel, wenn ein Objekt refcount auf null fällt es sofort freigegeben, aber das macht das Debuggen schwierig. Stattdessen, wenn zombie-Objekte aktiviert sind, wird der Objekt-Speicher nicht sofort freigegeben, es ist nur markiert wie ein zombie, und jeder weitere Versuch wird protokolliert, und Sie können die Spur, wo im code die Objekt verwendet wurde, über seine Lebenszeit.
EXEC_BAD_ACCESS ist Ihre run-of-the-mill "Sie verwendet, ein Ungültiger Zeiger" Ausnahme, wie wenn ich:
InformationsquelleAutor der Antwort Paul Betts
Wenn ein Prozess beendet wird, viel von seinen Zustand gibt es noch in den kernel, weil seine Eltern können vielleicht noch anschauen wollen, ein paar Dinge, wie Ihr Rückgabewert, die muss irgendwo gespeichert werden. Wenn ein Elternteil ruft wait() oder waitpid(), es sagt dem kernel zu werfen es Weg, weil es mit ihm getan. Bis es tut, das Kind behält eine pid und verbraucht Ressourcen. Die un-erntete Kind-Prozesse genannt werden zombies. Selbst das töten eines zombie nicht entfernen, es muss geerntet werden (wait-ed-mit) durch seine Eltern. Wenn der Elternteil stirbt, sind Sie an "init" auf unix-Systemen, deren einzige Aufgabe es ist, zu warten, für Dinge, die Sie zu bereinigen.
Habe ich noch nie gehört "zombie-Objekte", aber ich nehme an, es bezieht sich auf Dinge, die entweder nicht bereinigt wurde, indem der garbage collector, oder haben die das zirkuläre Verweise oder so etwas ähnliches, wie, dass Sie nicht gereinigt werden, indem der garbage collector. Die Metapher ist ziemlich ähnlich: fork()==malloc(), wait()==free() auf einem bestimmten Niveau. (Keine perfekte Metapher, natürlich.)
InformationsquelleAutor der Antwort eruciform