Řešení 1:
Ve zkratce:
-
Virtuální velikost: je množství adresového prostoru, který proces spravuje. Virtuální adresní prostor obsahuje vše, k čemu má proces přístup prostřednictvím ukazatelů (odkazů na adresy paměti). Pokud například váš program získá přístup k framebufferu vaší grafické karty, tato paměť je namapována na virtuální prostor procesu a obdrží adresu, která je uložena do ukazatele. Do velikosti virtuálního adresního prostoru se započítávají také soubory mapované v paměti a anonymní mapování. Téměř vše je ve virtuální velikosti. Pokud sečtete velikost všech rozsahů adres uvedených v
/proc/<pid>/maps
, měl by vám vrátit zhruba stejnou hodnotu virtuální velikosti. -
Rezidentní velikost: je množství paměti, která patří konkrétně tomuto procesu, který je aktuálně uložen v paměti. To znamená množství paměti, která není ve swapu. Všimněte si, že části procesu mohou být ve swapovací paměti, i když je proces spuštěn. Operační systém vytáhne tyto oblasti ze swapu, když se k nim proces pokusí získat přístup. To by mělo zahrnovat haldu, zásobníky všech vláken a další soukromá mapování. Pokud se podíváte do
/proc/<pid>/maps
,[stack]
,[heap]
a další anonymní mapování (ta, která nemají cesty k souborům) jsou buď zaměněna nebo započítána do rezidentní velikosti. -
Sdílená velikost: je množství paměti, které může patřit více procesům. Pokud máte například v paměti načteny čtyři instance stejné aplikace, budete mít čtyři instance haldy a alespoň čtyři zásobníky, jednu pro každý proces (toto je rezidentní paměť), ale budete mít pouze jednu instanci binární kód programu a jeho knihoven. Toto je sdílený prostor. Zahrnuje nejen binární kód programu a jeho knihovny, ale také lokalizační soubory, data programu pouze pro čtení, segmenty sdílené paměti SysV a POSIX, semafory atd... Pokud se podíváte do
/proc/<pid>/maps
, většina mapování vázaných na soubory knihovny a programu je sdílena.
Všimněte si, že VIRT obsahuje spojení RSS a SHR a bude vždy větší než kterýkoli z nich. Mohou existovat oblasti účtované jako RSS i SHR.
Řešení 2:
Odpověď In Juliano:
Pamatujte, že RSS + SHR <=VIRT, vždy.
To je jen nepravda. SHR obsahuje veškerou virtuální paměť, kterou lze sdílet s jinými procesy, a RSS obsahuje veškerou paměť fyzicky v RAM, kterou proces používá.
Veškerá sdílená paměť, která je aktuálně v RAM, se tedy počítá jak v SHR, tak v RSS, takže SHR + RSS nemá žádný význam, protože může obsahovat duplicitní počty.
Chcete-li vytvořit proces s RSS + SHR> VIRT, stačí mmapovat velký soubor (1 GB) a poté si jej celý přečíst:soubor s mapováním bude načten do RAM a VIRT, SHR a RSS bude každý o něco větší než 1 GB, takže SHR + RSS> VIRT.