Używam malloc_stats() do drukowania statystyk związanych z malloc, w których znajduję "Arena 0" dla niektórych programów i "Arena 0 i Arena 1" dla niektórych innych programów.Arena w funkcji Malloc
Co reprezentują te areny?
Używam malloc_stats() do drukowania statystyk związanych z malloc, w których znajduję "Arena 0" dla niektórych programów i "Arena 0 i Arena 1" dla niektórych innych programów.Arena w funkcji Malloc
Co reprezentują te areny?
Zobacz link text. Wygląda na to, że sterty to zbiór aren ("poddźwięków") do obsługi alokacji pamięci między kilkoma wątkami, co ogranicza rywalizację.
Wszystko jest tam: http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html
int arena
Jest to łączna wielkość pamięci przydzielonej przez malloc z sbrk w bajtach.
W niektórych implementacjach malloc "arena" to pula pamięci, z której tworzone są indywidualne przydziały. Algorytmy określające, która arena jest używana, będą różne w różnych implementacjach, więc nie możemy wyjaśnić, dlaczego widzisz różnicę. Jednym z powszechnych czynników jest wielkość alokacji.
Czy możesz wyjaśnić, co dzieje się podczas korzystania z biblioteki malloc w bibliotece GNU C? – Vaibhav
Kod sterty znajduje się wewnątrz komponentu glibc i jest spakowany w bibliotece współużytkowanej libc.so.x. Obecna implementacja sterty wykorzystuje wiele niezależnych pod-stert zwanych arenami. Każda arena ma swój własny muteks do ochrony przed współbieżnością. Jeśli więc istnieje wystarczająca ilość aren w obrębie stosu procesu, a mechanizm rozdzielający stos wątków uzyskuje dostęp równomiernie między nimi, wówczas potencjał do rywalizacji o muteksy powinien być minimalny. Okazuje się, że działa to dobrze dla przydziałów. W malloc() test jest sprawdzany, czy muteks dla bieżącej docelowej areny dla bieżącego wątku jest wolny (trylock). Jeśli tak, to arena jest teraz zablokowana i alokacja przebiega. Jeśli muteks jest zajęty, wówczas każda pozostała arena jest próbowana po kolei i używana, jeśli muteks nie jest zajęty. Jeśli żadna arena nie zostanie zablokowana bez blokowania, powstaje nowa, nowa arena. Arena ta z definicji nie jest już zablokowana, więc alokacja może teraz przebiegać bez blokowania. Wreszcie, identyfikator areny ostatnio używanej przez wątek jest zachowywany w lokalnej pamięci wątku, a następnie używany jako pierwsza arena do wypróbowania, gdy malloc() jest następnie wywoływany przez ten wątek. Dlatego wszystkie wywołania malloc() będą kontynuowane bez blokowania.
Link nie działa;/ – kokosing