2010-09-04 17 views
8

Una gran cantidad de c/malloc() en un para/while/do puede consumir mucho tiempo, así que tengo curiosidad si algún sistema operativo almacena memoria en memoria intermedia para mallocs rápidos.¿Algún sistema operativo implementa el almacenamiento en búfer para malloc()?

He estado reflexionando si podría acelerar el malloc escribiendo un envoltorio "codicioso" para malloc. P.ej. cuando pido 1MB de memoria, el asignador inicial asignaría 10MB y en el 2º, 3º, 4º, etc. ... llamar a la función malloc simplemente devolvería la memoria del trozo asignado la forma "normal". Por supuesto, si no hay suficiente memoria disponible, deberá asignar un nuevo trozo codicioso de memoria.

De alguna manera, creo que alguien debe haber hecho esto o algo similar antes. Entonces mi pregunta es simple: ¿es esto algo que acelerará significativamente el proceso de asignación de memoria? (Sí, podría haberlo intentado antes de hacer la pregunta, pero soy perezoso para escribir tal cosa si no hay necesidad de hacerlo)

+1

Para aclarar, 'malloc' es parte de la biblioteca en tiempo de ejecución C, no del sistema operativo. Es común que 'malloc', así como los servicios de memoria del sistema operativo, almacenen en caché y almacenan en búfer para acelerar las asignaciones. –

Respuesta

3

Todas las versiones de malloc() almacenan en búfer el tipo que describa hasta cierto punto: tomarán un trozo más grande que la solicitud actual y usarán el gran trozo para satisfacer múltiples solicitudes, pero solo hasta cierto tamaño de solicitud. Esto significa que las solicitudes múltiples de 16 bytes a la vez solo requerirán más memoria de la o/s una vez cada 50-100 llamadas, o algo a lo largo de esas líneas generales.

Lo que está menos claro es cuál es el tamaño del límite. Bien podría ser que asignan un múltiplo relativamente pequeño de 4 KiB a la vez. Las solicitudes más grandes (solicitudes de tamaño de MiB) volverán al sistema para obtener más memoria cada vez que la solicitud no se puede satisfacer desde lo que está en la lista gratuita. Sin embargo, ese umbral suele ser considerablemente más pequeño que 1 MiB.

Algunas versiones de malloc() le permiten ajustar sus características de asignación, en mayor o menor extensión. Ha sido un área fértil de investigación: muchos sistemas diferentes. Ver Knuth 'The Art of Computer Programming' Vol 1 (Algoritmos Fundamentales) para una serie de discusiones.

3

Cuando estaba navegando el código Google Chrome hace algún tiempo, encontré http://www.canonware.com/jemalloc/ . Es una implementación malloc gratuita, de uso general y escalable.

Aparentemente, se está utilizando en numerosos proyectos, ya que generalmente supera las implementaciones estándar de malloc en muchos escenarios del mundo real (muchas asignaciones pequeñas en lugar de pocas grandes).

¡Definitivamente vale la pena mirar!

-2

Lo que dices es probablemente hecho, realmente no lo sé. Sin embargo, no sé si la latencia en el almacenamiento de su malloc() en el nivel del sistema disminuiría mucho la latencia. Todavía tienes que tomar el tiempo para entrar en priv. modo para una llamada al sistema, potencialmente bloquear las estructuras a nivel del kernel (lo que significa más llamadas al sistema y ESPERAR las cerraduras) y cosas de esa naturaleza.

Si puede escribir su propio administrador de memoria en el espacio de usuario para su programa y solo llama a malloc() cuando necesita más memoria para su grupo, es probable que vea una disminución en la latencia.

+0

las implementaciones malloc * están * en modo usuario, porque están en el tiempo de ejecución de C. Incluso la implementación de HeapAlloc de Windows está en modo de usuario. –

+1

@Paul, eso LARGAMENTE depende del sistema operativo. No sería tan rápido para generalizar. ¿Estás confundiendo mi afirmación de que Malloc debe llamar a las funciones de nivel priv. Con decir que malloc se ejecuta en el espacio del kernel? Por ejemplo, muchas implementaciones malloc se basan en mmap en sistemas POSIX. mmap requiere soporte a nivel kernel para operar. –

+1

Su mensaje para mí implica que malloc en sí mismo es un syscall ... –

2

Esa técnica se llama Slab Allocator, y la mayoría de los sistemas operativos lo admiten, pero no puedo encontrar la información que está disponible para el espacio de usuario malloc, solo para las asignaciones del kernel.

Puede encontrar el artículo de Jeff Bonwick here, que describe la técnica original en Solaris.

+0

GLib tiene una losa - http://library.gnome.org/devel/glib/stable/glib-Memory-Slices.html pero más a menudo glibc malloc es mejor. –

1

Google tiene una implementación codiciosa de malloc() que hace aproximadamente lo que estás pensando. Tiene algunos inconvenientes, pero es muy rápido en muchos casos de uso.

Cuestiones relacionadas