Tcmalloc

From VoIPmonitor.org
Revision as of 17:14, 19 November 2019 by Festr (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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);

}