memoria dinamica
TRANSCRIPT
![Page 1: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/1.jpg)
Notas de curso de Programación yestructuras de datos. Memoria dinámica
Nikos Mylonakis, Fernando Orejas
Dept. Llenguatges i Sistemes Informatics Universitat Politecnica de Catalunya
Barcelona
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.1/33
![Page 2: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/2.jpg)
Contenido
• Introducción a los LP• Memoria dinámica• Control de datos• Tipos de datos• Especificación algebraica• Implementación de tipos abstractos de datos
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.2/33
![Page 3: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/3.jpg)
Introducción a los LP
• Qué es un lenguaje de programación. Clases delenguajes
• Criterios de diseño.• Componentes de un LP.• Implementación de un LP
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.3/33
![Page 4: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/4.jpg)
• LP. Notación formal que permite escribir todos losprogramas que pueden ser ejecutados por uncomputador.
• Los lenguajes que describiremos son de alto nivel• Diferencia entre algoritmo y programa
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.4/33
![Page 5: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/5.jpg)
Clases de LP
• Imperativos y orientados a objetos (OO)
• Tiene instrucción de asignación• No tienen transparencia referencial
• Declarativos• Tienen transparencia referencial• Implementación más ineficiente
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.5/33
![Page 6: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/6.jpg)
Criterios de diseño
• Distinción cualitativa entre LP dependiendo delpróposito del LP
• Los criterios más importantes son:
• Eficiencia en la implementación• Fiabilidad• Usabilidad
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.6/33
![Page 7: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/7.jpg)
Eficiencia
• En los años 50-60 era EL criterio de diseño• Hoy en día también se valora la facilidad de
programar• Ejemplo1: derivador simbólico en Prolog (25-30
líneas y en C++ (3.000))• Sólo si la aplicación se ha de utilizar muchas
veces al día C++ es más interesante• Ejemplo2: Java es menos eficiente que C++ pero
más portable y seguro
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.7/33
![Page 8: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/8.jpg)
Fiabilidad
• Facilidad del LP para detectar un error lo antesposible.
• La comprobación de tipos en tiempo decompilación ayuda a detectar errores antes de laejecución.
• Ejemplo 1: i:=i+’a’ i:natural• Hay comprobaciones que no se pueden realizar
en tiempo de compilación• Ejemplo 2: Rango del índice de los vectores (t[i*2]
i:natural t:tabla [1..N] de entero
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.8/33
![Page 9: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/9.jpg)
Usabilidad
• Hay LP que se diseñan para resolver una ciertaclase de problemas
• La evaluación de un LP ha de ser para su dominiode aplicación
• Por tanto un LP puede ser mejor para una clasede problemas y peor para otras
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.9/33
![Page 10: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/10.jpg)
Componentes de un LP. Tipos dedatos
• Se ha de determinar sus tipos básicos,constructores de tipos, relación de subtipos
• Se ha de determinar la comprobación de tipos quese hace en tiempo de compilación
• Y la que se hace en tiempo de ejecución (ej:índice de tablas)
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.10/33
![Page 11: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/11.jpg)
Control de secuencia
• No hablaremos en la asignatura.• Determina cómo se regula el flujo de los
programas• En LP imperativos tenemos composiciones
condicionales e iterativas.• Ejemplos de control más avanzados son la
reescritura de términos y el paralelismo
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.11/33
![Page 12: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/12.jpg)
Control de datos (CD) y Unidades deprogramas (UP)
• CD: Mecanismo que ofrecen los LP para acceder,modificar o mover los datos de un programa
• Ejemplos: Paso de parámetros, ámbito de lasvariables y parámetros
• UP: Forma de estructurar los programas• Ejemplos: Clases en LPOO, módulos, funciones
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.12/33
![Page 13: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/13.jpg)
Implementación de un LP
• Compilación: Proceso de traducción de unprograma en un LP a código máquina.
• Interpretación: Programa que va ejecutando unprograma a medida que lo va leyendo.
• Tradicionalmente se hablaba de compiladores (+eficientes) e intérpretes (-eficientes)
• Hoy en día no existen LP 100% compilados ni100% interpretados
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.13/33
![Page 14: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/14.jpg)
• Hoy en día los intérpretes compilan y optimizan elcódigo de los bucles
• Y los compiladores utilizan máquinas virtualesintermedias por ejemplo para E/S mediante el usode librerías. Por eso es necesario linkar losprogramas
• Otro motivo que justifica la necesidad de linker esla programación modular
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.14/33
![Page 15: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/15.jpg)
Memoria dinámica
• Gestión de memoria en pila y en heap• Punteros y operaciones básicas. Ejemplos• Asignación y liberación de memoria dinámica• Algoritmos de garbage collection
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.15/33
![Page 16: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/16.jpg)
Gestión de memoria en pila
• Veamos como gestionar la memoria de lasvariables requeridas en un programa con unconjunto de acciones
• Ejemplo
accionPrincipal accionA1 accionA2
varx, y, z : . . . var a, b : . . . var c, d : . . .
fvar fvar fvar
......
...A1; A2; A2;...
......
faccion faccion faccionNikos Mylonakis, UPC (Spain) February 15, 2007 – p.16/33
![Page 17: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/17.jpg)
Memoria requerida después de ejecutar la acciónprincipal, A1,A2 y una llamada recursiva
x y z a b c d c d
Descripción del proceso de obtención y liberación deespacio y el concepto de bloque de activación.
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.17/33
![Page 18: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/18.jpg)
• La estructura de datos requerida para gestionar lamemoria de este tipo de variables es una pila.
• Como ya vimos una pila es una estructura linealcuyas operaciones principales son las de apilar ydesapilar.
• Esta estructura de datos es facilmenteimplementable mediante una tabla
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.18/33
![Page 19: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/19.jpg)
• En el ejemplo la obtención de memoria se haríacon la operación apilar y la liberación de memoriacon desapilar.
• Esta gestión de memoria es limitada.• Para tener estructuras de datos dinámicas
mediante el uso de punteros esta gestión dememoria no es suficiente.
• La gestión de memoria para el caso de datosgeneral requiere de la estructura de datos de unheap.
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.19/33
![Page 20: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/20.jpg)
Heap
• Mediante un heap la memoria libre y ocupada engeneral está entremezclada.
• Cuando se requiere una cierta cantidad dememoria libre se busca en la zona libre un espacioque cubra esa cantidad.
• También es posible liberar memoria que ya no esrequerida por el programa.
• Representación gráfica
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.20/33
![Page 21: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/21.jpg)
• La gestión de memoria mediante heap es máscostosa
• Para asignar memoria se requiere realizar unabúsqueda por las zonas libres
• Aparece el problema de fragmentación. Lasolución es compactar que agrava la ineficiencia
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.21/33
![Page 22: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/22.jpg)
Punteros o referencias
• Para poder definir estructuras de datos dinámicaslos LP ofrecen los punteros o referencias
• Los punteros son constructores de tipos donde serequiere un tipo adicional (generalmente básico ouna tupla)
• La sintaxis es ↑ T . Ej: x: ↑ entero• Los valores de ↑ T son direcciones de memoria
donde se guardan elementos de tipo T más ladirección distinguida NIL.
• En el ejemplo x denota la dirección de memoria deuna variable entera y x ↑ es una variable entera
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.22/33
![Page 23: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/23.jpg)
Operaciones sobre punteros
• Nosotros asumiremos que el valor inicial de unpuntero es la dirección NIL.
• Para asignarle un espacio de memoria del tipodeterminado se tiene la operación reservar(x)
• Podemos realizar la asignación de punteros(aliasing) pero normalmente no se tienenoperaciones aritméticas (en C++ sí que existen)
• Ejemplo
var y, x :↑ entero fvar
reservar(x);
y := x;Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.23/33
![Page 24: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/24.jpg)
• Liberación de la zona de memoria mediante laacción liberar(x).
• El efecto es que x vuelve a tomar el valor NIL y lazona anteriormente asignada a x pasa a la zonalibre
• Problema de esta operación con aliasing• En el ejemplo y pasa a ser referencia colgada
(dangling pointer). (En Java no es posible)
var y, x :↑ entero fvar
reservar(x); y := x; liberar(x)
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.24/33
![Page 25: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/25.jpg)
Algoritmos de asignación yliberación de memoria dinámica
• Presentamos diferentes algoritmos para lasacciones de reservar y liberar memoria
• La representación del heap es normalmentemediante una lista encadenada de zonas libres
• Un posible algoritmo para reservar es buscar laprimera zona libre con la suficiente memoriarequerida
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.25/33
![Page 26: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/26.jpg)
• Problema de fragmentación. Ejemplo: zonas libresde 500, 200 y 300 y se realizan las acciones reser-var(200);reservar(150);reservar(250);reservar(250)
• Alternativas: Empezar la búsqueda por la últimazona libre usada de forma circular (first fit)
• Buscar la zona de memoria que mejor se ajusta ala zona requerida (best fit)
• Buscar la zona de memoria que peor se ajusta ala zona requerida (worst fit)
• Estudios estadísticos demuestran que el first esen general el mejor
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.26/33
![Page 27: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/27.jpg)
Liberación de memoria
Para liberar una direccion d de longitud N de una zonaocupada podemos:
• Liberar sin actualizar la lista de libres• Actualizar la lista de libres recorriéndola.• Resolver problemas de fragmentación en el caso
en que la zona liberada es contigua a una zonalibre
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.27/33
![Page 28: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/28.jpg)
Recolector de basura (Garbagecollector)
• Se entiende por basura la memoria que no está enla zona libre y no es alcanzable por los punterosde un programa.
• Un recolector de basura se encarga de recoger labasura situándola en la zona libre
• Hay dos tipos:• Los de parada/recogida se clasifican en los que
realizan copia y los que realizan marcado ybúsqueda (mark/scan).
• Los continuos pueden realizarse mediantecontador de referencias o sobre la marcha(on-the-fly)
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.28/33
![Page 29: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/29.jpg)
Parada/recogida Copia
• Divide el heap en dos partes iguales. Una mitadnunca se utiliza porque va alternándose.
• Cuando se requiere memoria se empieza la copiade forma compacta sin copiar la basura
• Así la memoria libre crece pero la mitad copiadaqueda ahora sin utilizar
• La copia de toda la memoria referenciada escostosa y complicada
• Si hay mucha basura el algoritmo es más eficientepues lo más costoso es la copia
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.29/33
![Page 30: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/30.jpg)
Parada/recogida Mark/scan
• En este caso se utiliza toda la zona de memoriadisponible
• Hay un proceso de marcado de la zona ocupadapara diferenciarla de la basura
• Posteriormente se compacta y se desmarca• El algoritmo es complicado• Si hay poca basura el algoritmo es más eficiente
pues lo más costoso es la compactación
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.30/33
![Page 31: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/31.jpg)
Continuo contador de referencia
• Cada zona de memoria referenciable tiene uncontador de referencias
• Si realizamos aliasing el contador se incrementa ysi liberamos se decrementa
• Cuando el contador vale 0 la zona de memoria seasigna a la zona libre
• Existen problemas cuando hay referenciascirculares sin nombres. Al eliminar las connombres el contador no se hace 0 y no se liberan.
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.31/33
![Page 32: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/32.jpg)
Continuo on-the-fly
• Continuo on-the-fly es mediante un procesoparalelo al programa que se ejecuta y puederealizar tanto los algoritmos de copia como demark-scan
• En la tabla resumen +/- significa bueno si haymucha basura y -/+ bueno si hay poca. o significaneutro
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.32/33
![Page 33: Memoria dinamica](https://reader036.vdocuments.site/reader036/viewer/2022081401/557b99bbd8b42ac9248b479a/html5/thumbnails/33.jpg)
Tabla resumen
EFICIENCIA TIEMPO
EFICIENCIA ESPACIO
LISTA ESPACIO LIBRE
SIN OVERHEAD CONESPACIO LIBRE
COPY MARK−SCAN CONTADOR−REF
+/− −/+ O
− + −
NO SI SI
SI SI NO
Nikos Mylonakis, UPC (Spain) February 15, 2007 – p.33/33