GNU/Linux >> Znalost Linux >  >> Linux

Konkrétně, jak fork() zpracovává dynamicky alokovanou paměť z malloc() v Linuxu?

Každá stránka, která je alokována pro proces (ať už jde o stránku virtuální paměti, která má na sobě zásobník nebo haldu), je zkopírována, aby k ní měl rozvětvený proces přístup.

Ve skutečnosti se nekopíruje hned na začátku, je nastaveno na Copy-on-Write, to znamená, že jakmile se jeden z procesů (rodič nebo podřízený) pokusí upravit stránku, zkopíruje se tak, aby si navzájem neubližovaly, a stále mají přístupná všechna data z bodu fork().

Například kódové stránky, ty, na které byl skutečný spustitelný soubor namapován v paměti, jsou obvykle pouze pro čtení, a proto se znovu používají mezi všemi rozvětvenými procesy - nebudou znovu zkopírovány, protože tam nikdo nepíše, pouze čte atd. copy-on-write nebude nikdy potřeba.

Více informací je k dispozici zde a zde.


Po forku je dítě zcela nezávislé na rodiči, ale může zdědit určité věci, které jsou kopiemi rodiče. V případě hromady bude mít dítě koncepčně kopii hromady rodičů v době rozvětvení. Úpravy hlavičky v adresním prostoru dítěte však změní pouze kopii dítěte (např. prostřednictvím kopírování při zápisu).

Pokud jde o dokumentaci:Všiml jsem si, že dokumentace obvykle uvádí, že vše je zkopírován, kromě pro bla, bla bla.


Krátká odpověď je 'špinavá při psaní' - delší odpověď je .. mnohem delší.

Ale pro všechny záměry a účely – pracovní model, který lze na úrovni C s jistotou předpokládat, je ten, že těsně po fork() jsou oba procesy naprosto identické – tj. dítě dostane 100% přesnou kopii – (ale na chvíli bit kolem návratové hodnoty fork()) - a pak se začnou rozcházet, protože každá strana upravuje svou paměť, zásobník a hromady.

Takže váš závěr je trochu mimo - dítě začíná se stejnými daty jako rodič zkopírované do vlastního prostoru - pak je upraví - a vidí je jako upravené - zatímco rodič pokračuje se svou vlastní kopií.

Ve skutečnosti jsou věci trochu složitější - snaží se vyhnout úplné kopii tím, že udělá něco špinavého; vyhýbejte se kopírování, dokud to nebude nutné.

Dw.


Linux
  1. Jak interně funguje copy_from_user z jádra Linuxu?

  2. jak zkontrolovat velikost haldy přidělenou pro jvm linuxem

  3. Jak získat přístup k fyzickým adresám z uživatelského prostoru v Linuxu?

  1. Jak mohu rezervovat blok paměti z jádra Linuxu?

  2. Jak kopírování při zápisu ve fork() zvládá více rozvětvení?

  3. Jak zapsat obraz ISO na paměťovou kartu USB z příkazového řádku linuxu?

  1. Jak vymazat mezipaměť v Linuxu

  2. Jak funguje alokace zásobníku v Linuxu?

  3. Jak Linux rozlišuje vlákna od podřízených procesů?