educación, informática y demás

Gestión de memoria

Sabemos que para que un programa pueda ejeuctarse, pasando a ser un proceso, necesita cargarse en memoria principal. Esto es así, como ya sabemos, porque la CPU solo puede ejecutar instrucciones que estén en memoria principal. Lo mismo pasa con los datos que utilicen estos programas, deben estar accesibles en memoria principal.

Hoy en día la mayoría de los SSOO con los que trabajamos son SSOO multitarea y multiusuario, es decir tendremos muchos procesos en ejecución y posiblemente de distintos usuarios.

Sin embargo, tenemos una única memoria principal en la qu ese deberán guardar de forma controlada tanto las instrucciones como los datos de todos y cada uno de los procesos en ejecución, sin que haya problemas de accesos indebidos. Todo esto lo debe gestionar el sistema operativo, como ya sabemos.

La parte del sistema operativo que se encarga de esta gestión de se denomina gestor de memoria.

Para poder gestionar la memoria, tarea bastante compleja, se han ido desarrollando una serie de técnicas que han solucionando los problemas de gestión de memoria con los que se enfrentaban los sistemas operativos durante su evolución. Se han utilizando distintos mecanismos para gestionar la memoria principal, pudiendo asignar porciones de memoria distintos a los procesos en ejecución.

Vamos a repasar los principales mecanismos utilizados a lo largo de la historia y analizaremos las bases de los utilizados hoy en día.

Sistemas operativos monotarea

Toda la memoria libre disponible.

En este primer escenario como solo se podía ejecutar un proceso a la vez, toda la memoria libre estaba disponible para ser asignada al único proceso en ejecución.

Así pues la gestión de memoria era muy simple, bastaba con comprobar si la memoria libre era suficiente para albergar al programa que se iba a ejecutar. Si hay espacio libre, se asigna la memoria que solicita el proceso y se espera a que termine su ejecución para poder ejecutar otro programa.

En memoria principal, aparte del proceso que se ejecute, estará el Sistema Operativo.

Sistemas Operativos Multitarea

Particiones de memoria estática

Consiste en dividir la memoria en particiones o porciones fijas de memoria. No tienen porque ser todas del mismo tamaño. Cuando un proceso solicita memoria, se le asigna la partición de memoria más pequeña en la que cabe. Una vez asignada una partición de memoria a un proceso, esta no se libera hasta que el proceso no acabe.

Es el sistema operativo el que decide el tamaño de las particiones de memoria que va a utilizar. Recuerda que la memoria principal está dividida físicamente en celdas, y es el sistema operativo el que puede decidir el tamaño y el número de las particiones que ususará en base a estadísticas de uso.

La ventaja de este mecanismo es que muy sencillo de implementar. Se divide la memoria principal en una serie de particiones y se van asignando a los procesos cuando solicitan espacio en memoria en función de su tamaño.

Las desventajas son:

  1. Genera fragmentación interna. Al ser particiones estáticas, predefinidas, si un proceso solicita una cantidad de memoria menor que el de alguna de las particiones libres, se desaprovechará una parte de la partición asignada.
  2. Podemos tener una cantidad de memoria libre suficiente para albergar un nuevo proceso, pero al estar en particiones distintas no se puede asignar al proceso que la solicita.

Particiones de memoria dinámicas

Hay que solucionar el problema de la fragmentación externa…

Segmentación

La segmentación es un mecanismo de gestión de memoria que trata de solucionar el problema de las particiones de memoria dinámicas.

La idea detrás de la segmentación es que un programa está compuesto por varias partes o segmentos. Todo programa tendrá una parte de código, donde están sus instrucciones. Además tendrá una parte de datos, donde estarán los datos con los que trabaja. También utilizará una parte denominada de pila y otra de heap o memoria alta.

….

Memoria virtual

La memoria virtual es una técnica de asginación de memoria que consiste en tomar una porción de memoria secundaria para almacenar páginas de memoria que no estén en uso. De esta forma, se amplía la capacidad de almacenamiento de páginas de memoria en el sistema.

La idea está en mantener en los márcos de página de memoria principal tan solo las páginas de los procesos en ejecución que estén en uso. Cuando sea necesario utilizar una página de un proceso que no esté en memoeria principal, el sistema operativo se encarga de cargarlo a memoria principal.

Si no hay marcos de página libres, el sistema operativo se tiene que encargar de seleccionar una página de memoria para guardarla en esa zona reservada de memoria secundaria para hacer un hueco en el que se cargará la nueva página solicitada. Este proceso se denomina intercambio de memoria o swapping.

Tanto los sistemas operativos Windows como GNU/Linux utilizan técnicas de memoria virtual para poder mantener en ejecución un número de procesos mayor que el que podrían ejectuar si no utilizaran esta técnica.

En Windows la memoria virtual se implementa utilizando un fichero llamado pagefile.sys que está en el raíz de la undiad C:, por defecto, y es oculto y de sistema.

En GNU/Linux se utiliza, generalmente, una partición especial llamada partición de swap. También se podría utilizar un fichero de swap.