Ahoj,
Zajímalo by mne, jakým způsobem se na Linuxu nebo BSD řeší stav, kdy proces 1) alokuje anonymním mmap()em hodně adresového prostoru (řekněme 1GB) 2) z velké míry >50% ho využije, čímž vznikne >512MB dirty stránek 3) program naráz (třeba po GC) zjistí že 90% stránek, které používal je nyní FREE.
Existuje nějaká efektivní metoda, jak OSu oznámit že tyto stránky není nutno swapovat, ale že je lze prostě zahodit?
Celou arenu odalokovat nemohu, protože stále obsahuje nějaké živé stránky, zkopírovat je do nové areny také nechci, protože by se hnulo s adresama.
Když na jednotlivé free stránky zavolám unmap(), odmapuje se pouze ta jedna stránka v rámci původního segmentu, nebo se tím ten segment splituje?
Diky, to je presne ono. Na Linuxu je to taky. Ale lepsi bude MADV_DONTNEED, protoze chci aby prvni pristup udelal zero-fill-on-demand, nikoliv segfault.
Ted jeste jak zjistit nejlepsi okamzik pro spusteni GC cyklu v aplikaci. Jak zjistim (s jistym predstihem), ze kernelu dochazi pamet, a chysta se swapovat?
MADV_DONTNEED: Do not expect access in the near future. (...) the kernel can free resources (...) accesses (...) will succeed, but (...) zero-fill-on-demand for mappings without an underlying file.
MADV_FREE: Na Linuxu v mman.h vubec neni, pri takovemto chovani MADV_DONTNEED zrejme ani neni potreba.