fork() - rendszerhívás Unix - szerű operációs rendszerekben , amely egy új folyamatot (gyermek) hoz létre, amely szinte teljes másolata a hívást létrehozó szülőfolyamatnak.
A folyamatelágazás fogalmát először 1962-ben írta le Melvin Conway , és rendszerhívás formájában valósította meg a Project Genie 1964-ben , ahonnan Thompson kölcsönözte a Unix implementációja során; a hívás később bekerült a POSIX szabványba .
Különbségek vannak a hívás által létrehozott gyermekfolyamat fork()és a szülőfolyamat között:
A hívás után fork() az algoritmus általában elágazik (ha a függvény sikeres, fork()visszaadja a szülőfolyamatnak a gyermekfolyamat PID-jét, a gyermekfolyamatnak pedig nullát. Ha a gyermekfolyamat spawn sikertelen, a függvény fork()-1-et ad vissza).
Miután fork()a gyermekfolyamat leggyakrabban olyan rendszerhívást hajt végre, amely exec()egy új programot tölt be a folyamattérbe (pontosan így, és csak így Unix rendszerben a program külön folyamatban indul el). Tehát az első (null) Unix-folyamat (a rendszer kernelje) létrehoz egy másolatot önmagáról az init futtatásához (a folyamat PID = 1), ami viszont létrehozza a gyermekfolyamatokat a rendszer és a terminálok inicializálásának elindításához.
Egyes programok gyermekfolyamatokat hoznak létre, hogy ne egy másik programot, hanem egy párhuzamos feladatot fussanak. Így járnak el például az egyszerű hálózati szerverek – amikor egy kliens csatlakozik, a szerver létrehozza a saját másolatát (gyermekfolyamat), amely kiszolgálja a kliens kapcsolatot, és annak bezárásakor véget ér. A szülő folyamat továbbra is vár az új kapcsolatokra.
A hívás fork()hosszú ideig tart, mert sok adatot igényel a másolás. Ennek elkerülése érdekében egyes hálózati kiszolgálók (például az Apache és a Lighttpd webszerverek ) gyermekfolyamatokat hoznak létre idő előtt, hogy csökkentsék a szerver válaszidejét. Vannak olyan „könnyű” implementációk is (például a Linux kernelben [1] ), amelyek a szülő memórialapokat másolás helyett egy új folyamathoz hozzárendelik (új oldal csak akkor jön létre, ha az egyik folyamat megváltoztatja a tartalmát) , ami jelentősen lecsökkenti az új folyamat létrehozásának idejét ( copy-on-write technika ). fork()