Versión 3.0

800x600 mínimo
En esta lección:

La memoria de la computadora
-----


Otras secciones:

Conceptos básicos
-----
Programando en C
-----
Programando en C++
-----
Programando Windows 9x.
-----
Teoría electrónica
-----
Circuitos electrónicos
-----
Actividades adicionales
-----
Hipervínculos
-----


Contácteme:

Dudas y comentarios
-----


Hola mundo

La memoria de la computadora

El area completa de la figura 1 representa la memoria de una computadora, incluyendo el area a la derecha que parece una escalera. Todo el código ejecutable y todas las variables de un programa dado se almacenan dentro del area ilustrada en la figura, la pregunta es, ¿Cómo se almacenan los diversos elementos en éste espacio?

La memoria de la computadora

Existen tres areas de memoria que tienen facultades especiales asignadas por el compilador y el enlazador, éstas son:

  • Stack: El area que semeja una escalera en la parte derecha del diagrama es el stack. El stack está asignado por el sistema a un tamaño fijo y se rellena conforme se necesita de la parte inferior a la superior, un elemento a la vez. Los elementos se remueven de la parte superior a la parte inferior, un elemento a la vez, o sea, el último elemento agregado es el primer elemento eliminado cuando ya no sea necesario.

  • Heap: Esta es el area en el diagrama identificada con el nombre heap, es asignada por el sistema a un tamaño fijo y la utiliza el mismo conforme sea necesario en una forma aleatoria, esto no significa que exista un cierto desorden en la manera en que la memoria es utilizada, significa que la memoria no se asigna en un orden particular. De hecho, puede ser asignada en bloques conforme sea necesario en cualquier lugar dentro del heap. Cualquier memoria dentro del heap que no esté actualmente asignada para utilizarse por el programa es almacenada en una "lista libre", esto es, bloques de memoria en espera de asignación.

  • Memoria global: Es la memoria en la máquina que no está asignada al stack ó al heap.

¿Cómo se asigna la memoria global?

Tanto el bloque de código main ( ) del programa como las funciones requeridas por el mismo se almacenan el algún lugar de la memoria global. Aunque el sistema asignará los diversos bloques de código en una forma ordenada, asumiremos que no son asignados en un orden particular, de hecho, deberíamos suponer que los bloques son asignados aleatoriamente por toda el area de almacenamiento global y que cualquier función particular no está contigua a otra.

Variables globales

De interés especial son los pequeños bloques de la parte superior de la figura 1 porque representan variables globales las cuales se almacenan en el espacio global, el sistema reserva suficiente memoria para almacenar la variable en cuestión y asigna tal memoria para la variable. La variable global existe durante toda la vida del programa en ejecución.
Observe que una variable de tipo char por lo general utiliza sólo un byte de almacenamiento, en cambio una variable double utilizará 8 bytes de almacenamiento, por lo tanto, la caja etiquetada como variable puede almacenar un tipo char, int, double o cualquier otra variable simple y el sistema garantiza el suficiente espacio para almacenar la entidad solicitada, aunque en el diagrama las cajas son del mismo tamaño, en la memoria física de la computadora tendrán tamaños variables.

Un puntero global

La caja etiquetada puntero tiene la habilidad de almacenar punteros de cualquier tipo. Los punteros generalmente son del mismo tamaño para todos los tipos de datos en una determinada combinación de hardware y sistema operativo, por lo que probablemente se les asigne la misma cantidad de bytes. El punto es una convención para representar gráficamente a los punteros, y cuando no incluye una flecha como en la figura, el puntero no ha sido asignado para señalar algo en particular, de hecho puede contener un valor indeterminado aunque por definición, un puntero global es inicializado automáticamente a NULL. Cualquier número de punteros y variables pueden ser almacenados en la memoria global hasta el límite físico de la memoria disponible.

¿Cómo se utiliza el stack?

Cuando las variables ó los punteros son requeridos por el sistema, éstos serán asignados secuencialmente al stack empezando por la parte inferior siendo cada elemento sucesivo "apilado" (encimado) en el anterior. Cada caja en el diagrama representa un espacio de almacenamiento para una variable dada de la misma manera que se describió para la memoria global, el sistema se encarga de determinar la cantidad precisa de bytes necesarios para una variable dada, sin embargo, cuando un programa no necesita más la variable almacenada en stack, el espacio ocupado debe ser liberado para permitir que otros programas utilizen el espacio disponible. Piense en el stack como un vaso con agua, conforme vamos requiriendo espacio de stack, vamos llenando el vaso, conforme liberamos espacio del stack, vamos vaciando de agua el vaso. El vaso por supuesto tiene un límite, el stack también.

¿Cómo se utiliza el heap?

El heap es un bloque contiguo de memoria que está disponible para utilizarse por cualquier parte del programa siempre que sea necesario. Cuando un programa solicita un bloque de datos, el esquema de asignación dinámica sustrae un bloque del heap y lo asigna al usuario retornando un puntero que señala al principio del bloque. Cuando el sistema termina de utilizar el bloque, lo regresa al heap donde a su vez es colocado en la pila de memoria disponible llamada la lista libre. A esto se le llama desasignación.

En éste breve capítulo hemos hecho una exposición general de la memoria de la computadora, existen otros temas relacionados, como la memoria virtual, memoria caché, registros y otros más. Estudiaremos algunos de ellos conforme avancen los temas disponibles en los tutoriales de C, C++ y Windows 9x, particularmente en éste último caso es interesante conocer el manejo de la memoria y la forma de cómo hacer un uso efectivo de la misma.

Volver al principio

Hola mundo

© 1998, 1999 Virgilio Gómez Negrete, Derechos Reservados