2010-05-19 11 views
5

Sto usando malloc_stats() per stampare le statistiche relative a malloc in cui sto trovando "Arena 0" per alcuni programmi e "Arena 0 e Arena 1" per altri programmi.Arena in Malloc Funzione

Cosa rappresentano queste arene?

risposta

2

Vedere link text. Sembra che heap sia una raccolta di arene ("sub-heap") per gestire l'allocazione della memoria tra diversi thread, riducendo così la contesa.

+0

Link non funziona più;/ – kokosing

2

In alcune implementazioni malloc, una "arena" è un pool di memoria da cui vengono effettuate le allocazioni individuali. Gli algoritmi per determinare quale arena è usata differiranno tra le implementazioni, quindi non è possibile per noi spiegare perché vedi una differenza. Un fattore comune è la dimensione dell'allocazione.

+0

Puoi spiegare cosa succede quando usi l'implementazione malloc della libreria GNU C? – Vaibhav

5

Il codice heap risiede all'interno del componente glibc ed è impacchettato nella libreria condivisa libc.so.x. L'attuale implementazione dell'heap utilizza più sotto-heap indipendenti chiamati arene. Ogni arena ha il proprio mutex per la protezione della concorrenza. Quindi se ci sono arene sufficienti all'interno di un heap di un processo e un meccanismo per distribuire l'heap dei thread accede in modo uniforme tra di loro, il potenziale di conflitto per i mutex dovrebbe essere minimo. Si scopre che questo funziona bene per le allocazioni. In malloc(), viene effettuato un test per verificare se il mutex per l'arena target corrente per il thread corrente è libero (trilock). Se è così allora l'arena è ora bloccata e l'allocazione procede. Se il mutex è occupato, ogni arena rimanente viene provata a sua volta e utilizzata se il mutex non è occupato. Nel caso in cui nessuna arena può essere bloccata senza bloccare, viene creata una nuova arena. Questa arena per definizione non è già bloccata, quindi l'allocazione può ora procedere senza bloccare. Infine, l'ID dell'arena usata per ultimo da un thread viene conservata nella memoria locale del thread e successivamente utilizzata come prima arena da provare quando malloc() viene successivamente chiamato da quel thread. Pertanto tutte le chiamate a malloc() procederanno senza bloccare.