Lenguajes de Programación I
Práctico de Memoria
Ejercicio 1
Datos del Ejercicio
a (0x10), offset = 10h�b (0x14), offset = 14h�c (0x18) offset = 18h�...de a 4 bytes.
Fragmento de Programa
int *a, *b, *c, *d, *e;
int x =10 ;
a = (int *) malloc (0x50);
b = (int *) malloc (0x100);
c = (int *) malloc (0x200);
d = (int *) malloc (0x300);
c = &x ;
b = d ;
gc;
free(b);
e = (int *) malloc (0x100);
a = c;
d = e;
gc;
a = (int *) malloc (0x100);
b = a;
c = b;
free(d);
Objetivo: entender cuáles son los problemas en la administración de memoria.
Disposición de la Memoria
2000
B800
Pila de RA
Heap
Variables y clasificación (Todas)
int *a, *b, *c, *d, *e;
int x =10 ;
a = (int *) malloc (0x50);
b = (int *) malloc (0x100);
c = (int *) malloc (0x200);
d = (int *) malloc (0x300);
...
e = (int *) malloc (0x100);
...
a = (int *) malloc (0x100);
(a) Clasificar todas las variables, de acuerdo a su tipo de almacenamiento. Justificar sus respuestas.
Variables y clasificación (Todas)
Dinámicas (Anónim.)
Semi-estáticas
int *a, *b, *c, *d, *e;
int x =10 ;
a = (int *) malloc (0x50);
b = (int *) malloc (0x100);
c = (int *) malloc (0x200);
d = (int *) malloc (0x300);
...
e = (int *) malloc (0x100);
...
a = (int *) malloc (0x100);
Su existencia no está ligada al RA ni a un nombre asociado. Se localizan en el heap linkeadas por otra variable
Tienen un tamaño fijo, se conoce en tiempo de compilación. Su ubicación puede estar en RA.
Primer estado de la memoria, definición de las variables
int *a, *b, *c, *d, *e;
int x =10 ;
a = (int *) malloc (0x50);
b = (int *) malloc (0x100);
c = (int *) malloc (0x200);
d = (int *) malloc (0x300);
Hasta esta parte voy agregando a memoria, por lo que les conviene graficar hasta ese punto
(b) Dibujar un esquema que represente todos los elementos anteriores inicialmente (hasta malloc 300h *** Y DE FORMA INCREMENTAL ***) en la memoria indicando las direcciones de cada elemento.
Incluya los punteros de la pila al heap y el contenido de las variables en el RA.
Disposición de la Memoria
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
1
0
2024
0x50
B7B0
B6B0
0x100
B4B0
0x200
B1B0
0x300
int *a, *b, *c, *d, *e;
int x =10 ;
a = (int *) malloc (0x50);
b = (int *) malloc (0x100);
c = (int *) malloc (0x200);
d = (int *) malloc (0x300);
...
e = (int *) malloc (0x100);
...
a = (int *) malloc (0x100);
Bloques usados
Bloque libre
c=&x
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
B4B0
0x200
B1B0
0x300
(c) Dibujar e indicar, paso a paso, cómo se modifican las variables
Bloque usado pero no referenciado
b=d
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
B4B0
0x200
B1B0
0x300
gc;
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B4B0
0x300
B1B0
0x300
Buscar bloques no referenciados
free(b);
Se ve como un único bloque de 0x600, pero se deja de esta forma para mostrar el contenido del puntero colgado
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B4B0
0x300
B1B0
0x300
Liberar el bloque
Puntero colgado (algunos lenguajes ponen NIL)
Puntero que apunta a un área liberada
free(b);
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B1B0
0x600
B4B0
free(b);
Se puede asumir que el bloque de 0x600, se devuelve a memoria y se hace un único bloque libre
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B4B0
e=(int*)malloc(0x100)
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
B4B0
a=c
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B4B0
B6B0
0x100
d=e
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
gc;
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
a=(int*)malloc(0x100)
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
0x100
B5B0
b=a
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
0x100
B5B0
c=b
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
0x50
B7B0
B6B0
0x100
0x100
B5B0
free(d)
Respondimos de a) hasta c)
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
B6B0
0x150
0x100
B5B0
B7B0
d)
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
B6B0
0x150
0x100
B5B0
Usado y no Garbage: 0xB6B0 a 0xB5B0
B7B0
(d) Indicar, luego de todas las instrucciones, qué bloques (las direcciones) quedan usados y no son garbage en el heap.
e)
Bloques usados: B6B0 a B5B0
Bloques libres: B800 a B6B0 y B5B0 hasta el tamaño disponible
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
B6B0
0x150
0x100
B5B0
B7B0
(e) Indicar la lista de los bloques libres (las direcciones) en el heap.
f)
Fragmentación: B800 a B6B0
Debido a los llamados a gc no hay Garbage
2000
B800
2010
a
b
2014
c
d
e
2018
201C
2020
x
10
2024
B6B0
0x150
0x100
B5B0
B7B0
(f) Indicar qué bloques quedan como garbage y cuáles como fragmentación.
g)
2000
B800
2010
a
0xB6B0
b
0xB6B0
2014
c
0xB6B0
d
N
IL
e
0xB7B0
2018
201C
2020
x
10
2024
B6B0
0x150
0x100
B5B0
B7B0
(g) ¿Cuál es el contenido de cada una de las variables definidas en la pila luego de la última sentencia del programa?