clase práctica administración de memoria en ccs.uns.edu.ar/~ags/oc/downloads/apuntes de...

20
Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur Clase Práctica Administración de Memoria en C

Upload: dinhtuyen

Post on 22-Oct-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Organización de ComputadorasDepto. Cs. e Ing. de la Comp.Universidad Nacional del Sur

Clase Práctica

Administración de Memoria en C

Copyright

2

Copyrigth © 2018 Ing. Federico Joaquín.

Las presentes transparencias constituyen unaguía acotada y simplificada de la temáticaabordada, y debe utilizarse únicamente comomaterial adicional o de apoyo a la bibliografíaindicada en el programa de la materia.

Organización de Computadoras

3

IntroducciónAlgunos lenguajes de programación, son

responsables de llevar a cabo la gestión dememoria de forma automática y transparente alprogramador.

La gestión de memoria contempla la asignacióny liberación de los espacios de memoriarequeridos para el funcionamiento de unprograma.

En C, por el contrario, parte de la gestión dememoria es responsabilidad del programador.

Organización de Computadoras

4

IntroducciónPor contraste, así como en Java el programador

puede crear nuevos objetos sin la necesidad degestionar memoria, en C deberá encargarse tantode la reservación como de la liberación dememoria cuando inserte una nueva celda en unadada lista.

En ambos casos, se hace mención a la gestiónde memoria dinámica, esto es, memoria que sereserva en tiempo de ejecución.

Organización de Computadoras

5

Estática vs DinámicaPor memoria estática referimos al espacio en

memoria necesario al declarar variables decualquier tipo de dato, cuyo tamaño (número debytes) es conocido en tiempo de compilación:

Datos primitivos: int, char, float.

Datos no primitivos: struct, array, punteros.

La memoria que estas variables ocupan nopuede cambiarse durante la ejecución y tampocopuede ser liberada manualmente.

Organización de Computadoras

6

Estática vs DinámicaPor memoria dinámica referimos al espacio en

memoria necesario para la manipulación deobjetos que son creados en tiempo de ejecución:

Estructuras dinámicas: pilas, colas, listas, etc.

Razonamiento: ¿se puede conocer de ante mano a laejecución de un programa cuántos elementos tendráuna lista?

La memoria dinámica puede cambiar durante laejecución y será el programador quien debaasignarla y liberarla explícitamente.

Organización de Computadoras

7

Áreas de MemoriaUn programa en C almacena sus datos en tres

áreas diferentes de memoria:

Memoria global

Stack

Heap

Memoria global de tamaño fijo.

Stack y Heap de tamaño variable.

Organización de Computadoras

Memoria Global

Stack

Heap

Memoria Libre

8

Áreas de MemoriaUn programa en C almacena sus datos en tres

áreas diferentes de memoria:

Organización de Computadoras

Memoria Global

Stack

Heap

Memoria Libre

Memoria global:Almacena las variables declaradas

como globales o estáticas.

Los datos están presentes desde elcomienzo del programa hasta que estetermina.

El tamaño de los datos no cambia enejecución, y es gestionadoautomáticamente.

9

Áreas de MemoriaUn programa en C almacena sus datos en tres

áreas diferentes de memoria:

Organización de Computadoras

Stack:Almacena datos de control y variables

locales a diferentes funciones delprograma.

Todos los datos almacenados aparecen ydesaparecen en un momento puntual de laejecución.

Los datos tienen un ámbito reducido, sóloestán disponibles mientras se ejecuta lafunción en la que han sido definidas.

Memoria Global

Stack

Heap

Memoria Libre

10

Áreas de MemoriaUn programa en C almacena sus datos en tres

áreas diferentes de memoria:

Organización de Computadoras

Heap:No almacena datos de variables

globales o estáticas, ni locales a lasfunciones.

Es memoria dinámica para estructurasde datos con tamaño desconocido hastala ejecución del programa.

Contiene memoria disponible para quese reserve y libere en cualquiermomento durante la ejecución.

Memoria Global

Stack

Heap

Memoria Libre

11

Áreas de Memoria: Ejemplos

Organización de Computadoras

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

Memoria Global

Stack

Heap

Memoria Libre

12

Áreas de Memoria: Ejemplos

Organización de Computadoras

#include <stdio.h>

struct data{int id;char name [51];

}

typedef struct data tData;

tData info [200];struct data info_2 [200];

Definición del registro data:- Dos campos: id e name.- name es un arreglo de 50 chars.

Definición del nuevo tipo de dato tData, que no es más que un registro struct data.

Definición de las variables globales info e info_2. ¿Difiere el espacio y tipo de info e info_2?

Memoria Global

Stack

Heap

Memoria Libre

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

Áreas de Memoria: Ejemplos

Organización de Computadoras

Memoria Global

Stack

Heap

Memoria Libre

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

14

Áreas de Memoria: Ejemplos

Organización de Computadoras

void my_function(int param){int aux = param + 10;printf(“Valor %i”, aux);

}

Memoria Global

Stack

Heap

Memoria Libre

Al invocarse una función, se debe gestionar el espacio en memoria para sus variables locales.

La gestión de memoria al invocar una función, se realiza de forma automática.

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

Áreas de Memoria: Ejemplos

Organización de Computadoras

Memoria Global

Stack

Heap

Memoria Libre

15

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

16

Áreas de Memoria: Ejemplos

Organización de Computadoras

struct data{int id;char name [51];

}

typedef struct data * tD1;typedef struct data tD2;

tD1 var1 = (tD1) malloc(sizeof(struct data);tD2 * var2 = (tD2 *) malloc(sizeof(tD2);

Memoria Global

Stack

Heap

Memoria Libre

¿Para qué se usa como parámetro en malloc() el valor retornado por sizeof()?

¿En qué difieren tD1 y tD2?

¿Son equivalentes los parámetros para la función sizeof()?

¿Se podía utilizar en la reservación sizeof(tD1)? ¿Por qué?

Analicemos el sig. ejemplo, distinguiendo las áreas donde se almacena la información:

17

Memoria Dinámica

Organización de Computadoras

La gestión de la memoria del Heap, se efectúamediante tres funciones de librería ofrecidas porel lenguaje:

void * malloc(size_t): esta función intenta reservarla cantidad size_t de bytes del heap.

free(void*): esta función libera la porciónde memoria que comienza donde indica el punteroparametrizado.

void* realloc(void*, size_t): esta función reajusta altamaño size_t el espacio de memoria del heap quecomienza donde indica el puntero parametrizado.

18

Memoria Dinámica

Organización de Computadoras

Es importante recordar que por cada llamadarealizada a malloc(), deberá existir una llamada afree(), de forma tal de liberar la memoria cuandoesta no sea utilizada.

La correcta gestión de memoria es un tareaescencial para garantizar que los programasfuncionen según lo esperado, haciendo usoracional de los recursos.

19

Test de revisión

Organización de Computadoras

En el pizarrón: evolución de las áreas de memoria.

20

¿Preguntas?

Organización de Computadoras