2010-07-09 20 views
5

Estaba pasando por algunas de las decisiones tomadas para hacer Xara Xtreme, una aplicación de gráficos SVG de código abierto. Su decisión de administración de memoria fue bastante intrigante para mí, ya que ingenuamente di por sentado que la asignación dinámica bajo demanda era la forma de escribir aplicaciones orientadas a objetos.¿En qué situaciones la asignación estática es mejor que la asignación dinámica?

La explicación de la documentación es

¿Cómo en la tierra puede ser estática asignaciones eficiente?

Si está acostumbrado a grandes estructuras de datos dinámicos, esto puede parecerle extraño . En primer lugar, todos nuestros objetos (y así tamaño de asignación) son mucho más pequeños (en promedio) que cada asignación de área dinámica dentro de un programa como Impresión. Esto significa que aunque es probable que haya muchos agujeros dentro de la memoria, son pequeños. Además, tenemos mucho más objetos asignados dentro de la memoria, y así estos agujeros se llenan rápidamente. Por otra parte, administradores de memoria virtuales liberará cualquiera de las páginas de la memoria que no contienen asignaciones y dar a esta memoria de nuevo al sistema operativo para que pueda ser utilizado de nuevo (ya sea por nosotros o por otra tarea).

Nos beneficiaría enormemente de el hecho de que cada vez que asignamos la memoria de esta manera, no tenemos para mover cualquier memoria acerca. Esto probó un cuello de botella en ArtWorks que también se usó muchas pequeñas asignaciones al mismo tiempo. more

En resumen, la presencia de un montón de objetos pequeños y la necesidad de prevenir movimiento memoria son las razones dadas para la elección de la asignación estática. No entiendo bien las razones mencionadas.

Aunque esto se refiere a la asignación estática, lo que veo en el vistazo superficial es que un bloque de memoria se asigna dinámicamente al inicio de la aplicación y se mantiene activo hasta que finaliza la aplicación, simulando aproximadamente la asignación estática.

¿Podría explicar en qué situaciones la asignación estática es mejor que la asignación dinámica bajo demanda para considerarlo como el modo principal de asignación en aplicaciones serias?

Respuesta

2

Es más rápido porque evita la sobrecarga de llamar a una rutina del sistema para administrar su almacenamiento. malloc() mantiene un montón, por lo que cada solicitud requiere un escaneo para un bloque del tamaño adecuado, posiblemente cambiar el tamaño del bloque, actualizar la lista de bloqueo para marcar este bloque como se usa, etc. Si está asignando una gran cantidad de objetos pequeños, esta sobrecarga puede ser excesivo Con la asignación estática puede crear un grupo de asignación y simplemente mantener un mapa de bits simple para mostrar qué áreas están en uso. Esto supone que cada objeto tiene el mismo tamaño, por lo que normalmente crea un grupo por tipo de objeto.

+0

Gracias. Ahora veo que el patrón de grupo de objetos es la técnica utilizada en Xara Xtreme. http://en.wikipedia.org/wiki/Object_pool_pattern – rpattabi

1

En resumen, no existe la asignación estática que no sea el espacio asignado para sus funciones y otros tipos de memoria de solo lectura. (Realice un "gcc -S" solo de montaje y busque todos los bloques de memoria, si le interesa). Si está creando y rompiendo objetos, está asignando dinámicamente. Dicho esto, no hay nada que le impida controlar estrictamente el mecanismo de asignación en sí.

Eso es lo que funciones como mallinfo() y mallopt() hacen para controlar cómo malloc() hace su magia. Sin embargo, eso podría no ser lo suficientemente bueno para ti. Si sabe que todos sus fragmentos van a tener el mismo tamaño, puede asignar y desasignar de manera mucho más eficiente. Y si sabes que tienes 3 tamaños de cosas, puedes mantener 3 arenas de memoria cada una con su propio asignador.

Además de esto, tiene la situación en tiempo de ejecución donde el proceso no tiene suficiente espacio y necesita pedir más al sistema operativo, lo que implica una llamada al sistema que es más costosa que simplemente incrementar un índice de matriz. En Unix, generalmente es brk() o sbrk() o similar. Y eso puede tomar un tiempo valioso.

Otra situación, más rara, sería si necesita multiplicar-asignar cosas. Al igual que 3 hilos, necesitan compartir información y solo cuando se liberan los 3, se libera. Eso es algo no estándar y generalmente no está cubierto por mallopt típico() o incluso por la memoria específica de subprocesos o trozos bloqueados por mutex/semáforo.

Así que si tiene problemas de optimización de alta velocidad o está ejecutando un sistema integrado donde necesita exprimir todo lo que puede de la memoria disponible, entonces la "asignación estática" o al menos controlar el mecanismo de asignación puede ser el camino a seguir.

+0

Gracias por los detalles. – rpattabi

Cuestiones relacionadas