2012-07-04 24 views
16

Estoy trabajando en una máquina de pila simple escrita en C, principalmente con fines de aprendizaje. Después de usar malloc/free para mis operaciones de memoria, pensé que sería una buena idea leer algún código específico de asignación de memoria de las máquinas virtuales modernas.¿Cómo manejan las máquinas virtuales modernas la asignación de memoria?

Descargué el código fuente de Lua y comencé a leerlo. Después de un tiempo, me di cuenta de que hay muchas cosas macro implicadas, y no pude encontrar el código donde se realiza la asignación de memoria real (es decir, llamada malloc).

find . -exec grep -i "malloc" '{}' \; -print 

Se imprime sólo algunas macros Lua que tienen malloc palabra en sus nombres. ¡La Lua VM (y el lenguaje de programación) no usa malloc en absoluto!

Esto me lleva a la siguiente pregunta: ¿cómo manejan las máquinas virtuales modernas la asignación de memoria? ¿Cómo asigna Lua la memoria del montón? ¿Hay alguna forma de asignación que no sea malloc? ¿Cuáles son los pros/contras de otros métodos?

También me pregunto acerca de las mejores prácticas, patrones de diseño, etc. para trabajar de forma segura en la memoria asignada. Veo en la fuente de Lua que hay muchos indirectos antes de asignar la memoria. ¿Dónde puedo aprender sobre esto?

+0

¿En qué tipo de máquinas virtuales está interesado? Hay máquinas virtuales que virtualizan computadoras enteras, ya sabes. ¿Estás preguntando sobre esos también? –

+0

@AlexeyFrunze, No, solo me interesan las VM que se usan para lenguajes de programación. – sinan

+0

OK, el título parece confuso. –

Respuesta

14

Lua definitivamente utiliza malloc, en forma de realloc (también se puede pasar un asignador de costumbre también), sin embargo, debido a Lua usa un GC como el 99% de los lenguajes basados ​​en VM, que utiliza las macros para agregar automáticamente el GC bloque de encabezado a la asignación.

Encontrará la memoria de Lua todos manejados por los LuaM_ rutinas en lmem.c y lmem.h, todos éstos utilizan el estado global de la máquina virtual para almacenar un asignador, que se establece inicialmente en l_alloc (de lauxlib.c), pero se puede cambiar por lua_setallocf.

Recientemente, LuaJIT agregó el hundimiento de la asignación y planea algunas funciones de memoria realmente geniales, que puede leer en este artículo en LuaJIT Garbage Collection. El artículo cubre una gran cantidad de estrategia y diseño que giran en torno a la asignación de memoria VM/JIT, hundimiento, agregación y recolección de basura.

Como puede ver, las estrategias de asignación y asignación de memoria están estrechamente relacionadas con el GC que se emplea (si existe).

En cuanto a los pros y los contras de la memoria de varios asignadores, utilizando el estándar malloc es simple de usar, pero a costa de la velocidad y el desperdicio a la alineación y diversos bloques adicionales etiquetados en cada asignación.

Al mover a asignadores más avanzados de arena, piscina, bloque y bloque, podemos acelerar drásticamente las cosas (especialmente para asignaciones de VM internas de tamaño fijo) y evitar una gran fragmentación y sobrecarga con asignadores más generales como malloc, pero por supuesto estos asignadores son más complejos, y debe depurarlos si comienza desde cero (lo que en un sistema más grande como una máquina virtual es simplemente pedir problemas), como se aplicó a la probada implementación de CRT malloc .

+0

Gracias, ¿puedes mostrarme dónde está usando 'malloc', porque como he dicho, no puedo encontrarlo. Estoy planeando rastrear el código de malloc utilizado para comprender mejor las partes internas. – sinan

+0

@sinan: déjalo desenterrar rápido – Necrolis

+0

@sinan: ver mi actualización – Necrolis

5

El núcleo de Lua no usa malloc y sus amigos. Se basa en una función de asignación de memoria proporcionada por el usuario que tiene una semántica similar a realloc (pero es más precisa cuando se tratan punteros NULL y tamaños de 0). Ver lua_Alloc.

La biblioteca auxiliar Lua proporciona un luaL_newstate función de conveniencia que crea un estado Lua través de la función núcleo lua_newstate usando una función de asignación de memoria basado en la norma realloc y free. Otros clientes pueden usar cualquier asignación de memoria adecuada para su aplicación.

Cuestiones relacionadas