clase práctica administración de memoria en ccs.uns.edu.ar/~ags/oc/downloads/apuntes de...
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.