Tu computadora no solo tiene RAM. Tiene un panorama de memoria desordenado, fragmentado y en constante cambio que la CPU pretende ser infinito. Ésta es la realidad de las estructuras de datos dinámicas que se ejecutan en hardware moderno.
Una estación de trabajo típica hoy en día tiene entre 16 y 64 megabytes de RAM física. Pero no se deje engañar por esas pequeñas cifras. Mediante una técnica llamada memoria virtual, el sistema intercambia datos entre esa RAM y el disco duro. La CPU ve una ilusión. Cree que tiene entre 200 y 500 megabytes de espacio contiguo. La ilusión funciona. El código se ejecuta. Pero cuando el sistema operativo tiene que buscar en el disco duro para buscar una página de memoria, todo se ralentiza. Lo sientes en el retraso. Lo sientes en el giro del ventilador. A pesar del impacto en el rendimiento, la memoria virtual es una forma económica de “expandir” su RAM. Es un compromiso necesario.
Supongamos un borrón y cuenta nueva. Un espacio de memoria total de 50 megas. No más. Nada menos. Este es el presupuesto.
El sistema operativo es propietario de este bloque de 50 megabytes. Divide el pastel. No por igual. Nunca por igual.
Primero, está el código. Las instrucciones ejecutables para cada aplicación que se ejecuta actualmente, además del propio kernel del sistema operativo. Esta sección es estática. No cambia mientras el programa está activo. Luego vienen las variables globales. Estas son las constantes compartidas y las banderas de estado que cada parte de la aplicación puede tocar. Se almacenan en la memoria desde el momento en que se inicia la aplicación hasta que muere.
Luego está la pila.
La pila es rígida. Crece y se reduce al mismo tiempo que las llamadas a funciones. Cuando invocas una función, sus variables y parámetros locales se insertan en la pila. Cuando la función regresa, se eliminan. La pila recuerda el orden de llamada. Le asegura regresar al lugar correcto. Pero tiene un tamaño máximo. No puedes pedirle a la pila más memoria en pleno vuelo. Si lo intentas, la pila se desborda. El programa falla.
Cuando finaliza un programa, el sistema operativo lo descarga. El código, los globales, el espacio de la pila, todo se borra. Esa memoria se recicla. Está listo para el próximo programa.
Pero aquí está el problema. En cualquier momento dado, aproximadamente el 50 por ciento de ese espacio de 50 megabytes podría no utilizarse. ¿Por qué? Porque la pila solo contiene lo que se está ejecutando actualmente. El código sólo contiene las instrucciones. Los fragmentos de memoria no utilizados están dispersos. Son agujeros.
El sistema operativo toma estos agujeros y los agrupa. A este grupo colectivo lo llama el montón.
Aquí es donde ocurre la asignación dinámica. El montón es el único lugar en la memoria donde un programa puede solicitar una cantidad exacta de espacio, precisamente cuando lo necesita. No declaras una matriz de 1000 enteros en el momento de la compilación. No sabes si necesitarás 1.000 o 100.000. Espera. Ejecutas el código. Tú decides que necesitas ese espacio. Luego llamas “malloc”.
malloc significa asignación de memoria. Toma un bloque del montón. Devuelve un puntero. Usas ese puntero. Cuando haya terminado, llame “gratis”. El bloque vuelve a la piscina.
Ésta es la diferencia fundamental entre memoria estática y dinámica. La pila es automática. Está ligado al alcance. El montón es manual. Está ligado a la intención.
¿Por qué te importa esto? Porque la mayoría de los errores en software complejo no provienen de una mala lógica. Provienen de una mala gestión de la memoria. Si realiza la asignación del montón y se olvida de liberarlo, perderá memoria. El montón se reduce. Al final, el sistema se queda sin espacio. Los programas se congelan. El sistema operativo mata procesos. Pierdes el trabajo no guardado.
Por el contrario, si intentas asignar demasiado en la pila, superas el límite de la pila. El programa termina abruptamente.
El montón permite flexibilidad. Permite estructuras de datos que crecen. Listas enlazadas. Árboles. Gráficos. Ninguno de estos se puede definir en tiempo de compilación con un tamaño fijo. Deben construirse sobre la marcha. Deben vivir en el montón.
¿El montón es perfecto? No. Se fragmenta. A medida que asignas y liberas bloques de diferentes tamaños, el montón se convierte en un rompecabezas al que le faltan piezas. Encontrar un bloque contiguo de memoria libre puede resultar lento. Es por eso que “malloc” a veces puede llevar una cantidad considerable de tiempo. Tiene que buscar. Tiene que fusionarse. Tiene que gestionar el caos.
Pero sin el montón, la informática moderna colapsa.


























