Upload
idsystems
View
216
Download
0
Embed Size (px)
Citation preview
8/8/2019 Leccion 2.1 Manejo de Memoria
1/5
Estructura de Datos Leccion 2.1 Manejo de Memoria Pgina 1
Leccion 2 Manejo de Memoria
La asignacin de memoria consiste en el proceso de asignar memoria para propsitos espcificos, ya sea
en tiempo de compilacin o de ejecucin. Si es en tiempo de compilacin es esttica, si es en tiempo de
ejecucin es dinmica y si son variables locales a un grupo de sentencias se denomina automtica
Asignacin esttica de memoria
La Asignacin esttica de memoria consiste en el proceso de asignar memoria en tiempo decompilacin antes de que el programa asociado sea ejecutado, a diferencia de la asignacin dinmica o
la automtica donde la memoria se asigna a medida que se necesita en tiempo de ejecucin.[2]
Una aplicacin de esta tcnica conlleva que un mdulo de programa (por ejemplo funcin o subrutina)declara datos estticos de forma local, de forma que estos datos son inaccesibles desde otros mdulos a
menos que se les pasen referenciados comoparmetros o que les sean devueltos por la funcin. Semantiene una copia simple de los datos estticos, accesible a travs de llamadas a la funcin en la cualhan sido declarados.
El uso de variables estticas dentro de una clase en la programacin orientada a objetos permite que unacopia individual de tales datos se comparta entre todos los objetos de esa clase.
Las constantes conocidas en tiempo de compilacin, como literales de tipo cadena, se asignannormalmente de forma esttica. En programacin orientada a objetos, el mtodo usual para las tablas de
clases tambin es la asignacin esttica de memoria.
Asignacin automtica de memoria
Las variables automticas son variables locales a un bloque de sentencias (subrutina, funcin oprocedimiento). Pueden ser asignadas automticamente en lapila de datos cuando se entra en el bloquede cdigo. Cuando se sale del bloque, las variables son automticamente desasignadas.
[3]Las variables
automticas tendrn un valor sin definir cuando son declaradas, por tanto es buena prctica de
programacin inicializarlas con un valor vlido antes de usarlas.
Asignacin dinmica de memoria
Artculo principal: Memoria dinmica
En ciencia de la computacin, asignacin dinmica de la memoria es la asignacin de almacenamientode memoria para utilizacin por parte de un programa de computador durante el tiempo de ejecucin de
ese programa. Es una manera de distribuir la propiedad de recursos de memoria limitada entre muchas
piezas de cdigo y datos. Un objeto asignado dinmicamente permanece asignado hasta que es
desasignado explcitamente, o por el programador o por un recolector de basura; esto es notablementediferente de la asignacin automtica de memoria y de la asignacin esttica de memoria (la de las
variables estticas). Se dice que tal objeto tiene tiempo de vida dinmico.[
8/8/2019 Leccion 2.1 Manejo de Memoria
2/5
Estructura de Datos Leccion 2.1 Manejo de Memoria Pgina 2
Memoria Esttica
La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin es en
memoria esttica o permanente a lo largo de toda la ejecucin del programa.
No todos los objetos (variables) pueden ser almacenados estticamente.
Para que un objeto pueda ser almacenado en memoria esttica su tamao (nmero de bytes necesariospara su almacenamiento) ha de ser conocido en tiempo de compilacin, como consecuencia de estacondicin no podrn almacenarse en memoria esttica:
* Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo decompilacin no se sabe el nmero de variables que sern necesarias.
* Las estructuras dinmicas de datos tales como listas, rboles, etc. ya que el nmero de elementos que
las forman no es conocido hasta que el programa se ejecuta.
Las tcnicas de asignacin de memoria esttica son sencillas.
A partir de una posicin sealada por un puntero de referencia se aloja el objeto X, y se avanza elpuntero tantos bytes como sean necesarios para almacenar el objeto X.
La asignacin de memoria puede hacerse en tiempo de compilacin y los objetos estn vigentes desde
que comienza la ejecucin del programa hasta que termina.
8/8/2019 Leccion 2.1 Manejo de Memoria
3/5
Estructura de Datos Leccion 2.1 Manejo de Memoria Pgina 3
En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de estos
subprogramas puedan almacenarse estticamente se aloja en la memoria esttica un registro de
activacin correspondiente a cada uno de los subprogramas.
Estos registros de activacin contendrn las variables locales, parmetros formales y valor devuelto por
la funcin.
Dentro de cada registro de activacin las variables locales se organizan secuencialmente. Existe un soloregistro de activacin para cada procedimiento y por tanto no estn permitidas las llamadas recursivas.
El proceso que se sigue cuando un procedimiento p llama a otro q es el siguiente:
1. p evala los parmetros de llamada, en caso de que se trate de expresiones complejas, usando para
ello una zona de memoria temporal para el almacenamiento intermedio. Por ejemplos, s la llamada a q
es q((3*5)+(2*2),7) las operaciones previas a la llamada propiamente dicha en cdigo mquina han derealizarse sobre alguna zona de memoria temporal. (En algn momento debe haber una zona de memoria
que contenga el valor intermedio 15, y el valor intermedio 4 para sumarlos a continuacin). En caso de
utilizacin de memoria esttica sta zona de temporales puede ser comn a todo el programa, ya que sutamao puede deducirse en tiempo de compilacin.
2. q inicializa sus variables y comienza su ejecucin.
Dado que las variables estn permanentemente en memoria es fcil implementar la propiedad de que
conserven o no su contenido para cada nueva llamada
Memoria Dinmica
Qu es la memoria dinmica?
Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un
ejemplo simple podra ser el de un programa que lee las lneas de un archivo y las ordena. Por tanto,
deberemos leer un nmero indeterminado de lneas, y tras leer la ltima, ordenarlas. Una manera demanejar ese ``nmero indeterminado'', sera declarar una constante MAX_LINEAS, darle un valor
vergonzosamente grande, y declarar un array de tamao MAX_LINEAS. Esto, obviamente, es muy
ineficiente (y feo). Nuestro programa no slo quedara limitado por ese valor mximo, sino que ademsgastara esa enorme cantidad de memoria para procesar hasta el ms pequeo de los ficheros.
La solucin consiste en utilizar memoria dinmica. La memoria dinmica es un espacio dealmacenamiento que se solicita en tiempo de ejecucin. De esa manera, a medida que el proceso va
necesitando espacio para ms lneas, va solicitando ms memoria al sistema operativo para guardarlas.El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que nopodemos saber en tiempo de compilacin dnde nos dar huecos el sistema operativo (en la memoria de
nuestro PC).
8/8/2019 Leccion 2.1 Manejo de Memoria
4/5
Estructura de Datos Leccion 2.1 Manejo de Memoria Pgina 4
Memoria Dinmica.
Sobre el tratamiento de memoria, GLib dispone de una serie de instrucciones que sustituyen a las ya
conocidas por todos malloc, free, etc. y, siguiendo con el modo de llamar a las funciones en GLib, las
funciones que sustituyen a las ya mencionadas son g_malloc y g_free.
Reserva de memoria.
La funcin g_malloc posibilita la reserva de una zona de memoria, con un nmero de bytes que le
pasemos como parmetro. Adems, tambin existe una funcin similar llamada g_malloc0 que, no slo
reserva una zona de memoria, sino que, adems, llena esa zona de memoria con ceros, lo cual nos puedebeneficiar si se necesita un zona de memoria totalmente limpia.
gpointer g_malloc (gulong numero_de_bytes );
gpointer g_malloc0 (gulong numero_de_bytes );
Existe otro conjunto de funciones que nos permiten reservar memoria de una forma parecida a cmo se
hace en los lenguajes orientados a objetos.
Liberacin de memoria.
Cuando se hace una reserva de memoria con g_malloc y, en un momento dado, el uso de esa memoria
no tiene sentido, es el momento de liberar esa memoria. Y el sustituto de free es g_free que,bsicamente, funciona igual que la anteriormente mencionada.
void g_free (gpointer memoria_reservada );
Realojamiento de memoria
En determinadas ocasiones, sobre todo cuando se utilizan estructuras de datos dinmicas, es necesario
ajustar el tamao de una zona de memoria (ya sea para hacerla ms grande o ms pequea). Para eso,GLib ofrece la funcin g_realloc, que recibe un puntero a memoria que apunta a una regin que es la
que ser acomodada al nuevo tamao y devuelve el puntero a la nueva zona de memoria. El anterior
puntero es liberado y no se debera utilizar ms:
gpointer g_realloc (gpointer memoria_reservada , gulong numero_de_bytes );
Asignacin dinmica
El proceso de compactacin del punto anterior es una instancia particular del problema de asignacin de
memoria dinmica, el cual es el cmo satisfacer una necesidad de tamao n con una lista de huecos
libres. Existen muchas soluciones para el problema. El conjunto de huecos es analizado para determinar
cul hueco es el ms indicado para asignarse. Las estrategias ms comunes para asignar algn hueco dela tabla son:
8/8/2019 Leccion 2.1 Manejo de Memoria
5/5
Estructura de Datos Leccion 2.1 Manejo de Memoria Pgina 5
Primer ajuste: Consiste en asignar el primer hueco con capacidad suficiente. La bsqueda puede iniciar
ya sea al inicio o al final del conjunto de huecos o en donde termin la ltima bsqueda. La bsqueda
termina al encontrar un hueco lo suficientemente grande.
Mejor ajuste: Busca asignar el espacio ms pequeo de los espacios con capacidad suficiente. La
bsqueda se debe de realizar en toda la tabla, a menos que la tabla est ordenada por tamao. Estaestrategia produce el menor desperdicio de memoria posible.
Peor ajuste: Asigna el hueco ms grande. Una vez ms, se debe de buscar en toda la tabla de huecos a
menos que est organizada por tamao. Esta estrategia produce los huecos de sobra ms grandes, los
cuales pudieran ser de ms uso si llegan procesos de tamao mediano que quepan en ellos.
Se ha demostrado mediante simulacros que tanto el primer y el mejor ajuste son mejores que el peor
ajuste en cuanto a minimizar tanto el tiempo del almacenamiento. Ni el primer o el mejor ajuste esclaramente el mejor en trminos de uso de espacio, pero por lo general el primer ajuste es ms rpido.