Sobes.tech
Middle

Šta se dešava sa memorijom procesa kada kreiramo njegovu kopiju pomoću sistemskog poziva fork u Linux operativnom sistemu?

sobes.tech АИ

Одговор од АИ

При poziv fork(), kernel operativnog sistema kreira novi proces, ćerki proces, koji je gotovo tačna kopija roditeljskog procesa.

Što se tiče memorije, dešava se sledeće:

  1. Virtuelni adresni prostor: Ćerki proces dobija svoj virtuelni adresni prostor, koji je identičan sa onim roditeljskog procesa u trenutku poziva fork(). To znači da ćerki proces "vidi" iste opsege adresa i ima istu strukturu segmenata (kod, podaci, stek, hrpa) kao i roditelj.

  2. Fizička memorija i Copy-on-Write (CoW): U početku, roditeljski i ćerki proces dele iste stranice fizičke memorije. Ovo je optimizacija poznata kao "Copy-on-Write" (CoW). Fizička memorija se kopira tek kada jedan od procesa pokuša da izmeni sadržaj stranice.

    • Ako roditeljski ili ćerki proces zapisuje podatke u stranicu koja je ranije bila zajednička, kernel kreira novu kopiju te stranice fizičke memorije za proces koji piše. Drugi proces nastavlja da koristi staru verziju stranice.
    • Ako procesi samo čitaju podatke, oni nastavljaju da koriste zajedničku stranicu fizičke memorije.
  3. Fajl deskriptori: Otvoreni fajl deskriptori se nasleđuju ćerki procesu. Oba procesa dele pokazivače na pomeranje u fajlu.

  4. Drugi resursi: Drugi resursi, poput signala, trenutnog radnog direktorijuma itd., takođe se kopiraju ili nasleđuju.

Evo pojednostavljene ilustracije:

Pre fork():

+-------------------+
| Roditeljski proces |
| +-----------------+ |
| | Virtuelna memorija |
| | (Stek, Hrpa, ...) |
| +-----------------+ |
|      |              |
|      V              |
| +-----------------+ |
| | Fizička memorija |
| +-----------------+ |
+-------------------+

Odmah nakon fork() (CoW):

+-----------------------+   +-----------------------+
| Roditeljski proces     |   | Ćerki proces         |
| +-------------------+ |   | +-------------------+ |
| | Virtuelna memorija | |   | | Virtuelna memorija | |
| | (Ista struktura)    | |   | | (Ista struktura)    | |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Fizička memorija        | | | Fizička memorija        | |
| | (Neke stranice su zajedničke)| | | (Neke stranice su zajedničke)| |
| +-----------------------+   | +-----------------------+
+-----------------------+   +-----------------------+
          |                            |
          +----------------------------+
                Početne stranice fizičke memorije su zajedničke

Nakon zapisivanja na jednu od stranica (aktivacija CoW):

+-----------------------+   +-----------------------+
| Roditeljski proces     |   | Ćerki proces         |
| +-------------------+ |   | +-------------------+ |
| | Virtuelna memorija | |   | | Virtuelna memorija | |
| | (Stranice su odvojene)| |   | | (Stranice su odvojene)| |
| +-------------------+ |   | +-------------------+ |
|        |            |   |        |            |
|        V            |   |        V            |
| +-----------------------+   | +-----------------------+
| | Fizička memorija        | | | Fizička memorija        | |
| | (Odvojene stranice)    | | | (Odvojene stranice)    | |
| +-----------------------+   | +-----------------------+

Važno je razumeti da, iako je odmah nakon fork() virtuelni adresni prostor isti, bilo kakve promene u memoriji jednog procesa (pisanje u promenljive, alokacija/oslobađanje memorije na hrpi) ne utiču na memoriju drugog procesa zahvaljujući mehanizmu CoW. To su potpuno nezavisni procesi.