Vidlička

fork() - systémové volání v operačních systémech podobných Unixu , které vytváří nový proces (dítě), který je téměř úplnou kopií nadřazeného procesu, který toto volání provádí.

Koncept rozvětvení procesů byl poprvé popsán v roce 1962 Melvinem Conwayem a implementován ve formě systémového volání v Project Genie v roce 1964 , odkud si jej vypůjčil Thompson při implementaci Unixu; volání bylo později zahrnuto do standardu POSIX .

Mezi podřízeným procesem vytvořeným voláním fork()a nadřazeným procesem jsou rozdíly:

Po volání fork() se algoritmus obvykle rozvětvuje (pokud funkce uspěje, fork()vrátí PID podřízeného procesu nadřazenému procesu a nulu podřízenému procesu. Pokud spawn podřízeného procesu selže, funkce fork()vrátí -1).

Poté fork(), co podřízený proces nejčastěji provede systémové volání exec(), které nahraje nový program do prostoru procesu (přesně tak a pouze tímto způsobem se v unixovém systému program spouští v samostatném procesu). Takže první (nulový) unixový proces (jádro systému) vytvoří svou kopii pro spuštění init (proces s PID = 1), což zase vytvoří podřízené procesy pro zahájení inicializace systému a terminálů.

Některé programy nevytvářejí podřízené procesy, aby spouštěly jiný program, ale aby spouštěly paralelní úlohu. Takto se chovají například jednoduché síťové servery - když se klient připojí, server vytvoří vlastní kopii (podřízený proces), která obsluhuje klientské připojení a končí při jeho uzavření. Nadřazený proces nadále čeká na nová připojení.

Dokončení volání fork()trvá dlouho, protože vyžaduje zkopírování velkého množství dat. Aby se tomu zabránilo, některé síťové servery (jako jsou webové servery Apache a Lighttpd ) vytvářejí podřízené procesy s předstihem, aby zkrátily dobu odezvy serveru. Existují také „odlehčené“ implementace fork()(například v linuxovém jádře [1] ), které mapují nadřazené paměťové stránky na nový proces namísto jejich kopírování (nová stránka je vytvořena pouze tehdy, když je její obsah změněn jedním z procesů) , což výrazně zkracuje čas na vytvoření nového procesu ( technika copy-on-write ).

Viz také

Poznámky

  1. OpenNet-fork . Získáno 11. června 2012. Archivováno z originálu 4. března 2016.

Odkazy