2010-05-19 9 views
5

Estoy utilizando malloc_stats() para imprimir estadísticas relacionadas con malloc en las que encuentro "Arena 0" para algunos programas y "Arena 0 y Arena 1" para algunos otros programas.Arena en Malloc Función

¿Qué representan estas arenas?

Respuesta

2

Ver link text. Parece que heap es una colección de arenas ("sub-montones") para manejar la asignación de memoria entre varios subprocesos, lo que reduce la contención.

+0

El enlace ya no funciona;/ – kokosing

2

En ciertas implementaciones de malloc, una "arena" es un conjunto de memoria a partir del cual se realizan las asignaciones individuales. Los algoritmos para determinar qué campo se usa diferirán entre las implementaciones, por lo que no es posible que expliquemos por qué notamos una diferencia. Un factor común es el tamaño de la asignación.

+0

¿Puede explicar con qué sucede cuando se utiliza la implementación malloc de la biblioteca C de GNU? – Vaibhav

5

El código de montón reside dentro del componente glibc y está empaquetado en la biblioteca compartida libc.so.x. La implementación actual del montón utiliza múltiples sub-montones independientes llamados arenas. Cada arena tiene su propio mutex para protección de concurrencia. Por lo tanto, si hay suficientes arenas dentro de un montón de procesos, y un mecanismo para distribuir los accesos de heap de los subprocesos de manera uniforme entre ellos, entonces el potencial de contención para los mutex debe ser mínimo. Resulta que esto funciona bien para las asignaciones. En malloc(), se realiza una prueba para ver si el mutex para la arena de destino actual para el hilo actual es libre (trylock). Si es así, la arena ahora está bloqueada y la asignación continúa. Si el mutex está ocupado, cada arena restante se intenta por turno y se usa si el mutex no está ocupado. En caso de que no se pueda bloquear ninguna arena sin bloquear, se crea una nueva arena. Este campo, por definición, no está bloqueado, por lo que la asignación ahora puede continuar sin bloquear. Por último, la ID de la arena usada por última vez por un hilo se retiene en el almacenamiento local de la secuencia y, posteriormente, se utiliza como la primera arena para probar cuando malloc() es llamado a continuación por ese hilo. Por lo tanto, todas las llamadas a malloc() continuarán sin bloqueo.