Sunteți pe pagina 1din 5

Leccion 2 Manejo de Memoria

La asignación de memoria consiste en el proceso de asignar memoria para propósitos espécificos, ya sea
en tiempo de compilación o de ejecución. Si es en tiempo de compilación es estática, si es en tiempo de
ejecución es dinámica y si son variables locales a un grupo de sentencias se denomina automática

Asignación estática de memoria

La Asignación estática de memoria consiste en el proceso de asignar memoria en tiempo de


compilación antes de que el programa asociado sea ejecutado, a diferencia de la asignación dinámica o
la automática donde la memoria se asigna a medida que se necesita en tiempo de ejecución.[2]

Una aplicación de esta técnica conlleva que un módulo de programa (por ejemplo función o subrutina)
declara datos estáticos de forma local, de forma que estos datos son inaccesibles desde otros módulos a
menos que se les pasen referenciados como parámetros o que les sean devueltos por la función. Se
mantiene una copia simple de los datos estáticos, accesible a través de llamadas a la función en la cual
han sido declarados.

El uso de variables estáticas dentro de una clase en la programación orientada a objetos permite que una
copia individual de tales datos se comparta entre todos los objetos de esa clase.

Las constantes conocidas en tiempo de compilación, como literales de tipo cadena, se asignan
normalmente de forma estática. En programación orientada a objetos, el método usual para las tablas de
clases también es la asignación estática de memoria.

Asignación automática de memoria

Las variables automáticas son variables locales a un bloque de sentencias (subrutina, función o
procedimiento). Pueden ser asignadas automáticamente en la pila de datos cuando se entra en el bloque
de código. Cuando se sale del bloque, las variables son automáticamente desasignadas.[3] Las variables
automáticas tendrán un valor sin definir cuando son declaradas, por tanto es buena práctica de
programación inicializarlas con un valor válido antes de usarlas.

Asignación dinámica de memoria


Artículo principal: Memoria dinámica

En ciencia de la computación, asignación dinámica de la memoria es la asignación de almacenamiento


de memoria para utilización por parte de un programa de computador durante el tiempo de ejecución de
ese programa. Es una manera de distribuir la propiedad de recursos de memoria limitada entre muchas
piezas de código y datos. Un objeto asignado dinámicamente permanece asignado hasta que es
desasignado explícitamente, o por el programador o por un recolector de basura; esto es notablemente
diferente de la asignación automática de memoria y de la asignación estática de memoria (la de las
variables estáticas). Se dice que tal objeto tiene tiempo de vida dinámico.[

Estructura de Datos – Leccion 2.1 Manejo de Memoria Página 1


Memoria Estática

La forma más fácil de almacenar el contenido de una variable en memoria en tiempo de ejecución es en
memoria estática o permanente a lo largo de toda la ejecución del programa.

No todos los objetos (variables) pueden ser almacenados estáticamente.

Para que un objeto pueda ser almacenado en memoria estática su tamaño (número de bytes necesarios
para su almacenamiento) ha de ser conocido en tiempo de compilación, como consecuencia de esta
condición no podrán almacenarse en memoria estática:

* Los objetos correspondientes a procedimientos o funciones recursivas, ya que en tiempo de


compilación no se sabe el número de variables que serán necesarias.

* Las estructuras dinámicas de datos tales como listas, árboles, etc. ya que el número de elementos que
las forman no es conocido hasta que el programa se ejecuta.

Las técnicas de asignación de memoria estática son sencillas.

A partir de una posición señalada por un puntero de referencia se aloja el objeto X, y se avanza el
puntero tantos bytes como sean necesarios para almacenar el objeto X.

La asignación de memoria puede hacerse en tiempo de compilación y los objetos están vigentes desde
que comienza la ejecución del programa hasta que termina.

Estructura de Datos – Leccion 2.1 Manejo de Memoria Página 2


En los lenguajes que permiten la existencia de subprogramas, y siempre que todos los objetos de estos
subprogramas puedan almacenarse estáticamente se aloja en la memoria estática un registro de
activación correspondiente a cada uno de los subprogramas.

Estos registros de activación contendrán las variables locales, parámetros formales y valor devuelto por
la función.

Dentro de cada registro de activación las variables locales se organizan secuencialmente. Existe un solo
registro de activación para cada procedimiento y por tanto no están permitidas las llamadas recursivas.
El proceso que se sigue cuando un procedimiento p llama a otro q es el siguiente:

1. p evalúa los parámetros 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 código máquina han de
realizarse sobre alguna zona de memoria temporal. (En algún momento debe haber una zona de memoria
que contenga el valor intermedio 15, y el valor intermedio 4 para sumarlos a continuación). En caso de
utilización de memoria estática ésta zona de temporales puede ser común a todo el programa, ya que su
tamaño puede deducirse en tiempo de compilación.

2. q inicializa sus variables y comienza su ejecución.

Dado que las variables están permanentemente en memoria es fácil implementar la propiedad de que
conserven o no su contenido para cada nueva llamada

Memoria Dinámica

¿Qué es la memoria dinámica?

Supongamos que nuestro programa debe manipular estructuras de datos de longitud desconocida. Un
ejemplo simple podría ser el de un programa que lee las líneas de un archivo y las ordena. Por tanto,
deberemos leer un número indeterminado de líneas, y tras leer la última, ordenarlas. Una manera de
manejar ese ``número indeterminado'', sería declarar una constante MAX_LINEAS, darle un valor
vergonzosamente grande, y declarar un array de tamaño MAX_LINEAS. Esto, obviamente, es muy
ineficiente (y feo). Nuestro programa no sólo quedaría limitado por ese valor máximo, sino que además
gastaría esa enorme cantidad de memoria para procesar hasta el más pequeño de los ficheros.

La solución consiste en utilizar memoria dinámica. La memoria dinámica es un espacio de


almacenamiento que se solicita en tiempo de ejecución. De esa manera, a medida que el proceso va
necesitando espacio para más líneas, va solicitando más memoria al sistema operativo para guardarlas.
El medio para manejar la memoria que otorga el sistema operativo, es el puntero, puesto que no
podemos saber en tiempo de compilación dónde nos dará huecos el sistema operativo (en la memoria de
nuestro PC).

Estructura de Datos – Leccion 2.1 Manejo de Memoria Página 3


Memoria Dinámica.

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 función g_malloc posibilita la reserva de una zona de memoria, con un número de bytes que le
pasemos como parámetro. Además, también existe una función similar llamada g_malloc0 que, no sólo
reserva una zona de memoria, sino que, además, llena esa zona de memoria con ceros, lo cual nos puede
beneficiar 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 cómo se
hace en los lenguajes orientados a objetos.

Liberación 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,
básicamente, 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 dinámicas, es necesario
ajustar el tamaño de una zona de memoria (ya sea para hacerla más grande o más pequeña). Para eso,
GLib ofrece la función g_realloc, que recibe un puntero a memoria que apunta a una región que es la
que será acomodada al nuevo tamaño y devuelve el puntero a la nueva zona de memoria. El anterior
puntero es liberado y no se debería utilizar más:

gpointer g_realloc (gpointer memoria_reservada , gulong numero_de_bytes );

Asignación dinámica

El proceso de compactación del punto anterior es una instancia particular del problema de asignación de
memoria dinámica, el cual es el cómo satisfacer una necesidad de tamaño n con una lista de huecos
libres. Existen muchas soluciones para el problema. El conjunto de huecos es analizado para determinar
cuál hueco es el más indicado para asignarse. Las estrategias más comunes para asignar algún hueco de
la tabla son:

Estructura de Datos – Leccion 2.1 Manejo de Memoria Página 4


Primer ajuste: Consiste en asignar el primer hueco con capacidad suficiente. La búsqueda puede iniciar
ya sea al inicio o al final del conjunto de huecos o en donde terminó la última búsqueda. La búsqueda
termina al encontrar un hueco lo suficientemente grande.

Mejor ajuste: Busca asignar el espacio más pequeño de los espacios con capacidad suficiente. La
búsqueda se debe de realizar en toda la tabla, a menos que la tabla esté ordenada por tamaño. Esta
estrategia produce el menor desperdicio de memoria posible.

Peor ajuste: Asigna el hueco más grande. Una vez más, se debe de buscar en toda la tabla de huecos a
menos que esté organizada por tamaño. Esta estrategia produce los huecos de sobra más grandes, los
cuales pudieran ser de más uso si llegan procesos de tamaño 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 es
claramente el mejor en términos de uso de espacio, pero por lo general el primer ajuste es más rápido.

Estructura de Datos – Leccion 2.1 Manejo de Memoria Página 5

S-ar putea să vă placă și