Tcmalloc: Difference between revisions
(Created page with "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; cou...") |
No edit summary |
||
Line 1: | Line 1: | ||
http://pekac.net/alokace_v_tcmallocu.cpp | |||
int main() { | int main() { | ||
Latest revision as of 16:14, 19 November 2019
http://pekac.net/alokace_v_tcmallocu.cpp
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);
}