Leccion 2.1 Manejo de Memoria

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.