2010-05-19 11 views
5

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?

Odpowiedz

2

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ę.

+0

Link nie działa;/ – kokosing

2

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.

+0

Czy możesz wyjaśnić, co dzieje się podczas korzystania z biblioteki malloc w bibliotece GNU C? – Vaibhav

5

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.