Jo, a jak poznám, kdy mi to odswapuje a kolik to skutečně sežere paměti?
Linux (a další systémy) funguje tak, že používá tzv. virtuální paměť. Každý proces má k dispozici svůj vlastní prostor virtuální paměti – třeba na x86 zařízeních má ta virtuální paměť standardně 4 GB, bez ohledu na to, že máte v počítači třeba jen 256 MB RAM. Operační systém se pak stará o mapování mezi touhle virtuální pamětí procesu a skutečnou RAM. A při tomhle mapování může dělat i to, že data nejsou fyzicky v paměti, ale dostanou se tam až v okamžiku, kdy chce proces k příslušné části paměti přistupovat. Dostat se tam mohou například i z disku – např. ze swapu, kam si je před tím operační systém odložil, když potřeboval fyzickou RAM pro jiné účely, a nebo ze souboru, který tvoří „podklad“ pod pamětí mapovanou
mmapem.
V aplikaci nepoznáte, kdy swapuje nebo načítá soubor z disku / zapisuje na disk (samozřejmě pokud si nebudete měřit čas), operační systém to dělá transparentně na pozadí. Když aplikace chce přistoupit k paměti, která není právě mapovaná na reálnou RAM, ta aplikace se uspí, vyvolá se stránkování, data ze umístí někam do fyzické paměti, ta se namapuje na adresní prostor procesu a proces se probudí. Takže z pohledu procesu to vypadá tak, že dá požadavek na přístup k paměti a data v paměti jsou, akorát kdyby si proces měřil čas, zjistí, že někdy uběhlo hodně času, o kterém nic neví (což ale může nastat i ze spousty jiných důvodů, např. CPU využíval prioritnější proces).
Kolik to skutečně sežere paměti také z procesu nepoznáte. Vtip je právě v tom, že si to celé řídí samotný OS, který má přehled o všech aplikacích v systému. Takže například může data dlouho nechávat v cache, protože ví, že nikdo RAM nepotřebuje, nebo naopak zapíše data do swapu, protože potřebuje RAM uvolnit pro jiný proces.
Co jsi mi chtěl vlastně sdělit konkrétního?
Jak doopravdy funguje
mmap, a že funguje jinak, než si myslíte. Že při použití
mmapu neřídí načítání ze souboru do paměti a zápis z paměti do souboru aplikace, ale operační systém. A že i když má aplikace přes
mmap zpřístupněný celý soubor ve svém virtuálním adresním prostoru (ve virtuální paměti), neznamená to, že je celý ten soubor načtený ve fyzické RAM.