fork()
- vytvoří nový podřízený proces, který je úplnou kopií nadřazeného procesu. Podřízené a rodičovské procesy používají různé virtuální adresní prostory, které jsou zpočátku obsazeny stejnými paměťovými stránkami. Poté, jak jsou oba procesy vykonávány, se virtuální adresové prostory začínají stále více lišit, protože operační systém provádí líné kopírování paměťových stránek, které jsou zapisovány jedním z těchto dvou procesů, a přiřazuje nezávislé kopie upravených stránek paměti pro každý proces. Tato technika se nazývá Copy-On-Write (COW).vfork()
- vytvoří nový podřízený proces, který je "rychlou" kopií nadřazeného procesu. Na rozdíl od systémového volánífork()
, podřízené a rodičovské procesy sdílejí stejný virtuální adresní prostor. POZNÁMKA! Při použití stejného virtuálního adresového prostoru používá rodič i potomek stejný zásobník, ukazatel zásobníku a ukazatel instrukce, jako v případě klasickéhofork()
! Aby se zabránilo nechtěnému rušení mezi rodičem a potomkem, kteří používají stejný zásobník, provádění nadřazeného procesu je zmrazeno, dokud dítě nezavolá buďexec()
(vytvořit nový virtuální adresní prostor a přechod do jiného zásobníku) nebo_exit()
(ukončení provádění procesu).vfork()
je optimalizacefork()
pro model "fork-and-exec". Lze jej provést 4-5krát rychleji nežfork()
, protože na rozdíl odfork()
(i s ohledem na COW), implementacevfork()
systémové volání nezahrnuje vytvoření nového adresního prostoru (přidělení a nastavení nových adresářů stránek).clone()
- vytvoří nový podřízený proces. Různé parametry tohoto systémového volání určují, které části nadřazeného procesu musí být zkopírovány do podřízeného procesu a které části mezi nimi budou sdíleny. Výsledkem je, že toto systémové volání lze použít k vytvoření všech druhů prováděcích entit, počínaje vlákny až po zcela nezávislé procesy. Ve skutečnosticlone()
systémové volání je základem, který se používá pro implementacipthread_create()
a celá rodinafork()
systémová volání.exec()
- resetuje veškerou paměť procesu, načte a analyzuje specifikovaný spustitelný binární soubor, nastaví nový zásobník a předá řízení vstupnímu bodu načteného spustitelného souboru. Toto systémové volání nikdy nevrací řízení volajícímu a slouží k nahrání nového programu do již existujícího procesu. Toto systémové volání sfork()
systémové volání dohromady tvoří klasický model řízení procesů UNIX s názvem „fork-and-exec“.
-
vfork()
je zastaralá optimalizace. Před dobrou správou pamětifork()
vytvořil úplnou kopii paměti rodiče, takže to bylo docela drahé. protože v mnoha případechfork()
byl následovánexec()
, která současnou paměťovou mapu zahodí a vytvoří novou, to byly zbytečné výdaje. V současné doběfork()
nekopíruje paměť; je to jednoduše nastaveno jako "kopírovat při zápisu", takžefork()
+exec()
je stejně efektivní jakovfork()
+exec()
. -
clone()
je systémové volání používanéfork()
. s některými parametry vytvoří nový proces, s jinými vytvoří vlákno. rozdíl mezi nimi je pouze v tom, které datové struktury (paměťový prostor, stav procesoru, zásobník, PID, otevřené soubory atd.) jsou sdíleny nebo ne.
execve()
nahradí aktuální spustitelný obraz jiným obrazem načteným ze spustitelného souboru.fork()
vytvoří podřízený proces.vfork()
je historicky optimalizovaná verzefork()
, určené k použití, kdyžexecve()
je voláno přímo pofork()
. Ukázalo se, že funguje dobře v systémech bez MMU (kdefork()
nemůže fungovat efektivně) a kdyžfork()
procesy s velkou pamětí pro spuštění nějakého malého programu (například JavaRuntime.exec()
). POSIX standardizovalposix_spawn()
nahradit tato poslední dvě modernější použitívfork()
.posix_spawn()
dělá ekvivalentfork()/execve()
, a také umožňuje nějaké fd žonglování mezi tím. Má nahraditfork()/execve()
, hlavně pro platformy jiné než MMU.pthread_create()
vytvoří nové vlákno.clone()
je volání specifické pro Linux, které lze použít k implementaci čehokoli zfork()
napthread_create()
. Poskytuje hodně kontroly. Inspirováno narfork()
.rfork()
je volání specifické pro plán 9. Má to být obecné volání, které umožňuje několik stupňů sdílení mezi úplnými procesy a vlákny.
Jak převedu volání podprocesu do textového souboru?
Jak seřadit soubor na základě jeho číselných hodnot pro pole?