12/3/10

SEGUNDA PARTE TALLER 1: Taller teótico asignación de memoria

1.  1. ¿En que zonas de la organización del computador se almacenan las variables globales y las locales?. (Pista: recuerde el comienzo de la clase, cuando se explicó de donde salían los punteros, el segmento de código, el segmento de pila, el segmento de datos, el segmento extra...)

Durante la ejecución de un programa, se utilizan varias zonas de memoria bien diferenciadas por su cantidad según el tipo de dato que almacenen, para guardar los parámetros, las variables locales, globales, el código, etc. Son la pila de llamadas (call stack), que puede variar de tamaño durante la ejecución porque guardan objetos que son conocidos en runtime; el área de datos dinámicos, también conocida como el montón local (“local heap”), el área de datos estáticos y el área de código. Cuando se realiza un programa compilado compuesto de varias funciones (o métodos, si estamos utilizando un lenguaje orientado a objetos), los compiladores traducen cada función y su contenido a código máquina dependiente de la plataforma. Cuando se inicia la ejecución de dicho programa, el sistema operativo carga el código ejecutable en una zona de memoria que esté libre, y además, reserva al menos dos espacios más de memoria para que el programa pueda ejecutarse, y almacenar allí los datos que necesite: son el stack y el heap. Para el caso de las variables globales, se reserva además una tercera zona llamada zona de datos ó área de datos, las cuales permanecen constantes en tamaño a lo largo de la vida del programa, precisamente porque aquí se guardan variables y constantes cuyo tamaño es conocido en tiempo de compilación. En el caso del montón, puede ocurrir que en tiempo de ejecución el proceso demande más memoria para datos persistentes, espacio que más adelante puede ser liberado de nuevo. Tanto en el caso de pila como en el del heap, el tamaño de estas zonas puede aumentar y disminuir, y consecuentemente, la memoria total demandada al Sistema por el proceso en ejecución. En ésta organización en subzonas no necesariamente continuamente (puede que lo sean), que constan de características particulares y distintas en función del tipo de dato y cómo son manejados por el programa. La subzona que le corresponde a un dato concreto depende de que el dato sea conocido en tiempo de compilación o en runtime y de que el dato sea estático o se destruya cuando el programa sale del bloque en que fue definido (automático).
Supongamos que vamos a ejecutar un programa, y en un momento dado sólo está cargado el sistema operativo en la memoria principal.

Cuando le pedimos al sistema operativo que ejecute el programa, se carga el código ejecutable en una zona libre de la memoria, y el sistema operativo, además, reserva:
·         Una zona de datos para las variables globales y las constantes. Como en runtime se conocen perfectamente las variables globales y las constantes, se reserva el espacio necesario. Además, aquellas variables globales que sean inicializadas a un valor concreto y también las constantes, se les puede dar valor cuando se reserva la zona de datos.
·         Una zona para las llamadas (stack) que almacenará los parámetros de las funciones, las variables locales y los valores de retorno de las funciones (o métodos).
·         Una zona para la gestión dinámica de memoria (el heap). Es decir, aquella memoria que se solicita durante la ejecución del programa.

En resumidas cuentas, las globales se almacenan en el espacio reservado para el programa,
mientras que las locales en el espacio reservado para la función en la
que está contenida.
2.    2. En C++, ¿donde se almacena la memoria que se asigna dinámicamente?

Se asigna en un “Montón Local” (“Local heap”), el cual es un área fija de memoria, asignada en runtime por las rutinas de inicio antes de que comience la ejecución de main. Por ejemplo, cuando pedimos al programa que asigne memoria mediante malloc, o cuando creamos un nuevo objeto con el operador new. Las asignaciones de memoria del montón son generalmente más lentas que las de pila. Además los objetos situados en esta área tienden a ser persistentes; se mantienen hasta que el programador decide su destrucción, con la liberación consiguiente de la memoria previamente asignada; por ejemplo con una llamada al destructor de una clase, la función free o la palabra delete.
La zona de la memoria principal del computador donde se reservan espacios para asignarlos a variables dinámicas se denomina heap o montón. Cuando el sistema operativo carga un programa para ejecutarlo y lo convierte en proceso, le asigna cuatro partes lógicas en memoria principal: instrucciones, datos (estáticos), pila y una zona libre. Esta zona libre (heap) es la que va a contener los datos dinámicos. En cada instante de la ejecución del programa, el heap tendrá partes asignadas a datos dinámicos y partes libres disponibles para asignación de memoria, como puede observarse en la figura 2.1. El mecanismo de asignación-liberación de memoria durante la ejecución del programa hace que esta zona esté usualmente fragmentada (ver figura 2.1), siendo posible que se agote su capacidad si no se liberan las partes utilizadas ya inservibles. (La pila también varía su tamaño dinámicamente, pero la gestiona el sistema operativo, no el programador.)
3.    3. ¿Qué es el desbordamiento de memoria?

         Es un error de software que se produce cuando se copia una cantidad más grande de datos sobre un área más pequeña sin interrumpir la operación sobreescribiendo otras zonas de datos no previstas. Esto puede suponer la posibilidad de alterar el flujo del programa pudiendo hacer que este realice operaciones imprevistas.

4.   4.  ¿Qué retorna el operador NEW cuando se desea asignar espacio en memoria y no hay disponible?

Si  al asignar memoria para un objeto se produce un error por falta de memoria, new devuelve un puntero nulo (NULL). Para verificar si este suceso ocurre, será necesario añadir código similar al siguiente:
int *pi = new int[NMAX];

if( pi==0)
{
            cerr << ”Insuficiente memoria” << endl;
            return -1;
}
Otra manera de verificar este suceso es escribir una función que manipule de forma personalizada el suceso y registrar tal función invocando a la función predefinida_set_new_handler.  

BIBLIOGRAFÍA
 Del primer punto:
Del segundo punto:
Del tercer punto:
Del cuarto punto:
CEBALLOS, Francisco Javier.
Programación orientada a objetos con c++. Segunda edición.

1 comentario:

  1. DICCIONARIO DE INFORMÁTICA Y TELECOMUNCIACIONES (INGLÉS-ESPAÑOL) de Arturo Moreno Martín.
    Heap:
    Memoria cúmulo: Área de memoria que se utiliza para la asignación dinámica de memoria de programas y rutinas. Su dimensión y características son parámetros de ejecución. Puede haber una asignación inicial de este tipo de memoria con incrementos posteriores.

    ResponderEliminar