Čo sa deje s pamäťou procesu, keď vytvoríme jeho kópiu pomocou systémového volania fork v operačnom systéme Linux?
sobes.tech AI
Odpoveď od AI
Po volaní fork(), jadro operačného systému vytvorí nový proces, dcérsky proces, ktorý je takmer presnou kópiou rodičovského procesu.
Z pohľadu pamäte k tomu dochádza nasledovne:
-
Virtuálny adresný priestor: Dcérsky proces dostane svoj virtuálny adresný priestor, ktorý je identický s rodičovským v momente volania
fork(). To znamená, že dcérsky proces "vidí" rovnaké rozsahy adries a má rovnakú štruktúru segmentov (kód, dáta, zásobník, halda) ako rodič. -
Fyzická pamäť a Copy-on-Write (CoW): Na začiatku zdieľajú rodič a dcérsky proces rovnaké stránky fyzickej pamäte. Ide o optimalizáciu známa ako "Copy-on-Write" (CoW). Fyzická pamäť sa kopíruje až vtedy, keď jeden z procesov sa pokúsi zmeniť obsah stránky.
- Ak rodič alebo dcérsky proces zapíše dáta do stránky, ktorá bola predtým spoločná, jadro vytvorí novú kópiu tejto stránky pre proces, ktorý zapisuje. Druhý proces pokračuje v používaní starej verzie stránky.
- Ak procesy iba čítajú dáta, pokračujú v používaní spoločnej stránky fyzickej pamäte.
-
File deskriptory: Otvorené file deskriptory sú dediť od dcérskeho procesu. Oba procesy zdieľajú ukazovatele na posun v súbore.
-
Iné zdroje: Iné zdroje, ako signálne obslužníky, aktuálny pracovný adresár atď., sa tiež kopírujú alebo dedí.
Tu je zjednodušená ilustrácia:
Pred fork():
+-------------------+
| Rodičovský proces |
| +-----------------+ |
| | Virtuálna pamäť |
| | (Zásobník, Heap, ...) |
| +-----------------+ |
| | |
| V |
| +-----------------+ |
| | Fyzická pamäť |
| +-----------------+ |
+-------------------+
Hneď po fork() (CoW):
+-----------------------+ +-----------------------+
| Rodičovský proces | | Dcérsky proces |
| +-------------------+ | | +-------------------+ |
| | Virtuálna pamäť | | | | Virtuálna pamäť | |
| | (Tá istá štruktúra)| | | | (Tá istá štruktúra)| |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Fyzická pamäť | | | Fyzická pamäť | |
| | (Niektoré stránky sú spoločné)| | | (Niektoré stránky sú spoločné)| |
| +-----------------------+ | +-----------------------+
+-----------------------+ +-----------------------+
| |
+----------------------------+
Počiatočné stránky fyzickej pamäti sú spoločné
Po zápise na jednu stránku (aktivácia CoW):
+-----------------------+ +-----------------------+
| Rodičovský proces | | Dcérsky proces |
| +-------------------+ | | +-------------------+ |
| | Virtuálna pamäť | | | | Virtuálna pamäť | |
| | (Stránky sú odlišné)| | | | (Stránky sú odlišné)| |
| +-------------------+ | | +-------------------+ |
| | | | | |
| V | | V |
| +-----------------------+ | +-----------------------+
| | Fyzická pamäť | | | Fyzická pamäť | |
| | (Odlišné stránky) | | | (Odlišné stránky) | |
| +-----------------------+ | +-----------------------+
Je dôležité pochopiť, že aj keď je bezprostredne po fork() virtuálny adresný priestor rovnaký, akékoľvek zmeny v pamäti jedného procesu (zápis do premenných, alokácia/uvoľnenie pamäti na halde) neovplyvňujú pamäť druhého procesu vďaka mechanizmu CoW. Ide o úplne nezávislé procesy.