GNU/Linux >> Znalost Linux >  >> Linux

Když se proces rozvětví, zkopíruje se jeho virtuální nebo rezidentní paměť?

V moderních systémech se žádná paměť ve skutečnosti nekopíruje jen proto, že se používá systémové volání vidlice. Vše je v tabulce stránek označeno pouze pro čtení, takže při prvním pokusu o zapsání pasti do kódu jádra dojde. Ke zkopírování dojde pouze při prvním pokusu procesu o zápis.

Toto je známé jako copy-on-write.

Může však být nutné sledovat také potvrzený adresní prostor. Pokud v době, kdy má jádro kopírovat stránku, není k dispozici žádná paměť nebo swap, musí kvůli uvolnění paměti zabít nějaký proces. To není vždy žádoucí, takže je možné sledovat, kolik paměti se jádro zavázalo.

Pokud by se jádro zavázalo k více než dostupné paměti + swapu, může při pokusu o volání fork vydat chybový kód. Pokud je k dispozici dostatek, jádro se po rozvětvení zaváže k plné virtuální velikosti rodiče pro oba procesy.


Nebojte se, vytvoří línou kopii (copy-on-write). Adresy virtuální paměti obou procesů zpočátku ukazují na stejné stránky, ale když se je rozvětvený proces pokusí upravit, ve skutečnosti vytvoří fyzickou kopii stránky (od té doby je tato stránka umístěna na dvou místech ve vaší RAM).

Pozor, žádná z nahlášených paměťových stop ve skutečnosti neříká, kolik paměti RAM proces využívá. Kvůli swapování, sdílení paměti a dalším problémům s virtuální pamětí to nelze s jistotou vědět. Některé části paměťového prostoru jsou sdílené knihovny (kde je počítat?), některé odkazují na paměť bez RAM (jiná hardwarová zařízení), některé jsou aktuálně vyměněny, některé ještě nejsou zkopírovány (copy-on-write) a již brzy. Přečtěte si toto:

https://lwn.net/Articles/642202/


Existuje nastavení jádra

/proc/sys/vm/overcommit_memory

Citace z vynikajícího článku:

Since 2.5.30 the values are: 0 (default): as before: guess about how much  
overcommitment is reasonable, 1: never refuse any malloc(), 2: be precise 
about the overcommit - never commit a virtual address space larger than swap 
space plus a fraction overcommit_ratio of the physical memory. Here 
/proc/sys/vm/overcommit_ratio (by default 50) is another user-settable 
parameter. It is possible to set overcommit_ratio to values larger than 100. 
(See also Documentation/vm/overcommit-accounting.)

To platí pro vidlice i běžné malloc. Tj. pokud jej nastavíte na 0, rozvětvení se zkopíruje při zápisu. Kopírovat při zápisu znamená, že jakmile se aplikace rozvětví, obě kopie budou sdílet paměťové stránky, dokud dítě nebo originál začne měnit paměť.

Ve většině distribucí vím, že overcommit je 0. Ale pokud jej nastavíte na 2, všechny paměťové stránky budou plně zálohovány skutečnou pamětí a v některých případech pod vysokým tlakem paměti budou stabilnější, ale některé programy (čelil jsem gitku), které spoléhají na overcommits selže.


Linux
  1. Linux – Kdy nemám zabít -9 A proces?

  2. Nový rodičovský proces, když rodičovský proces zemře?

  3. Proč není Sigint propagován do podřízeného procesu, když je odeslán jeho nadřazenému procesu?

  1. Linux – potřebujete vysvětlení ohledně velikosti rezidentní sady/virtuální velikosti?

  2. Využití paměti aktuálního procesu v C

  3. Jak mohu odstranit uživatele v linuxu, když systém říká, že se aktuálně používá v procesu

  1. Co se stane, když se vlákno rozvětvuje?

  2. Kdy bych neměl zabít -9 proces?

  3. Potřebujete vysvětlení ohledně velikosti rezidentní sady/virtuální velikosti