PDF de programación - Gestión de la memoria en tiempo de ejecución

Imágen de pdf Gestión de la memoria en tiempo de ejecución

Gestión de la memoria en tiempo de ejecucióngráfica de visualizaciones

Publicado el 5 de Abril del 2021
504 visualizaciones desde el 5 de Abril del 2021
2,8 MB
13 paginas
Creado hace 14a (01/01/2010)
SISTEMAS ELECTRÓNICOS PARA EL
TRATAMIENTO DE LA INFORMACIÓN




 

 
Apéndice A

 
Gestión de la memoria en tiempo de ejecución

 

 

 

A1. Organización de la memoria en tiempo de ejecución

 

Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos

lenguajes de programación a otros, e incluso de unos compiladores a otros.



Para datos, básicamente la memoria se divide en:

 

- Memoria Estática.
- La Pila.
- El Monton (Heap).


 

A.1.1 Memoria Estática

 

La forma más sencilla de almacenar el contenido de una variable en memoria, en tiempo de
ejecución, es hacerlo en la memoria estática. Así, el almacenamiento de dichas variables será
permanente (durante la ejecución del programa).


Por ello, resulta obvio que los datos etiquetados como constantes y las variables globales de

un programa tengan asignada la memoria necesaria durante toda la ejecución del programa.


Sin embargo, no todas las variables pueden almacenarse estáticamente. Para que una variable
pueda ser almacenada en memoria estática, es necesario conocer su tamaño (número de bytes
necesarios para su almacenamiento) en tiempo de compilación. Como consecuencia, aunque una
variable (u objeto) sea de ámbito global, no podrán ocupar almacenamiento estático:

 
-­‐ Los objetos que correspondan a procedimientos o funciones recursivas, ya que en tiempo

de compilación no se conoce el número de variables que serán necesarias.

-­‐ Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que el número de

elementos que la forman no es conocido hasta que el programa se ejecuta.


 

 



A. 1

JUAN F. GUERRERO MARTÍNEZ
JOSÉ V. FRANCÉS VILLORA
Curso 2010-2011

SISTEMAS ELECTRÓNICOS PARA EL
TRATAMIENTO DE LA INFORMACIÓN




 

Las técnicas de asignación de memoria estática que utilizan los compiladores, son sencillas. A
partir de una posición señalada por un puntero de referencia se aloja la variable X, avanzando el
puntero tantos bytes como sean necesarios para almacenarla. Desde ese momento, el compilador
sustituirá cualquier referencia a dicha variable por la de su dirección asignada. Subsiguientes
constantes o variables globales serán acomodadas en memoria haciendo avanzar, de la misma
manera, el puntero de referencia, hasta que el compilador les asigne espacio de memoria a todas
ellas.


La asignación de direcciones de memoria se hace en tiempo de compilación y las variables

globales estarán vigentes desde que comienza la ejecución del programa hasta que termina.

 

A.1.2 La pila

 

La aparición de lenguajes con estructura de bloque trajo consigo la necesidad de técnicas de
alojamiento en memoria más flexibles, que pudieran adaptarse a las demandas de memoria
durante la ejecución del programa.


Para entender esta necesidad, tomemos como ejemplo el lenguaje C, en el cual las funciones
pueden tener variables locales, cuyo ámbito de visibilidad se restringe al código de su función y
que tienen un tiempo de vida que se ajusta al tiempo de ejecución de la función: obviamente,
sería innecesario que dichas variables ocupen memoria de forma estática en todo momento.
Además, si así fuera y el compilador optara por asignar memoria estática a las variables locales
de una función, sería imposible la utilización de técnicas de programación como, por ejemplo, la
recursividad.


En los compiladores, en general, la asignación de memoria de variables locales se hace de una
forma flexible, atendiendo al hecho de que solamente necesitan memoria asignada desde el
momento que comienza la ejecución de la función hasta el momento en que ésta finaliza. Así,
cada vez que comienza la ejecución de un procedimiento (o función) se crea un registro de
activación para contener los objetos necesarios para su ejecución, eliminándolo una vez
terminada ésta.


Dado que durante la ejecución un programa es habitual que unos procedimientos llamen a
otros y estos a otros, sucesivamente, se crea cadena jerárquica de llamadas a procedimiento.
Dado que la cadena de llamadas está organizada jerárquicamente, los distintos registros de
activación asociados a cada procedimiento (o función) se colocarán en una pila en la que entrarán
cuando comience la ejecución del procedimiento y saldrán al terminar el mismo.


La figura A.1b muestra cómo un compilador emplaza las variables estáticas en memoria,
quedando la pila reservada para emplazar los registros de activación de los procedimientos en
ejecución (los registros de activación se apilan en el mismo orden jerárquico de la cadena de
llamadas). La estructura de los registros de activación varía de unos lenguajes a otros, e incluso
de unos compiladores a otros.



A. 2

JUAN F. GUERRERO MARTÍNEZ
JOSÉ V. FRANCÉS VILLORA
Curso 2010-2011

SISTEMAS ELECTRÓNICOS PARA EL
TRATAMIENTO DE LA INFORMACIÓN



En general, los registros de activación de los procedimientos suelen tener algunos de los

campos que pueden se representan en la figura A.1a.

 

 


 

Figura A.1: a) Estructura de registro de activación. b) Estructura de la pila.


 

Como se ha mencionado, esta es una estructura muy general y algunos compiladores pueden
carecer de algunos campos. De todas formas, a continuación se describen un poco más
detenidamente cada uno de dichos campos:

 

-­‐ El puntero de control de activación guarda el valor que tenía el puntero de la cima de la
pila (TOS, Top Of Stack) antes de que entrase en ella el nuevo registro, de esta forma una
vez que se desee desalojarlo, puede restituirse el puntero de la pila a su posición original.
Es decir, es el puntero que se usa para la implementación de la estructura de datos “Pila”
del compilador.



Como puede verse, el proceso de eliminar un registro de activación de la pila consiste,
simplemente, en ignorarlo restaurando el anterior TOS (esto se verá mejor posteriormente
en el ejercicio al final del apéndice).

-­‐ En la zona correspondiente al estado de la máquina se almacena el contenido que hubiera
en los registros de la máquina antes de comenzar la ejecución del procedimiento.
Obviamente, estos valores se almacenan porque necesitaran ser repuestos al finalizar la
ejecución del procedimiento. El código encargado de realizar la copia del estado de la
máquina es común para todos los procedimientos.



A. 3

JUAN F. GUERRERO MARTÍNEZ
JOSÉ V. FRANCÉS VILLORA
Curso 2010-2011

SISTEMAS ELECTRÓNICOS PARA EL
TRATAMIENTO DE LA INFORMACIÓN




 


 



-­‐ El puntero a las variables no locales permite el acceso a las variables declaradas en otros
procedimientos. Normalmente no es necesario usar este campo puesto que puede
conseguirse lo mismo con el puntero de control de activación. Este campo sólo tiene
sentido cuando se utilizan procedimientos recursivos.

-­‐ La zona correspondiente a los parámetros formales (variables que aparecen en la cabecera
del procedimiento) alojará los parámetros pasados al procedimiento. Por ejemplo,
supongamos que la función ‘q’ está definida en C como:

int q(char a, char b)
{



}

int c, d;

c=2*a;
b=3*b;
return (c+d);

en este caso la zona de parámetros será de 2 bytes, ya que hay dos parámetros (a y b), y
ambos ocupan 1 byte dado que son de tipo char.

-­‐ La zona correspondiente a las variables locales (las que se definen dentro del bloque o
procedimiento) asigna memoria para alojar a las variables locales al procedimiento. Por
ejemplo, si tomamos la función q( ) definida anteriormente, vemos que hay dos variables
locales, ambas de tipo int. Suponiendo que las variables int son de 16 bits para el
compilador que estemos utilizando, entonces el compilador dimensiona la zona de
variables locales con 4 bytes: 2 bytes para la variable c (pues es tipo int) , y otros 2 bytes
para la variable d, que también es tipo int.


-­‐ La zona de valor devuelto es aquella mediante la cual se retorna el valor devuelto por la
función. En el ejemplo que nos ocupa será de 2 bytes, pues el valor devuelto está definido
con el tipo int.

-­‐ La zona de valores temporales la dimensiona el compilador para utilizarla para el cálculo
de expresiones. Por ejemplo, si realizamos la llamada q((3*5)+(2*2),7) puede ser que el
compilador necesite alguna variable temporal para el cálculo de (3*5)+(2*2), para lo cual
asignará el espacio necesario a la zona de valores temporales y echará mano de ella como
almacenamiento auxiliar para la realización del cálculo (en algún sitio debe haber una
zona de memoria que contenga el valor intermedio 15, y el valor intermedio 4 para
sumarlos a continuación).


 

 

Cabe decir que para dos procedimientos diferentes los registros de activación no tienen por
qué tener el mismo tamaño. Pueden tener tamaños diferentes. Este tamaño por lo general es
calculado en tiempo de compilación ya que el compilador dispone de información suficiente
sobre el tamaño de los objetos que lo componen. Aunque en ciertos casos esto no es así, como
por ejemplo ocurre en C cuando se utilizan arrays de dimensión indefinida. En estos casos el



A. 4

JUAN F. GUERRERO MARTÍNEZ
JOSÉ V. FRANCÉS VILLORA
Curso 2010-2011

SISTEMAS ELECTRÓNICOS PARA EL
TRATAMIENTO DE LA INFORMACIÓN



registro de activación debe incluir una zona de desbordamiento al final, cuyo tamaño no se fija
en tiempo de compilación sino solo cuando realmente llega a ejecutarse el procedimiento. Esto
complica un poco la gestión de la memoria, por lo que algunos compiladores de bajo coste
suprimen es
  • Links de descarga
http://lwp-l.com/pdf19073

Comentarios de: Gestión de la memoria en tiempo de ejecución (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad