Doom Wiki
Doom Wiki

El sistema de Zona memoria es un asignador de memoria interno utilizado por Doom para la gestión de memoria. Debido a la tecnología existente en el momento de la liberación de Doom, la asignación de memoria era considerada una operación costosa. Es de suponer que, debido a las deficiencias de las funciones de gestión de memoria disponibles en DOS en el momento de desarrollo de Doom, el juego incluye su propio asignador de memoria.

En un programa C_%28lenguaje_de_programaci%C3%B3n%29 C normal, la memoria se asigna y desasigna utilizando las funciones C malloc y free. El código de Zona de memoria contiene sus propias implementaciones de estos, llamados Z_Malloc y Z_Free.

En lugar de llamar a las rutinas de gestión de memoria de bajo nivel como sbrk, montones de zona asignan un solo, grande y continuo bloque de RAM usando el malloc normal del sistema al comienzo de la ejecución y luego dividen este gran bloque en otros más pequeños, manteniendo todos los bloques vinculados juntos en una lista. Cuando dos o más bloques libres se tocan entre sí, los bloques se combinan en uno solo para mantener la longitud de la lista corta. Esto ayuda a mantener los tiempos de búsqueda de un bloque libre de memoria más corta y evita la fragmentación externa innecesaria (si los bloques son demasiado pequeños, no se asignará ningún futuro puede ser capaz de encajar en ellos).

Tiempos de asignación de dominio específico[]

La función Z_Malloc difiere de la función C malloc en que incluye soporte para etiquetas. Cada pieza de la memoria tiene una etiqueta especial que indica su propósito y determina su tiempo de vida de la asignación. Bloques de memoria son tratadas de manera diferente de acuerdo a sus etiquetas.

La etiqueta más simple es la etiqueta PU_STATIC que especifica un trozo de memoria que debe ser desasignado explícitamente con la función Z_Free. Desde el punto de vista de un programador, utilizando las funciones de esta forma es idéntica a la utilización de las funciones de memoria de C. Más interesante es la etiqueta PU_CACHE. La memoria asignada con esta etiqueta puede ser liberada automáticamente al sistema si se queda sin memoria. De esta manera, es posible el almacenamiento en caché de datos de archivo WAD. Es común, por ejemplo, para cargar datos de un recurso WAD con la etiqueta PU_STATIC, y cuando las operaciones en que los datos se han completado, cambiar la etiqueta de la zona de memoria (utilizando la función Z_ChangeTag) para PU_CACHE. Si el sistema tiene poca memoria, los datos pueden ser liberados, pero por lo demás se guardarán en la memoria para uso futuro. El código de carga WAD interactúa con el sistema de zona de memoria para proporcionar esta capacidad, y fue sobre todo importante en Doom como un medio para reducir el tiempo de lectura de disco.

La otra etiqueta interesante es la etiqueta PU_LEVEL. Toda la memoria relacionada con el nivel de juego actual se asigna con la etiqueta PU_LEVEL. Cuando el nivel de salidas, la zona de memoria se busca y todas las piezas de la memoria asignados con esta etiqueta son liberados. Esto alivia la carga de tener que liberar individualmente cada pieza de la memoria relacionada con el nivel. Es posible que esto se inspirara en el recolector de basura proporcionada por Objective C (Doom fue desarrollado en máquinas NeXT que utilizaron Objective C, y el editor original de Doom fue escrito en ella).

Anécdotas[]

El archivo z_zone.h en el código fuente de Doom contiene una anécdota que John Carmack considera el sistema de zona de memoria en Doom "la única cosa que podría haber sido útil para Quake". Si bien es de hecho utilizado en el motor de Quake, en una forma modificada, el código WAD se utilizó, además, como base para los archivos PAK de Quake.

El asignador de zona se ha mejorado enormemente en la portación (source port) Boom. Lee Killough comentó en el archivo z_zone.c que si bien estaba ordenado, sólo era lo suficientemente limpio para ser reescrito.