Zombie process , zombie ( eng. zombie process , eng. defunct process ) - Unix rendszerben lévő gyermekfolyamat , amely befejezte a végrehajtását, de még mindig jelen van az operációs rendszer folyamatainak listájában, hogy a szülőfolyamat elolvashassa a kilépési kódot .
A " zombi " szóból származik , jelentése "élő halott" ( oximoron , angolul élőhalott ). A kifejezés élénk metaforája annak a ténynek, hogy a folyamat „halott”, de nem „eltemetve”.
Egy folyamat, ha leáll (akár normál esetben, akár egy kezeletlen jel eredményeként), felszabadítja az összes erőforrását, és "zombivá" válik – egy üres bejegyzés a folyamattáblázatban, amely a szülőfolyamat által olvasandó kilépési állapotot tárolja.
A zombi folyamat addig létezik, amíg a szülőfolyamat egy rendszerhívással wait() ki nem olvassa állapotát , ami a folyamattábla bejegyzésének felszabadulását okozza.
Amikor egy folyamat leáll, a rendszer SIGCHLDwait() jellel értesíti a szülő folyamatot a gyermek befejezéséről, így kényelmes lehet (de nem szükséges) egy kezelőt hívni ehhez a jelhez.
A zombik nem foglalnak el memóriát (mint az árva folyamatok ), hanem zárolják a bejegyzéseket a folyamattáblázatban, amelynek mérete korlátozott minden felhasználó és a rendszer egésze számára.
Az írási korlát elérésekor a zombit létrehozó szülőfolyamatot futtató felhasználó összes folyamata nem tud új utódfolyamatokat létrehozni. Ezenkívül az a felhasználó, akinek a neve alatt a szülőfolyamat fut, nem tud bejelentkezni a konzolba (helyi vagy távoli), illetve nem tud parancsot végrehajtani egy már megnyitott konzolon (mert az sh parancsértelmezőnek ehhez új folyamatot kell létrehoznia). , valamint az állapot helyreállításához (a sértő program leállításához) a rendszergazda beavatkozására lesz szükség.
Néha, ha a szülőfolyamat a szuperfelhasználó nevében fut, újraindításra lehet szükség a rekordok felszabadításához (a folyamat újraindításához) (és gyakran csak kemény újraindításra). Egyes operációs rendszerek (például a Sun Solaris ) ilyenkor összeomlik a futó folyamatok egy része, ami visszaállítja a rendszer állapotát.
Minden folyamat zombi állapotban van, amikor leáll, és amíg a befejezési állapotot egy ős be nem olvassa, ez teljesen normális, és a rövid élettartamú zombi folyamatok nem jelentenek problémát a rendszerben. Ugyanakkor számos programozási hiba vezethet feldolgozatlan zombi folyamatok megjelenéséhez és felhalmozódásához a rendszerben (vagyis olyan folyamatok, amelyek már leálltak, amelyeknek a szülője nem olvassa be az állapotukat).
A gyermekfolyamatok leállításkezelésének figyelmen kívül hagyása nem helyes, de általában nem okoz problémát a rövid élettartamú programoknál, hiszen ha egy folyamat leáll, minden gyermeke a folyamat gyermekévé válik init, amely folyamatosan olvassa zombi gyermekeinek állapotát, törli a folyamat táblázatot. Ennek a mechanizmusnak az engedélyezéséhez hajtják végre a szabványos "double fork()" démonindítási technikát: a köztes szülő befejezi, így a folyamat a gyermeke szülőjévé válik init.
A hosszú életű és gyakran gyermeket létrehozó programoknál a gyermekprogram-lezárás vezérlését helyesen kell kezelni, mert a kezeletlen zombik felhalmozódása a folyamattáblázat bejegyzéseinek felhalmozódása formájában "erőforrás szivárgáshoz" vezet.
A linux rendszerben a 3.4-es kerneltől kezdve egy folyamat képes arra, hogy árva elfogadónak ("subreaper") nyilvánítsa magát a initparanccsal rendelkező folyamat helyett prctl(PR_SET_CHILD_SUBREAPER).