1 of 26

Lenguajes de Programación I

Práctico de Memoria

Ejercicio 1

2 of 26

Datos del Ejercicio

  • La sentencia gc es la ejecuciòn del algoritmo de garbage colector
  • Lenguajes tipo Algol.
  • RA comienza en la dirección 0x2000 (2000h)
  • Offsets

a (0x10), offset = 10h�b (0x14), offset = 14h�c (0x18) offset = 18h�...de a 4 bytes.

  • El heap se encuentra desde la dirección 0xB800 (B800h) hacia direcciones menores.
  • Suponer que se usa el algoritmo de first fit para asignar bloques de memoria

3 of 26

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.

4 of 26

Disposición de la Memoria

2000

B800

Pila de RA

Heap

5 of 26

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.

6 of 26

Variables y clasificación (Todas)

  • Con Nombre
    • a,b,c,d,e
    • x

  • Anónimas
    • malloc(0x50)
    • malloc(0x100)
    • malloc(0x200)
    • malloc(0x300)
    • malloc(0x100)
    • malloc(0x100)

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.

7 of 26

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.

8 of 26

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

9 of 26

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

10 of 26

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

11 of 26

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

12 of 26

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

13 of 26

free(b);

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B1B0

0x600

B4B0

14 of 26

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

15 of 26

e=(int*)malloc(0x100)

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B6B0

0x100

B4B0

16 of 26

a=c

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B4B0

B6B0

0x100

17 of 26

d=e

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B6B0

0x100

18 of 26

gc;

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B6B0

0x100

19 of 26

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

20 of 26

b=a

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B6B0

0x100

0x100

B5B0

21 of 26

c=b

2000

B800

2010

a

b

2014

c

d

e

2018

201C

2020

x

10

2024

0x50

B7B0

B6B0

0x100

0x100

B5B0

22 of 26

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

23 of 26

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.

24 of 26

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.

25 of 26

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.

26 of 26

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?