Gran Hotel o la gestión de memoria en programación

Hay conceptos que son propios de la ciencia informática. Hay técnicas y herramientas que no dependen de la tecnología en particular que estemos usando. Una de estas técnicas es la gestión de memoria.

Todo ordenador tiene una memoria RAM. La RAM es una memoria muy rápida que es la que usa el procesador para hacer sus operaciones. Toda aplicación de saber gestionar la memoria RAM, para funcionar correctamente.

Se puede equiparar la gestión de memoria con la gestión de un gran hotel. Las habitaciones del hotel son la memoria disponible. Los operadores turísticos (que equivalen a los programas) solicitan a recepción del hotel (que será el sistema operativo) las habitaciones. Una vez que le indican que una habitación está libre, el hotel debe prepararla y eso le lleva un tiempo. Cada operador turístico puede reservar las habitaciones de formas diferentes. Puede llegar un operador y sólo reservar las habitaciones que necesita, o reservar todo lo que va a usar, reservar demás,… Las diferentes formas de reservar afectarán al funcionamiento del hotel.

En lenguajes de programación como el C, es el propio programador el que debe gestionar la memoria. Cuando la aplicación necesita más memoria, por ejemplo 1 Mbyte, el programador solicita memoria al sistema operativo. El sistema operativo busca espacio dentro de la RAM y se lo asigna a la aplicación. En entornos con varias aplicaciones funcionando, este proceso puede ser muy lento. Cuando la aplicación termina de usar dicha memoria, el programador debe indicar al sistema opetativo que está libre. Con lo cual ese 1 Mbyte estará disponible, para otra aplicación.

En la analogía con el hotel sería como si el operador turístico avisara al hotel cada vez que necesita habitaciones y tuviese que avisar cada vez que una habitación quede libre. Puede suceder que se le olvide avisar y se quede una habitación libre, pero sin ocupar. Con lo cual el operador reservará nuevas habitaciones aunque las tenga reservas vacías.

Un fallo habitual de los programadores nóveles, o en las aplicaciones muy complejas, es no hacer correctamente el proceso anterior. Lo más común es no liberar la memoria cuando se termina su uso. Esto da a lugar a que la aplicación vaya consumiendo poco a poco toda la memoria sin dejar espacio para las otras. ¿No os ha sucedido alguna vez que después de usar mucho tiempo una aplicación el sistema se vuelve lento y pesado y hay que cerrar la aplicación y volverla a abrir?

Puesto que la gestión de la memoria es algo tan complejo, una solución es usar un recolector de basura. Un recolector de basura se dedica a reservar memoria para la aplicación y la libera de forma automática cuando ya no es necesaria. La gran ventaja de este método es la comodidad que representa, disminuyendo mucho el tiempo de desarollo de las aplicaciones. Lenguajes como Java, Javascript, Python,… usan esta técnica. Otra ventaja es que la memoria no se libera inmediatamente, por lo que si la aplicación necesita memoria, puede reusar aquella que no liberó. Recordad que solicitar más memoria al sistema operativo puede necesitar mucho tiempo y representar una bajada de rendimiento.

En el caso del hotel es como si el operador turístico se diese una vuelta de vez en cuando por el hotel para decir las habitaciones libres a la recepción. No solicita liberar la reserva de forma inmediata. Por lo que si antes de pasarse a liberar reservas llega un nuevo turista, le puede asignar una de las habitaciones que tiene reservada y vacía.

Los problemas de la recolección de basura son por una parte que la recolección puede comenzar en el momento más inapropiado, penalizando el rendimiento de la aplicación en momentos críticos. Imaginad un programa que controle la temperatura de una central nuclear que se vuelva lento en el momento que esta alcanza un valor crítico. El otro gran problema es que al no liberar la memoria de forma inmediata, la aplicación gasta mucha memoria. La misma aplicación escrita en lenguaje C suele consumir menos memoria que al escribirla en Javascript.

Existe otra forma de gestionar la memoria, el conteo de referencias. Esta técnica se usa, por ejemplo, en los teléfonos iPhone. El conteo de referencias consite en tener un contador asociado a cada parte de la memoria. Cuando la apliación accede a dicha parte, se aumenta en contador en uno. Cuando la aplicación sale de dicha zona de memoria, el contador disminuye en uno. Si el contador llega a cero quiere decir que no se está usando la memoria y se puede liberar. Los programadores de C lo entenderán mejor diciendo que se cuentan cuantos punteros apuntan a la misma zona de la memoria.

En el ejemplo del hotel, es como poner un vigilante en la puerta de cada habitación que se reserve. Cuando el vigilante se da cuenta que la habitación está vacía, inmediatamente baja a recepción para avisar de que la habitación ha quedado libre.

La técnica del conteo de referencias es muy antigua, los programadores de C están acostumbrados a contar los punteros que apuntan al mismo sitio. Esta técnica se usa por ejemplo en las bibliotecas GTK, la base del proyecto GNOME. Lenguajes como Vala la usan de forma automática.

Su mayor ventaja es que la memoria se libera inmediatamente que se detecta que no es necesaria, por lo que las aplicaciones tenderán,a no malgastar mucha memoria (los contadores también ocupan memoria). La otra ventaja es la comodidad al programar, muy similar a la recolección de basura. En un equipo con poca RAM es muy recomendable.

La desventaja es que perdemos rendimiento al tener que solicitar memoria al sistema operativo en lugar de reutilizar la que ya no usamos.

En algunos casos, suele ser muy eficiente usar buffers de memoria. Simplemente consiste en reservar toda la memoria que se prevee que se va a usar al comienzo y no liberarla hasta que hayamos terminado completamente de usarla al final del programa. Si sabemos la cantidad de memoria que necesita la aplicación, tiene muchísimo rendimiento. La desventaja es que posiblemente estemos gastando recursos innecesarios. Cuando la memoria a usar es poca, este es el método más eficiente.

En el ejemplo del hotel es como si el operador turístico reservase todas las habitaciones que va a necesitar durante la temporada, así sus turistas siempre van a tener la habitación disponible.

Como en el caso del hotel, los operadores pueden mezclar las diversas formas de reservar habitaciones, por ejemplo, puede dejar un número fijo de reservas hechas y luego ir pidiendo otras nuevas según se vayan necesitando. Esto también se puede hacer en el caso de la programación real y buscar así un rendimiento óptimo en tu aplicación.

Anuncios
Esta entrada fue publicada en Uncategorized. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s