GESTION DE LA MEMORIA

OS/2, como cualquier Sistema Operativo multitarea, mantiene un estricto control sobre la memoria usada por cada programa. Esto es así porque un programa que sobreescribiese la memoria de otro lo haría fallar con casi total seguridad. OS/2 hace uso del modo protegido de los microprocesadores 386 y superiores para asegurar que cada programa tenga acceso solo a sus bloques de memoria, y no pueda machacar el contendido de otra zona. A la vez, se encarga de intercambiar zonas de memoria entre la RAM y el disco duro, implementando así un sistema de memoria virtual eficiente, con lo que puede ejecutar programas más largos que los que la memoria física del ordenador permitiría.

Las funciones de asignación y desasignación dinámica de memoria son extremadamente útiles en programas en los que no sepamos la cantidad de esta que vamos a necesitar. Un ejemplo puede ser una zona de memoria para descomprimir imágenes en un visualizador: dado que cada una puede medir cualquier longitud, reservar una cantidad excesiva de forma estática hace al programa lento, y reservar poca puede impedir visualizar imágenes grandes. La solución es comprobar el tamaño de la imagen y reservar una zona de memoria dinámica acorde con este, liberandola al terminar.

DosAllocMem
DosFreeMem

Otra función es la de crear zonas de memoria compartida. Se trata de bloques de memoria a los que pueden acceder dos procesos distintos de forma simultánea, y se usan para intercambiar grandes cantidades de información de forma rápida, y para compartirla.

Existen dos formas de compartir un bloque de memoria: una es mediante un nombre que refiera a ese bloque; otra es mediante un puntero que señale a su inicio.

DosAllocSharedMem

En el primer caso, se debe especificar un nombre para el bloque que cumpla el convenio de nombres de ficheros de OS/2, y además debe empezar por \SHAREMEM\. Por ejemplo, un nombre válido sería \SHAREMEM\BLOQUE.DAT.

DosGetNamedSharedMem

Si no se especifíca un nombre, la memoria solo podrá ser compartida mediante el intercambio de un puntero que señale al inicio del bloque. Si ambos procesos conocen este valor, podrán acceder a dicho bloque pidiendolo o asignandolo. Para comunicarlo, es necesario usar la comunicación entre procesos, que veremos más adelante.

DosGetSharedMem
DosGiveSharedMem

Subasignación de memoria

La asignación de memoria es una parte muy importante en cualquier sistema operativo. Da a los programas la capacidad de adaptarse dinámicamente a las necesidades de cada momento. Sin embargo, hay un coste relativamente elevado en la asignación de memoria dinámica. En cada petición es preciso buscar una zona libre, cambiar los descriptores de segmento, y cargar los registros de nuevo. Todo esto lleva un tiempo muy elevado, debido a la propia arquitectura del microprocesador. Lo mismo ocurre al liberar una zona. De aquí se saca una conclusión clara: utiliza toda la memoria que necesites, pero evita asignar y desasignar constantemente bloques. La solución consiste en asignar un bloque de tamaño moderado y dentro de él subasignar bloques de tamaño más pequeño, aumentando el tamaño del bloque físico sólo cuando se necesita más espacio.

Para ayudar en esto, OS/2 ofrece un grupo completo de subasignación de memoria.

DosSubAllocMem
DosSubFreeMem
DosSubSetMem
DosSubUnsetMem

La primera acción consiste en reservar un bloque de memoria con DosAllocMem. Este bloque de memoria es necesario prepararlo para subasignación con DosSubSetMem. Una vez hecho esto, podemos asignar y desasignar pequeños bloques con DosSubAllocMem y DosSubFreeMem como si usásemos las llamadas de siempre, pero con la diferencia de que será notablemente más rápido. Sin embargo, no debemos olvidar que se trata de un solo bloque de memoria subdividido, por lo que aunque tengamos subasignado un bloque, podemos salirnos de él por accidente sin que el sistema dé un error (siempre, claro está, que no nos salgamos de la memoria asignada).

Debemos ver las funciones de subasignación de memoria simplemente como una ayuda en la gestión de ésta. Para cualquier aplicación es exactamente lo mismo dividir nosotros mismos un bloque de memoria de forma lógica que usar estas funciones. La ventaja consiste en que nos ahorramos programar un grupo de funciones que compruebe cuanto espacio nos queda libre y en donde y actualice las estructuras. Se trata de una ganancia en comodidad. Una aplicación clara de estas funciones se verá cuando expliquemos las colas de mensajes, pues en ellas se hace uso intensivo de pequeños bloques de memoria que se crean y liberan constantemente.

Pagina anterior  Indice  Pagina siguiente