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

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

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

Actualizado el 21 de Marzo del 2018 (Publicado el 11 de Octubre del 2017)
1.475 visualizaciones desde el 11 de Octubre del 2017
412,2 KB
10 paginas
Creado hace 22a (15/05/2001)
Traductores, Compiladores e Intérpretes

1

Tema 8
Gestión de la memoria en tiempo de ejecución.

5

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

Cuando un programa se ejecuta sobre un sistema operativo existe un proceso previo
llamado cargador que suministra al programa un bloque contiguo de memoria sobre el
cual ha de ejecutarse. El programa resultante de la compilación debe organizarse de
forma que haga uso de este bloque. Para ello el compilador incorpora al programa objeto
el código necesario.

Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos
lenguajes a otros, e incluso de unos compiladores a otros. En este capítulo se estudia la
gestión de la memoria que se utiliza en lenguajes procedurales como FORTRAN,
PASCAL, C, MODULA-2, etc. La gestión de la memoria en otro tipo de lenguajes
(funcionales, lógicos, ...) es en general diferente de la organización que aquí se plantea.

Para lenguajes imperativos, los compiladores generan programas que tendrán en tiempo
de ejecución una organización de la memoria similar (a grandes rasgos) a la que aparece
en la figura 1.

Fig. 1. Organización de la memoria

en la ejecución

En este esquema se distinguen las secciones de:

- El Código
- La Memoria Estática.
- La Pila.
- El Montón.

Gestión de la memoria en tiempo de ejecución Realizados por: María del Mar Aguilera y Sergio Gálvez Rojas.

Traductores, Compiladores e Intérpretes

2

El Código

Es la zona donde se almacenan las instrucciones del programa ejecutable en código
máquina, y también el código correspondiente a los procedimientos y funciones que
utiliza. Su tamaño puede fijarse en tiempo de compilación.

Algunos compiladores fragmentan el código del programa objeto usando “overlays”.
Estos “overlays” son secciones de código objeto que se almacenan en ficheros
independientes y que se cargan en la memoria central (RAM) dinámicamente, es decir,
durante la ejecución del programa. Los overlays de un programa se agrupan en zonas y
módulos, cada uno de los cuales contiene un conjunto de funciones o procedimientos.

fig.2 Ejemplos de configuraciones de la zona de código utilizando “overlays”

Durante el tiempo de ejecución sólo uno de los módulos de cada uno de los overlays
puede estar almacenado en memoria. El compilador reserva en la sección de código una
zona contigua de memoria para cada overlay. El tamaño de esta zona debe ser igual al del
mayor módulo que se cargue sobre ella. Es función del programador determinar cuantas
zonas de overlay se definen, qué funciones y procedimientos se encapsulan en cada
módulo, y cómo se organizan estos módulos para ocupar cada uno de los overlays. Una
restricción a tener en cuenta es que las funciones de un módulo no deben hacer referencia
a funciones de otro módulo del mismo overlay, ya que nunca estarán simultáneamente
en memoria.

El tiempo de ejecución de un programa con overlays es mayor, puesto que durante la
ejecución del programa es necesario cargar cada módulo cuando se realiza una llamada
a alguna de las funciones que incluye. También es tarea del programador diseñar la
estructura de overlays de manera que se minimice el número de estas operaciones. La
técnica de overlays se utiliza cuando el programa a compilar es muy grande en relación
con la disponibilidad de memoria del sistema, o bien si se desea obtener programas de
menor tamaño.

Gestión de la memoria en tiempo de ejecución Realizados por: María del Mar Aguilera y Sergio Gálvez Rojas.

Traductores, Compiladores e Intérpretes

La Memoria Estática.

3

La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de
ejecución es en memoria estática o permanente a lo largo de toda la ejecución del
programa. No todos los objetos (variables) pueden ser almacenados estáticamente. Para
que un objeto pueda ser almacenado en memoria estática su tamaño ( número de bytes
necesarios para su almacenamiento) ha de ser conocido en tiempo de compilación. Como
consecuencia de esta condición no podrán almacenarse en memoria estática:

Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo
de compilación no se sabe 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.

fig 3. Alojamiento en memoria de un objeto X

Las técnicas de asignación de memoria estática son sencillas. A partir de una posición
señalada por un puntero de referencia se aloja el objeto X, y se avanza el puntero tantos
bytes como sean necesarios para almacenar el objeto X. La asignación de memoria puede
hacerse en tiempo de compilación y los objetos están vigentes desde que comienza la
ejecución del programa hasta que termina.

En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los
objetos de estos subprogramas puedan almacenarse estáticamente (por ejemplo en
FORTRAN-IV) se aloja en la memoria estática un registro de activación correspondiente
a cada uno de los subprogramas. Estos registros de activación contendrán las variables
locales, parámetros formales y valor devuelto por la función, tal como indica la fig. 4.b.

Gestión de la memoria en tiempo de ejecución Realizados por: María del Mar Aguilera y Sergio Gálvez Rojas.

(cid:127)
(cid:127)
Traductores, Compiladores e Intérpretes

La Memoria Estática.

4

fig 4a. Registro de activación

fig 4b. Estructura de la memoria estática en FORTRAN-IV

Dentro de cada registro de activación las variables locales se organizan secuencialmente.
Existe un solo registro de activación para cada procedimiento y por tanto no están
permitidas las llamadas recursivas. El proceso que se sigue cuando un procedimiento p
llama a otro q es el siguiente:

p evalúa los parámetros de llamada, en caso de que se trate de expresiones complejas,
usando para ello una zona de memoria temporal para el almacenamiento intermedio. Por
ejemplo, si la llamada a q es q((3*5)+(2*2),7) las operaciones previas a la llamada
propiamente dicha en código máquina han de realizarse sobre alguna zona de memoria
temporal. (En algún momento debe haber una zona de memoria que contenga el valor
intermedio 15, y el valor intermedio 4 para sumarlos a continuación). En caso de
utilización de memoria estática ésta zona de temporales puede ser común a todo el
programa, ya que su tamaño puede deducirse en tiempo de compilación.
q inicializa sus variables y comienza su ejecución.

Dado que las variables están permanentemente en memoria es fácil implementar la
propiedad de que conserven o no su contenido para cada nueva llamada.

Gestión de la memoria en tiempo de ejecución Realizados por: María del Mar Aguilera y Sergio Gálvez Rojas.

(cid:127)
(cid:127)
Traductores, Compiladores e Intérpretes

5

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. En estos lenguajes, cada vez que comienza
la ejecución de un procedimiento se crea un registro de activación para contener los
objetos necesarios para su ejecución, eliminandolo una vez terminada ésta.

Dado que los bloques o procedimientos están organizados jerárquicamente, los distintos
registros de activación asociados a cada bloque deberán colocarse en una pila en la que
entrarán cuando comience la ejecución del bloque y saldrán al terminar el mismo. (Fig.
5b) La estructura de los registros de activación varía de unos lenguajes a otros, e incluso
de unos compiladores a otros. Este es uno de los problemas por los que a veces resulta
difícil enlazar los códigos generados por dos compiladores diferentes. En general, los
registros de activación de los procedimientos suelen tener algunos de los campos que
pueden verse en la fig.
5a.

fig 5b. Estructura de la pila

fig.5a. Registro de activación
El puntero de control de activación guarda el valor que tenía el puntero de la cima de la
pila 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.

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. Estos
valores deberán 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.

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

Gestión de la memoria en tiempo de ejecución Realizados por: María del Mar Aguilera y Sergio Gálvez Rojas.

Traductores, Compiladores e Intérpretes

6

conseguirse lo mismo con el puntero de control de activación, sólo tiene especial sentido
cuando se utilizan procedimientos recursivos.

La Pila

Al igual que en el alojamiento estático los registros de activación contendrán el espacio
correspondiente a los parámetros formales (variables que aparecen en la cabecera) y las
variables locales, (las que se definen dentro del bloque o procedimiento) así como una
zona para almacenar el valor devuelto por la función y una zona de valores temporales
para el cálculo de expresiones.

Para dos módulos o procedimientos diferentes, los registros de activación tendrán
tamaños diferentes. Este tamaño por lo general es conocido en tiempo de compilación ya
que se dispone de información suficiente sobre el tamaño de los objetos que lo
compon
  • Links de descarga
http://lwp-l.com/pdf7173

Comentarios de: Tema 8 - 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