Co se děje s pamětí procesu, když vytvoříme jeho kopii pomocí systémového volání fork v operačním systému Linux?
sobes.tech AI
Odpověď od AI
Při volání fork() operační systém jádro vytvoří nový proces, potomka, který je téměř přesnou kopií rodičovského procesu.
Z pohledu paměti k tomu dochází následující:
-
Virtuální adresní prostor: Potomek dostane svůj virtuální adresní prostor, který je identický s rodičovým v okamžiku volání
fork(). To znamená, že potomek "vidí" stejné rozsahy adres a má stejnou strukturu segmentů (kód, data, zásobník, halda) jako rodič. -
Fyzická paměť a Copy-on-Write (CoW): Zpočátku sdílejí rodič a potomek stejné stránky fyzické paměti. Tato optimalizace je známá jako "Copy-on-Write" (CoW). Fyzická paměť je kopírována až tehdy, když jeden z procesů se pokusí změnit obsah stránky.
- Pokud rodič nebo potomek zapisuje data do stránky, která byla dříve sdílená, jádro vytvoří novou kopii této stránky fyzické paměti pro zapisující proces. Druhý proces pokračuje ve využívání staré verze stránky.
- Pokud procesy pouze čtou data, nadále používají sdílenou stránku fyzické paměti.
-
File deskriptory: Otevřené deskriptory souborů jsou děděny potomkem. Oba procesy sdílejí ukazatele na posun v souboru.
-
Jiné zdroje: Další zdroje, jako signální obslužníci, aktuální pracovní adresář atd., jsou také kopírovány nebo děděny.
Zde je zjednodušená ilustrace:
Před fork():
+-------------------+
| Rodičovský proces |
| +-----------------+ |
| | Virtuální paměť |
| | (Zásobník, Heap, ...) |
| +-----------------+ |
| | |
| V |
| +-----------------+ |
| | Fyzická paměť |
| +-----------------+ |
+-------------------+
Hned po fork() (CoW):
+-----------------------+ +-----------------------+
| Rodičovský proces | | Potomek proces |
| +-------------------+ | | +-------------------+ |
| | Virtuální paměť | | | | Virtuální paměť | |
| | (Stejná struktura)| | | | (Stejná struktura)| |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Fyzická paměť | | | Fyzická paměť | |
| | (Některé stránky sdílené)| | | (Některé stránky sdílené)| |
| +-----------------------+ | +-----------------------+
+-----------------------+ +-----------------------+
| |
+----------------------------+
Počáteční sdílené stránky fyzické paměti
Po zápisu na jednu stránku (aktivace CoW):
+-----------------------+ +-----------------------+
| Rodičovský proces | | Potomek proces |
| +-------------------+ | | +-------------------+ |
| | Virtuální paměť | | | | Virtuální paměť | |
| | | | | | | |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Fyzická paměť | | | Fyzická paměť | |
| | (Samostatné stránky) | | | (Samostatné stránky) | |
| +-----------------------+ | +-----------------------+
Je důležité pochopit, že i když je těsně po fork() virtuální adresní prostor stejný, jakékoli změny v paměti jednoho procesu (zápis do proměnných, alokace/uvolnění paměti na haldě) neovlivní paměť druhého procesu díky mechanismu CoW. Tyto procesy jsou zcela nezávislé.