Rodičovský proces
Author
Albert FloresRodičovský proces je v informatice označení pro proces, který v operačním systému vytvořil jeden nebo více potomků. Rodiče a potomci vytvářejí v systému stromovou strukturu. Potomek po svém ukončení předává rodiči návratový kód. Potomek může od rodiče dědit určitá nastavení, obsah operační paměti, otevřené soubory a podobně.
Unix
V klasických unixových systémech je každý proces, s výjimkou procesu číslo 0 (swapper), vytvořen tím, že jiný proces provede systémové volání (fork). Proces, který vyvolal systémové volání (fork) je rodičovský proces a nově vytvořený proces je potomek. +more Každý proces (s výjimkou procesu 0) má jeden rodičovský proces, ale může mít mnoho potomků.
Jádro operačního systému identifikuje každý proces pomocí svého identifikátoru. Proces číslo 0 je speciální proces, který je vytvořen při spuštění systému; po vytvoření potomka (proces číslo 1) se proces číslo 0 stává swapper procesem (někdy také známý jako „idle task“). +more Proces číslo 1, známý též jako init, je pak předek všech ostatních procesů v systému.
Linux
Jádro Linuxu nemá swapper (proces číslo 0), používá místo toho tzv. kernel thready. +more Prvním procesem je tak proces init s číslem 1 (nověji pak systemd). V Linuxu však ve skutečnosti nebývá init/systemd úplně prvním procesem, protože při startu systému je nejprve používán initrd (nověji initramfs) a po jeho ukončení teprve proces číslo 1 provede systémové volání exec tak, aby se procesem číslo 1 stal init/systemd.
Zombie procesy
Operační systém udržuje tabulku, která sdružuje všechny procesy, prostřednictvím svého identifikátoru procesu (obecně označované jako "pid") na údaje nezbytné pro jeho fungování. Během celého života procesu tyto údaje by mohly zahrnovat paměťové segmenty určené pro proces, argumenty proč byly vyvolány, proměnné prostředí, čítače o využití prostředků, user id, group id, a group set, a možná i další typy informací.
Proces ukončí svou činnost, buď zavoláním metody exit (i když implicitně, provedením návratového příkazu z hlavní funkce), nebo na základě obdrženého signálu, který způsobí náhlé ukončení. Operační systém tak uvolní většinu informací týkajících se tohoto procesu, ale stále udržuje základní informace a návratový kód, protože rodič procesu by se mohl zajímat, jestli pomotek byl úspěšně proveden (pomocí standardních funkcí pro dekódování návratového kódu) a množství systémových prostředků jsou uvolněny během jeho plnění.
Ve výchozím stavu, systém předpokládá, že rodičovský proces se opravdu zajímá o tyto informace v době ukončení potomka, tudíž pošle rodiči signál SIGCHLD, aby upozornil, že existují nějaké data o potomkovi, které by měli být předány. Sběr údajů se provádí pomocí systémového volání wait (buď wait nebo relativní volání, jako waitpid, waitid nebo wait4). +more Jakmile tento sběr je proveden, systém uvolní zbytek informací o potomkovi a odstraňuje jeho pid z tabulky procesů. Nicméně, pokud rodičovský proces přetrvává ve sběru dat potomka (nebo neučiní-li to vůbec), systém nemá jinou možnost, než držet pid potomka a data o zániku v tabulce procesů na dobu neurčitou.
Takto ukončený proces, jehož návratový kód nebyl vyzvednut, se nazývá zombie proces, nebo jen zombie v UNIX řeči. Název má vtipné přirovnání vzhledem k uvážení ukončeného procesu jako "již není naživu" nebo "mrtvý"- protože opravdu přestal fungovat - a přetrvávající mrtvý proces "inkarnoval" do "světa živých" procesů - tabulky procesů - což je tedy vlastně "nemrtvý" nebo "zombie".
Zombie procesy mohou představovat problémy na systémech s omezenými prostředky, nebo s omezenou velikostí tabulky procesů. Vytváření nových, aktivních procesů může být tak zabráněno, nedostatkem prostředků dosud používaných dlouhotrvajícími zombie.
Je proto dobré z programovací praxe v jakémkoli programu, který může vytvořit potomka, vytvořit kód, který zabrání tvorbě dlouhotrvajících zombie z původního potomka. Nejzřetelnější je mít kód, který volá wait (nebo jeho relativní volání, jako waitpid, waitid nebo wait4) někde po vytvoření nového procesu. +more Pokud se od programu očekává, že vytvoří mnoho potomků, které se mohou spouštět asynchronně a ukončit se v nepředvídatelném pořadí, je obecně dobré vytvořit handler pro SIGCHLD signál, který volá jeden z wait funkcí ve smyčce, dokud zůstávají nevyzvednuté data o potomkovi. Je také možné, aby rodičovský proces zcela ignoroval ukončení svého potomka a přesto nevytvořil zombie, ale to vyžaduje jednoznačné vymezení handleru pro SIGCHLD prostřednictvím volání sigaction se speciální možností flag SA_NOCLDWAIT.