miércoles, 13 de mayo de 2009

GENERACION DE MEMORIA EN TIEMPO DE EJECUCION

ORGANIZACIÓN DE LA MEMORIA

Tiempo de ejecución

Se denomina Tiempo de ejecución (Runtime en inglés) al intervalo de tiempo en el que un programa de computadora se ejecuta en un sistema operativo. Este tiempo se inicia con la puesta en memoria principal del programa, por lo que el sistema operativo comienza a ejecutar sus instrucciones.

El intervalo finaliza en el momento en que éste envía al sistema operativo la señal de terminación, sea ésta una terminación normal, en que el programa tuvo la posibilidad de concluir sus instrucciones satisfactoriamente, o una terminación anormal, en el que el programa produjo algún error y el sistema debió forzar su finalización.

La memoria durante el momento de ejecución debe estar subdividida de modo que pueda almacenar los siguientes elementos:

1. La tabla de símbolos.
2. Código objeto generado.
3. Espacio para la realización de operaciones o procedimiento.

El código objeto tiene un tamaño fijo determinado en el momento de la compilación, de este modo la asignación de memoria para éste elemento resulta estática y se deja un lugar en el cual no se efectúe el uso de la memoria. La razón de asignación estática es que las direcciones no van a estar en constante cambio.
De manera similar se puede conocer el tamaño de algunos datos en el momento de la compilación y por lo tanto estos pueden ir colocados en una zona estática.
Los datos cuyas direcciones están contenidas en la activación de un procedimiento se pueden asociar y colocar en una pila.
Un área distinta de la memoria para el monumento de la ejecución se llama montículo.

REGISTROS DE ACTIVACION

La información necesaria para usar una sola ejecución de un procedimiento se consigue utilizando un bloque contigo de memoria llamado registro de activación o marco, que consta del conjunto de campos listados a continuación:

TEMPORALES, los valores temporales como los que surgen en la evaluación de expresiones es almacenada en seta posición.
DATOS LOCALES, guardan los datos locales a una ejecución de un procedimiento.
ESTADO DE LA MAQUINA GUARDADO, contiene información sobre el estado de la maquina justo antes de que sea llamado el procedimiento. La información incluye los valores del contador del programa y los registro de la maquina que debe reponerse cuando el control regrese del procedimiento.

ENLACE DE ACCESO OPCIONAL,se utiliza para hacer referencia a los datos no locales guardados en otros registros de activación.
ENLACE DE CONTROL, apunta al registro de activación del autor de la llamada.
PARAMETROS ACTUALES, es utilizado por el procedimiento autor de la llamada para proporcionar parámetros al procedimiento que recibe la llamada. Existe espacio para los parámetros en el registro de activación, pero en la practica los parámetros se pasan en los registros de la maquina para una mayor eficiencia.
VALOR DEVUELTO, este campo es utilizado por el procedimiento que recibe la llamada para devolver un valor al procedimiento autor de la llamada. En la practica este valor se suele trasladar en un registro para mayor eficiencia.
Los tamaños de cada uno de estos campos se pueden determinar en el momento que es llamado un procedimiento; de hecho se pueden determinar en el momento de la compilación. Existe una excepción cuando un procedimiento tiene una matriz local cuyo tamaño venga determinando por el valor de un parámetro actual, disponible únicamente cuando el procedimiento sea llamado durante la ejecución.

DISPOSICION ESPACIAL DE LOS DATOS LOCALES

La cantidad de memoria necesaria para una variable viene determinada por su tipo. Un tipo de datos elemental, como un carácter, un entero o un real, se puede almacenar en un número entero de bytes. La memoria para un agregado como una matriz o un registro, debe ser lo suficientemente grande como para dar cabida a todos sus componentes.
Para acceder fácilmente a los componentes, la memoria para los agregados se coloca en un bloque contiguo de bytes.
El campo para los datos locales se perfila conforme se examinen las declaraciones en un procedimiento durante la compilación. Los datos de longitud variable se mantienen fuera de este campo. Se hace un recuento de las posiciones de memoria asignadas a declaraciones anteriores. Según el resultado se determina una dirección relativa de la memoria para un valor local con respecto a una posición, como el comienzo del registro de activación. La dirección relativa o desplazamiento es la diferencia entre las direcciones de esa posición y los objetos de datos.
La disposición de la memoria para los datos seta muy influida por las limitaciones de direccionamiento de la maquina objeto. El espacio que no se usa por consideraciones de alineación se llama relleno. Cuando este espacio es muy pequeño, un compilador puede empaquetar datos de modo que no queda ningún relleno; entonces puede ser necesario practicar instrucciones adicionales durante la ejecución para situar los datos empaquetados de modo que se puedan manipular como si estuvieran alineados en forma apropiada.

ESTRATEGIA PARA LA ASIGNACION DE MEMORIA.

1. ASIGNACION ESTATICA.- Dispone la memoria para todo los objetos de datos durante la compilación
2. ASIGNACION POR MEDIO DE UNA PILA.- Trata la memoria en ejecución como una pila.
3. ASIGNACION POR MEDIO DE UN MONTICULO.- Asigna y desasigna la memoria conforme se necesita durante la ejecución a partir de un área de datos llamada montículo.

ASIGNACION ESTATICA

Las variables se ligan a la memoria durante la compilación del programa. Como a los enlaces, no cambian durante la ejecución, cada vez que se activa un procedimiento, sus nombres se enlazan a las mismas posiciones de memoria. Está propiedad permite que los valores de los nombre locales sean retenidas durante la activación de un procedimiento. Es decir, cuando el control regresa a un procedimiento, los valores de los variables locales son los mismos que cuando el control salió por última vez.
Según el tipo de la variable, el compilador determina la cantidad de memoria que debe reservarse para dicha variable. La dirección de está memoria consta de un desplazamiento desde un extremo del registro de activación del procedimiento el compilador debe decir a donde van los registros de activación. Durante la compilación se pueden proporcionar las direcciones en las que el código objeto pueden encontrar los datos con los que opera.

LIMITACIONES

1. El tamaño de unos objetos de datos y las limitaciones en cuanto su posición en la memoria deben conocerse en el momento de la compilación.
2. Los procedimientos recursivos son escasos porque todas las actividades de un procedimiento utilizan los mismos enlaces para los nombres locales.
3. Las estructuras de datos no se pueden crea dinámicamente. Ya que no hay un mecanismo para la asignación de memoria durante la ejecución.

ASIGNACIÓN POR MEDIO DE UNA PILA

La asignación por medio de una pila se basa en la idea de una pila de control; la memoria se organiza como una pila, y los registros de activación se introducen y se sacan cuando las activaciones comienzan y terminan respectivamente. La memoria para las variables locales en cada llamada de un procedimiento está contenida en el registro de activación de dicha llamada. De este modo en cada activación, las variables locales se enlazan a una memoria nueva, puesto que se introducen a un nuevo registro de activación en la pila al realizar una llamada. Además, los valores de las variables locales se borran cuando finaliza la activación; es decir, los valores se pierden por que la memoria para las variables locales desaparecen cuando se extrae el registro de activación.

SECUENCIA DE LLAMADAS

Las llamadas a procedimientos se implantan mediante la generación de lo que se conoce como secuencia de llamadas en el código objeto. Una secuencia de llamada asigna un registro de activación e introduce información dentro de sus campos. Una secuencia de retorno restablece el estado de la máquina para que el procedimiento que efectúa la llamada pueda continuar con su ejecución.
La secuencia de llamadas y los registros de activación son diferentes, incluso para implementaciones del mismo lenguaje. El código en una secuencia de llamada esta dividido en el procedimiento que hace la llamada y el procedimiento que recibe la llamada. No hay una división exacta entre el llamador y el llamado de las tareas de ejecución (el lenguaje fuente, la máquina objeto y el S.O. impone requisitos que puedan hacer prevalecer una solución sobre la otra).
Un principio que ayuda al diseño de secuencia de llamadas y registros de activación es que los campos cuyos tamaños se fijan primero se colocan en el medio. En el registro de activación general, los campos de enlace de control, enlace de acceso y estado de la máquina aparecen en el medio. La decisión de utilizar o no los enlace de control de acceso es parte del diseño del compilador, de modo que estos campos se pueden fijar durante la construcción del compilador si se guarda exactamente la misma cantidad de información sobre el estado de la máquina, entonces el mismo código puede almacenar y restablecer para todas las activaciones.
Aunque el tamaño del campo para los valores temporales se fija en un determinado momento de la compilación este tamaño puede o no conocerse en la etapa inicial. La generación u optimización cuidadosa del código puede reducir el número temporal de variables que necesita el procedimiento. Por tanto en el registro de activación temporal, se muestra éste campo después de aquel para datos locales, donde los cambios en su tamaño no afectarán a los desplazamientos de los objetos de datos relativos a los cambios de en medio.

No hay comentarios:

Publicar un comentario