int main() { char *p; unsigned s = 0x10000000; // budou se dělat tři bloky po velikost s cout << dec << "výchozí stav: RSS: " << (getRss() / 1024) << " kB" << endl; cout << hex << "sbrk před alokací: " << sbrk(0) << endl; // prvá alokace - standardně přes tcmalloc p = new char[s]; cout << dec << "po alokaci: RSS: " << (getRss() / 1024) << " kB" << endl; cout << hex << "sbrk po alokaci: " << sbrk(0) << endl; // po alokaci se nezvedlo RSS, ale zvětšila se pomocí sbrk velikost datového segmentu memset(p, 0, s); cout << dec << "po memsetu: RSS: " << (getRss() / 1024) << " kB" << endl; // až teď se změnila velikost rss // teď zkusím přímo zvětšit datového segmentu tak jak to dělá tcmaloc - o další velikost s sbrk(s); cout << dec << "po prvém sbrk: RSS: " << (getRss() / 1024) << " kB" << endl; // tady se ale ještě nezvětšilo rss - to s eopět zvětší až když se na tu paměť sáhne // a hned zkusím zapsat na p dvojnásobnou velikost // kdybych nezvětšil datový segment, spadlo by to memset(p, 0, s * 2); cout << dec << "po memsetu * 2: RSS: " << (getRss() / 1024) << " kB" << endl; // opět až po memsetu se zvětší velikost rss // opět ještě jeden posun sbrk sbrk(s); cout << dec << "po druhém sbrk: RSS: " << (getRss() / 1024) << " kB" << endl; memset(p, 0, s * 3); cout << dec << "po memsetu * 3: RSS: " << (getRss() / 1024) << " kB" << endl; // zase totéž jako po provém posunu - po sbrk se ještě rss nezvětšilo, ale až když se na tu paměť sáhlo // takže alokace spočívá v tom, že se pomocí sbrk řekne že chci zvětšit datový segment a pak na tu paměť sáhnu // byly udělány 3 bloky a velikost s za sebou // prvý byl udělán alokací přes tcmalloc // další dva zvětšením datového segmentu pomocí sbrk (tak jak top dělá i tcmalloc) // teď zkusím uvolnit ten druhý blok madvise(p + s, s, MADV_DONTNEED); cout << dec << "po madvise: " << (getRss() / 1024) << " kB" << endl; // po madvise skutečně klesne rss o velikost jednoho bloku // když chci znovu použít tu paměť, stačí na ni opět sáhnout tam, kde v adresním prostoru aplikace byla uvolněna // takže: memset(p + s, 0, s); cout << dec << "po memsetu druhého bloku: RSS: " << (getRss() / 1024) << " kB" << endl; // a rss je zpět na třech blocích return(0); }