Compilador
Enviado por • 3 de Octubre de 2013 • 664 Palabras (3 Páginas) • 179 Visitas
e estar almacenado en memoria principal. El compilador reserva
en la sección de código una zona contigua de memoria para cada conjunto de overlays.
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 de overlay, y cómo se organizan estos
módulos para ocupar cada una de las zonas de overlay. 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.
Evidentemente, el tiempo de ejecución de un programa estructurado con
overlays es mayor que si no tuviese overlays y todo el código estuviese residente en
memoria, 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 no sólo se utiliza cuando el programa a
compilar es muy grande en relación con la disponibilidad de memoria del sistema, sino
también cuando se desea obtener programas de menor tamaño que deben coexistir con
otros del sistema operativo cuando la memoria es escasa.
9.3 Zona de datos
Los datos que maneja un programa se dividen actualmente en tres grandes
bloques:
• Uno dedicado a almacenar las variables globales accesibles por cualquier línea
de código del programa. Este bloque es la Zona de Datos de Tamaño Fijo.
• Otro dedicado a almacenar las variables locales a cada función y
procedimiento. Éstas no pueden almacenarse en el bloque anteriorpor dos
motivos principales: a) no es necesario almacenar las variables de una función
hasta el momento en que ésta es invocada y, una vez que finaliza su ejecución,
tampoco; y b) durante la ejecución de una función recursiva deben
almacenarse varias instancias de sus variables locales, concretamente tantas
como invocaciones a esa misma función se hayan producido. Este bloque es
la Pila.
• Un último bloque dedicado a almacenar los bloques de memoria gestionados
directamente por el usuario mediante sentencias malloc/free, new/dispose,
etc. La cantidad de memoria requerida para estos menesteres varia de
ejecución en ejecución del programa, y los datos ubicados no son locales a
Gestión de la memoria en tiempo de ejecución
284
Figura 9.3 Asignación de un bloque de memoria para una variable global X
ninguna función, sino que perduran hasta que son liberados. Este bloque es
el Montón.
9.3.1 Zona de Datos de Tamaño Fijo
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 variables locales correspondientes a procedimientos o funciones
recursivas, ya que en tiempo de compilación no se sabe el número de veces
que estas 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.
Por tanto, las variables locales a una función son datos de tamaño definido,
pero para los que no se sabe el número de ocurrencias del ámbito del que dependen, por
lo que deben almacenarse siguiendo algún criterio dinámico. Tampoco es posible
almacenar en esta zona a las estructuras eminentemente dinámicas, esto es, las que están
gestionadas a través de punteros mediante creación dinámica de espacio libre: listas
dinámicas, grafos dinámicos, etc. Estos datos son de tamaño indefinido por lo que no
es posible guardarlos en la zona de datos de tamaño fijo. Aunque pueda pensarse que
el tamaño del código de una función recursiva también depende del número de veces
que la función se llama a sí misma, esto no es cierto: las instrucciones a ejecutar son
siempre las mismas, y lo que cambia son los datos con los que se trabaja, o sea, las
variables locales.
...