Sobes.tech
Middle

Č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:

  1. 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č.

  2. 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.
  3. File deskriptory: Otvorené file deskriptory sú dediť od dcérskeho procesu. Oba procesy zdieľajú ukazovatele na posun v súbore.

  4. 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.