El típico malloc
(para la plataforma x86-64 y el sistema operativo Linux) bloquea ingenuamente un mutex al principio y lo suelta cuando termina, o bloquea un mutex de una manera más inteligente en un nivel más fino, de modo que la contención del bloqueo es ¿reducido? Si de hecho lo hace de la segunda manera, ¿cómo lo hace?¿Cómo funciona malloc en un entorno multiproceso?
Respuesta
glibc 2.15
opera la asignación múltiple arenas. Cada arena tiene su propio candado. Cuando un subproceso necesita asignar memoria, malloc()
elige una arena, la bloquea y asigna memoria desde allí.
El mecanismo para la elección de un escenario es un tanto complicado y tiene como objetivo reducir la contención de bloqueo:
/* arena_get() acquires an arena and locks the corresponding mutex.
First, try the one last locked successfully by this thread. (This
is the common case and handled with a macro for speed.) Then, loop
once over the circularly linked list of arenas. If no arena is
readily available, create a new one. In this latter case, `size'
is just a hint as to how much memory will be required immediately
in the new arena. */
Con esto en mente, malloc()
básicamente se parece a esto (editado por brevedad):
mstate ar_ptr;
void *victim;
arena_lookup(ar_ptr);
arena_lock(ar_ptr, bytes);
if(!ar_ptr)
return 0;
victim = _int_malloc(ar_ptr, bytes);
if(!victim) {
/* Maybe the failure is due to running out of mmapped areas. */
if(ar_ptr != &main_arena) {
(void)mutex_unlock(&ar_ptr->mutex);
ar_ptr = &main_arena;
(void)mutex_lock(&ar_ptr->mutex);
victim = _int_malloc(ar_ptr, bytes);
(void)mutex_unlock(&ar_ptr->mutex);
} else {
/* ... or sbrk() has failed and there is still a chance to mmap() */
ar_ptr = arena_get2(ar_ptr->next ? ar_ptr : 0, bytes);
(void)mutex_unlock(&main_arena.mutex);
if(ar_ptr) {
victim = _int_malloc(ar_ptr, bytes);
(void)mutex_unlock(&ar_ptr->mutex);
}
}
} else
(void)mutex_unlock(&ar_ptr->mutex);
return victim;
Este asignador se llama ptmalloc
. Se basa en earlier work por Doug Lea, y es mantenido por Wolfram Gloger.
Doug Lea's malloc
utilizaba el bloqueo gruesa (o sin bloqueo, dependiendo de los ajustes de configuración), en el que cada llamada a malloc
/realloc
/free
está protegido por un mutex global. Esto es seguro pero puede ser ineficiente en entornos altamente multiproceso.
ptmalloc3
, que es la implementación predeterminada malloc
en la biblioteca GNU C (libc) utilizado en la mayoría de los sistemas Linux en estos días, tiene una estrategia más de grano fino, como se describe en aix's answer, que permite que múltiples hilos para asignar simultáneamente memoria de forma segura .
nedmalloc
es otra implementación independiente que asegura un rendimiento de subprocesos incluso mejor que ptmalloc3
y varios otros asignadores. No sé cómo funciona, y no parece haber ninguna documentación obvia, por lo que tendrá que verificar el código fuente para ver cómo funciona.
Todavía estoy indeciso sobre si nedmalloc es una hazaña de ingeniería real o spam SEO ... :-) –
también tcmalloc de google que utiliza bloqueos en cubos del tamaño de su solicitud. Mejor rendimiento de subprocesos con menos contención, más asignación excedente. –
@R ..: Parece un poco sospechoso a primera vista, pero tiene un código fuente para que pueda compararlo usted mismo (no lo he hecho). Doug Lea también dice "Si está utilizando malloc en un programa simultáneo, considere usar nedmalloc o ptmalloc" en los comentarios de 'dlmalloc.c'. Entonces creo que es probablemente legítimo. –
- 1. Rendimiento de Malloc en un entorno multiproceso
- 2. siguientes puntos en un entorno multiproceso
- 3. ¿Cómo funciona malloc?
- 4. Hashmap y hashtable en el entorno multiproceso
- 5. Guardia Malloc no funciona
- 6. Problema de concurrencia de inserción - Entorno multiproceso
- 7. ¿Obtener Id después de un INSERT en SQL Server en un entorno multiproceso?
- 8. ¿Mejores formas de escribir un método que actualice dos objetos en un entorno Java multiproceso?
- 9. ¿Cómo malloc char ** tabla?
- 10. En multiproceso C/C++, hace malloc/new bloquear el montón al asignar memoria
- 11. ¿Cómo se implementa malloc() internamente?
- 12. Malloc en C++ constructor
- 13. Cómo liberar() un malloc() 'd estructurado correctamente?
- 14. Diferencia de rendimiento para multiproceso y multiproceso
- 15. Compilación de un Malloc personalizado
- 16. ¿Cómo es ASP.NET multiproceso?
- 17. C - Devolver un puntero char sin malloc
- 18. LD_PRELOAD solo funciona para malloc, no es gratuito
- 19. malloc implementation?
- 20. variable de entorno CMAKE_INSTALL_PREFIX - ¿no funciona?
- 21. malloc en kernel
- 22. El multiproceso de Python no funciona muy bien con uuid.uuid4()
- 23. Malloc en constructores
- 24. Patrón de observador multiproceso
- 25. Dibujo multiproceso en .NET?
- 26. tenedor en el programa multiproceso
- 27. Función Malloc en C++
- 28. alineado malloc() en GCC?
- 29. Arena en Malloc Función
- 30. ¿Cómo entiende malloc la alineación?
¿Cuál es el contexto donde has visto eso? ¿Algún código o referencia entre comillas? – Raulp
suavemente: estoy preguntando, sin decir nada. – pythonic
Tengo que comentar que hay mejores alternativas a malloc cuando utilizo un entorno multihilo, use google –