Zombie proces
Zombie proces je na Unixových systémech takový proces, který se ukončil (prostřednictvím systémového volání exit()
), ale i nadále se vyskytuje v tabulce procesů. Jedná se o proces se statusem terminated (v češtině ukončený). Tato situace nastává u procesů založených jako potomky jiného, již existujícího, procesu, protože u těchto procesů je záznam v tabulce procesů stále třeba, aby si rodičovský proces mohl přečíst návratový kód potomka. Jakmile tak učiní prostřednictvím systémového volání wait()
, operační systém odebere záznam z tabulky procesů a uvolní jemu přidělené prostředky. Potomek se vždy napřed stane zombie procesem předtím, než je z tabulky procesů odebrán. Za normálních okolností okamžitě poté, co se potomek stane zombie procesem jeho rodič spustí volání wait() a operačnímu systému je takto dán signál, že může proces vymazat. Procesy, které patří mezi zombie procesy delší dobu jsou obvykle chybou a způsobují únik prostředků.
Termín zombie proces pochází z běžné definice slova zombie — nemrtvá osoba. V tomto kontextu proces „zemřel“, ale ještě nebyl „uklizen“. Na rozdíl od normálních procesů nemá příkaz kill
na zombie procesy žádný efekt.
Zombie procesy si není možné plést s osiřelými procesy; osiřelý proces je proces, který se stále provádí, ale jeho rodič zemřel. Tyto procesy nezůstávají jako zombie procesy, namísto toho jsou adoptovány procesem init a ten na své potomky spustí wait().
Přehled
Jakmile se proces ukončí pomocí volání exit
, veškerá jemu přiřazená paměť a jakékoliv další jemu přiřazené prostředky jsou dealokovány, takže mohou být využity jinými procesy. I přesto ale stále zůstává záznam v tabulce procesů. Rodičovský proces si může chtít přečíst návratový kód spuštěním systémového volání wait(), jakmile tak učiní, záznam zombie procesu je odebrán. Volání wait může být provedeno v sekvenčním kódu, většinou je ale toto volání spouštěno v handleru pro signál SIGCHLD, který rodičovský proces obdrží poté, co se potomek ukončí.
Po odebrání zombie procesu se uvolní jeho PID a záznam v tabulce procesů může být znovu použit. Pokud ovšem rodičovský proces systémové volání wait nespustí, zombie v tabulce procesů zůstane, což způsobuje únik prostředků. V některých situacích toto může být záměrem, například když rodičovský proces vytvoří dalšího potomka a chce se ujistit, že nebude mít stejné číslo PID. Na moderních Unixových systémech se aplikuje ještě následující speciální případ. Pokud rodičovský proces explicitně ignoruje signál SIGCHLD namísto výchozího ignorování signálu, veškeré informace o potomku budou zahozeny a nezůstane žádný zombie proces. [1]
Za účelem odebrání zombie procesu ze systému je možné zaslat signál SIGCHLD rodičovskému procesu manuálně za použití příkazu kill. Pokud rodičovský proces nadále odmítá proces odklidit a za předpokladu, že je bezpečné ukončit rodičovský proces, dalším krokem může být odebrání rodičovského procesu. Jakmile proces ztratí svého rodiče (a stane se osiřelým procesem), adoptuje ho proces init. Init periodicky spouští systémové volání wait za účelem odklizení jakékoliv zombie s rodičem init.
Reference
V tomto článku byl použit překlad textu z článku Zombie process na anglické Wikipedii.
- wait man page - System Calls | ManKier. www.mankier.com [online]. [cit. 2017-02-13]. Dostupné online.