Proces zombie - Zombie process

Na Unix a Unixový počítač operační systémy, a zombie proces nebo zaniklý proces je proces který dokončil provádění (prostřednictvím výstup systémové volání ), ale stále má záznam v tabulka procesů: je to proces v „Ukončený stav ". K tomu dochází u dětské procesy, kde je stále potřeba záznam, aby umožnil nadřazený proces číst jeho dítě stav ukončení: jakmile je stav opuštění načten pomocí Počkejte systémové volání, položka zombie je odstraněna z tabulky procesu a říká se, že je „sklizena“. Podřízený proces se vždy nejprve stane zombie, než bude odstraněn z tabulky prostředků. Ve většině případů za normálního provozu systému zombie na rodiče okamžitě čekají a poté je sklízí - procesy, které zůstávají zombie po dlouhou dobu, jsou obecně chybou a způsobují únik zdrojů, ale jediným zdrojem, který zabírají, je položka tabulky procesu - ID procesu.

Termín zombie proces pochází ze společné definice zombie - an nemrtvý osoba. V metaforě výrazu dětský proces „zemřel“, ale dosud nebyl „sklidil ". Na rozdíl od běžných procesů také zabít příkaz nemá žádný vliv na proces zombie.

Procesy zombie by neměly být zaměňovány osiřelé procesy: osiřelý proces je proces, který stále probíhá, ale jehož rodič zemřel. Když rodič zemře, proces osiřelého dítěte je přijat inic (ID procesu 1). Když osiřelé procesy zemřou, nezůstanou jako zombie procesy; místo toho jsou Počkejtevydáno uživatelem inic. Výsledkem je, že proces, který je jak zombie, tak sirotek, bude sklízen automaticky.

Přehled

Když proces končí prostřednictvím výstup, veškerá paměť a prostředky s ní spojené jsou uvolněny, aby mohly být použity jinými procesy. Položka procesu v tabulce procesů však zůstává. Rodič může číst stav opuštění dítěte provedením Počkejte systémové volání, načež je zombie odstraněna. The Počkejte volání může být provedeno v sekvenčním kódu, ale běžně se provádí v psovod pro SIGCHLD signál, který rodič dostane, kdykoli dítě zemřelo.

Poté, co je zombie odstraněna, je identifikátor procesu (PID) a záznam v tabulce procesů lze poté znovu použít. Pokud však rodič zavolá Počkejte, zombie zůstane v tabulce procesů a způsobí a únik zdrojů. V některých situacích to může být žádoucí - nadřazený proces si přeje pokračovat v zadržování tohoto prostředku - například pokud nadřazený vytvoří další podřízený proces, zajistí, že mu nebude přidělen stejný PID. Na moderních systémech podobných systému UNIX (které vyhovují SUSv3 specifikace v tomto ohledu), platí následující speciální případ: pokud je rodič výslovně ignoruje SIGCHLD nastavením jeho obslužné rutiny na SIG_IGN (spíše než jednoduše ignorovat signál ve výchozím nastavení) nebo má SA_NOCLDWAIT nastaven příznak, všechny informace o stavu podřízeného opuštění budou zahozeny a nebudou ponechány žádné procesy zombie.[1]

Zombie lze identifikovat na výstupu z Unixu ps příkaz přítomností „Z"ve sloupci" STAT ".[2] Zombie, které existují déle než krátkou dobu, obvykle označují chybu v nadřazeném programu nebo jen neobvyklé rozhodnutí nezískat děti (viz příklad). Pokud nadřazený program již není spuštěn, zombie procesy obvykle označují chybu v operačním systému. Stejně jako u jiných úniků zdrojů není ani přítomnost několika zombie sama o sobě znepokojující, ale může naznačovat problém, který by při větším zatížení rostl vážně. Vzhledem k tomu, že procesům zombie není přidělena žádná paměť - jediné využití systémové paměti je pro samotný záznam tabulky procesů - hlavním problémem u mnoha zombie není nedostatek paměti, ale spíše vyčerpání položek tabulky procesů, konkrétně ID čísel procesu.

Chcete-li odstranit zombie ze systému, SIGCHLD signál lze odeslat rodiči ručně pomocí zabít příkaz. Pokud nadřazený proces stále odmítá sklízet zombie a pokud by bylo v pořádku ukončit nadřazený proces, dalším krokem může být odebrání nadřazeného procesu. Když proces ztratí svého rodiče, inic se stává jeho novým rodičem. inic pravidelně provádí Počkejte systémové volání, se kterým můžete sklízet všechny zombie inic jako rodič.

Příklad

Synchronně čekání na konkrétní podřízené procesy v (konkrétním) pořadí může nechat zombie přítomné déle, než výše uvedená „krátká doba“. Není to nutně chyba programu.

#zahrnout <sys/wait.h>#zahrnout <stdlib.h>#zahrnout <unistd.h>int hlavní(prázdnota){  pid_t pids[10];  int i;pro (i = 9; i >= 0; --i) {    pids[i] = Vidlička();    -li (pids[i] == 0) {        printf("Dítě% d",i);        spát(i+1);        _výstup(0);    }}pro (i = 9; i >= 0; --i){    printf("rodič% d",i);    čekej(pids[i], NULA, 0);    }vrátit se 0;}

Výstup

parent9Child3Child4Child2Child5Child1Child6Child0Child7Child8Child9 // zde je pauzaparent8parent7parent6parent5parent4parent3parent2parent1parent0

Vysvětlení

V první smyčce původní (nadřazený) proces rozvětví 10 kopií sebe sama. Každý z těchto podřízených procesů (detekovaný skutečností, že fork () vrátil nulu) vytiskne zprávu, usne a ukončí se. Všechny děti jsou vytvořeny v podstatě ve stejnou dobu (protože rodič dělá ve smyčce jen velmi málo), takže je poněkud náhodné, když je každé z nich naplánováno poprvé - tedy zakódované pořadí jejich zpráv.

Během smyčky je vytvořeno pole ID podřízeného procesu. Kopie pole pids [] je ve všech 11 procesech, ale pouze v nadřazeném je úplná - kopii v každém dítěti budou chybět podřízené PID s nižším číslem a pro vlastní PID budou mít nulu. (Ne že by na tom opravdu záleželo, protože toto pole skutečně používá pouze nadřazený proces.)

Druhá smyčka se provádí pouze v nadřazeném procesu (protože všechny děti byly ukončeny před tímto bodem) a čeká na ukončení každého dítěte. Čeká na dítě, které spalo nejdříve 10 sekund; všechny ostatní již dávno skončily, takže všechny zprávy (kromě první) se objevují rychle za sebou. Zde není možnost náhodného řazení, protože je poháněna smyčkou v jednom procesu. Všimněte si, že první nadřazená zpráva se skutečně objevila před některou z podřízených zpráv - nadřazený byl schopen pokračovat do druhé smyčky, než mohl některý z podřízených procesů spustit. Toto je opět jen náhodné chování plánovače procesů - zpráva „parent9“ se mohla objevit kdekoli v sekvenci před „parent8“.

Child0 až Child8 stráví v tomto stavu jednu nebo více sekund, mezi časem, kdy opustili, a časem, kdy na ně rodič udělal waitpid (). Rodič už čekal na Child9, než odešel, takže jeden proces jako zombie nestrávil v podstatě žádný čas. [3]

Viz také

Reference

  1. ^ „počkej (2) Man page“. Příručka programátora systému Linux.
  2. ^ „Zombies (5) - UNIX System V (Concepts)“. Detektor Collider ve Fermilab.
  3. ^ https://stackoverflow.com/questions/42627411/can-someone-please-explain-how-this-worksfork-sleep

externí odkazy