Zombi folyamat

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. június 8-án felülvizsgált verziótól ; az ellenőrzések 5 szerkesztést igényelnek .

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 .

Etimológia

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”.

A zombik felemelkedése

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.

Zombie Trouble

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).

Példák zombikat létrehozó programokra különféle programozási nyelveken

Xi

#include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main () { pid_t child_pid ; gyermek_pid = villa (); if ( gyermek_pid > 0 ) { alvás ( 60 ); } else { kilépés ( 0 ); } return 0 ; }

Python

#!/usr/bin/env python2 # -*- kódolás: utf8 -*- import részfolyamat importálási idő import szálfűzés # Spawn folyamat 'ls' a '-l' opcióval proc = subprocess . Popen ([ 'ls' , '-l' ]) # Állítsa le a program főszálát 5 másodpercre. A folyamat során # a folyamat "zombik" állapotú lesz, még akkor is, ha a folyamat már kilépett, mert az # időfolyamat eredménye nem került feldolgozásra . aludni ( 5 ) # Ezen a helyen a zombi eltűnik, mert. a program kiüríti a # folyamat I/O puffereit és beolvassa a proc kilépési kódját . kommunikálni () idő . aludni ( 5 )

Vegyes

  • A zombik nem tudnak jeleket fogadni, ezért nem ölhetők meg segédprogrammal vagy ölőhívással . Vagy a szülőfolyamat, vagy annak leállítása eltávolíthatja őket.
  • A Unixban minden folyamatnak megvannak a saját szülei – olyan folyamatok, amelyeknek nincsenek vagy elveszítették a szüleit ( "árva" folyamatok ; angolul  árva folyamat ) az init gyermekei (a folyamat PID = 1), ami viszont a a kernel (folyamat PID = 0-val). Az init mindig feldolgozza a SIGCHLD-t, így az ilyen folyamatok soha nem hagynak zombikat.
  • A zombik felismerhetők a folyamatlistában ( amelyet a ps segédprogram jelenít meg ) a STAT oszlopban lévő "Z" jelzővel.
  • Jó programozási stílusnak tekinthető, ha mindig kezeli a SIGCHLD-t.
  • A Perl és Python szkriptnyelvek implicit módon kezelik a SIGCHLD-t, ha a program figyelmen kívül hagyásra konfigurálja.

Lásd még