Administración de Memoria
La memoria es uno de los
principales recursos de la computadora, la cual debe de administrarse con mucho
cuidado. Aunque actualmente la mayoría de los sistemas de cómputo cuentan con
una alta capacidad de memoria, de igual manera las aplicaciones actuales tienen
también altos requerimientos de memoria, lo que sigue generando escasez de
memoria en los sistemas multitarea y/o multiusuario.
La parte del sistema operativo
que administra la memoria se llama administrador de memoria y su labor consiste
en llevar un registro de las partes de memoria que se estén utilizando y
aquellas que no, con el fin de asignar espacio en memoria a los procesos cuando
éstos la necesiten y liberándola cuando terminen, así como administrar el
intercambio entre la memoria principal y el disco en los casos en los que la
memoria principal no le pueda dar capacidad a todos los procesos que tienen
necesidad de ella.
Los sistemas de administración
de memoria se pueden clasificar en dos tipos: los que desplazan los procesos de
la memoria principal al disco y viceversa durante la ejecución y los que no.
El propósito principal de una
computadora es el de ejecutar programas, estos programas, junto con la
información que accesan deben de estar en la memoria principal (al menos
parcialmente) durante la ejecución.
Para optimizar el uso del CPU
y de la memoria, el sistema operativo debe de tener varios procesos a la vez en
la memoria principal, para lo cual dispone de varias opciones de administración
tanto del procesador como de la memoria. La selección de uno de ellos depende
principalmente del diseño del hardware para el sistema. A continuación se
observarán los puntos correspondientes a la administración de la memoria.
La memoria real o principal es
en donde son ejecutados los programas y procesos de una computadora y es el
espacio real que existe en memoria para que se ejecuten los procesos. Por lo
general esta memoria es de mayor costo que la memoria secundaria, pero el
acceso a la información contenida en ella es de más rápido acceso. Solo la
memoria cache es más rápida que la principal, pero su costo es a su vez mayor.
Sin intercambio
Monoprogramación sin
intercambio o paginación
Cuando solo se tiene un
proceso que ocupe la memoria a la vez, el esquema de la administración de la memoria
es el más sencillo que hay. Sin embargo, éste método ya no tiene aplicación en
la actualidad, ya que era visto en las computadoras con sistemas operativos de
un solo usuario y una sola tarea. El usuario introducía su disco a la
computadora (por lo general, la máquina no contaba con disco duro) y ejecutaba
su aplicación, la cual acaparaba toda la máquina.
Multiprogramación y uso de
memoria
Esta organización facilita la
programación de una aplicación al dividirla en dos o más procesos. Además
ofrece la capacidad de tener más de un proceso a la vez en memoria así puede
ofrecer servicios a varios usuarios a la vez.
El esquema de
multiprogramación incrementa el aprovechamiento del CPU, dado que a diferencia
de la monoprogramación en donde solo un proceso reside en memoria a la vez
limitando el uso del procesador a las llamadas que requiera dicho proceso,
desperdiciando un promedio del 80% del tiempo del procesador. En cambio la
multiprogramación, al tener varios procesos en la memoria principal y
dividiéndose el tiempo de uso del procesador, logra reducir drásticamente el
desperdicio del procesador.
Multiprogramación con
particiones fijas
Para poder implementar la
multiprogramación, se puede hacer uso de particiones fijas o variables en la
memoria. En el caso de las particiones fijas, la memoria se puede organizar
dividiéndose en diversas partes, las cuales pueden variar en tamaño. Esta
partición la puede hacer el usuario en forma manual, al iniciar una sesión con
la máquina.
Una vez implementada la
partición, hay dos maneras de asignar los procesos a ella. La primera es
mediante el uso de una cola única (figura 2a) que asigna los procesos a los
espacios disponibles de la memoria conforme se vayan desocupando. El tamaño del
hueco de memoria disponible es usado para localizar en la cola el primer
proceso que quepa en él. Otra forma de asignación es buscar en la cola el
proceso de tamaño mayor que se ajuste al hueco, sin embargo hay que tomar en
cuenta que tal método discrimina a los procesos más pequeños. Dicho problema
podría tener solución si se asigna una partición pequeña en la memoria al
momento de hacer la partición inicial, el cual sería exclusivo para procesos
pequeños.
Multiprogramación con
particiones variables
Este esquema fue originalmente
usado por el sistema operativo IBM OS/360 (llamado MFT), el cual ya no está en
uso.
El sistema operativo lleva una
tabla indicando cuáles partes de la memoria están disponibles y cuáles están
ocupadas. Inicialmente, toda la memoria está disponible para los procesos de
usuario y es considerado como un gran bloque o hueco único de memoria. Cuando
llega un proceso que necesita memoria, buscamos un hueco lo suficientemente
grande para el proceso. Si encontramos uno, se asigna únicamente el espacio
requerido, manteniendo el resto disponible para futuros procesos que requieran
de espacio.
Consideremos el ejemplo de la
figura 3, en donde se cuenta un espacio reservado para el sistema operativo en
la memoria baja de 400K y un espacio disponible para procesos de usuario de
2160K, siendo un total de memoria del sistema de 2560K. Dada la secuencia de
procesos de la figura y usando un algoritmo de First Come – First Served
(FCFS) se puede asignar de inmediato memoria a los procesos P1, P2 y P3,
creando el mapa de memoria de la figura 4(a) en el cual queda un hueco de 260K
que ya no puede ser utilizado por el siguiente proceso dado que no es
suficiente para abarcarlo.
Compactación de memoria
Cuando un proceso llega y
necesita memoria, el sistema operativo busca en la tabla de huecos alguno lo
suficientemente grande para el proceso. Si el hueco es muy grande, lo parte en
dos. Una parte es asignada al proceso y la otra se identifica como hueco.
Cuando el proceso termina y la memoria es liberada, el espacio es identificado
como un hueco más en la tabla y si el nuevo hueco es adyacente con otro, ambos
huecos se unen formando un solo hueco más grande. En ese momento se debe de
checar si no existen procesos a los que este nuevo hueco pueda darles cabida.
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:
- 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.
Algoritmo de reemplazo "Primero en entrar, primero en salir" (FIFO)
Memoria virtual
Paginación
Hasta ahora, los métodos que
hemos visto de la administración de la memoria principal, nos han dejado con un
problema: fragmentación, (huecos en la memoria que no pueden usarse debido a lo
pequeño de su espacio) lo que nos provoca un desperdicio de memoria principal.
Una posible solución para la
fragmentación externa es permitir que espacio de direcciones lógicas lleve a
cabo un proceso en direcciones no contiguas, así permitiendo al proceso
ubicarse en cualquier espacio de memoria física que esté disponible, aunque
esté dividida. Una forma de implementar esta solución es a través del uso de un
esquema de paginación. La paginación evita el considerable problema de ajustar
los pedazos de memoria de tamaños variables que han sufrido los esquemas de
manejo de memoria anteriores. Dado a sus ventajas sobre los métodos previos, la
paginación, en sus diversas formas, es usada en muchos sistemas operativos.
Al utilizar la memoria
virtual, las direcciones no pasan en forma directa al bus de memoria, sino que
van a una unidad administradora de la memoria (MMU –Memory Management Unit).
Estas direcciones generadas por los programas se llaman direcciones virtuales y
conforman el hueco de direcciones virtuales. Este hueco se divide en unidades
llamadas páginas. Las unidades correspondientes en la memoria física se llaman
marcos para página o frames. Las páginas y los frames tienen siempre el
mismo tamaño.
Tablas de páginas
Cada página tiene un número
que se utiliza como índice en la tabla de páginas, lo que da por resultado el
número del marco correspondiente a esa página virtual. Si el bit presente /
ausente es 0, se provoca un señalamiento (trap) hacia el sistema
operativo. Si el bit es 1, el número de marco que aparece en la tabla de
páginas se copia en los bits de mayor orden del registro de salida, junto con
el ajuste (offset) de 12 bits, el cual se copia sin modificaciones de la
dirección virtual de entrada. Juntos forman una dirección física de 15 bits. El
registro de salida se coloca entonces en el bus de la memoria como la dirección
en la memoria física.
Algoritmos de reemplazo de
páginas
Con el uso del método de
paginación se puede llegar a saturar la memoria si se incrementa demasiado el
nivel de multiprogramación. Por ejemplo, si se corren seis procesos, cada uno
con un tamaño de diez páginas de las cuales en realidad sólo utiliza cinco, se
tiene un mayor uso del CPU y con marcos de sobra. Pero pudiera suceder que cada
uno de esos procesos quiera usar las diez páginas resultando en una necesidad
de 60 marcos, cuando solo hay 40 disponibles.
Esto provoca sobre-asignación
y mientras un proceso de usuario se está ejecutando, ocurre un fallo de página.
El hardware se bloquea con el sistema operativo, el cual checa en sus tablas
internas y se da cuenta que es un fallo de página y no un acceso ilegal de
memoria. El sistema operativo determina si la página está residiendo en disco,
pero también determina que no hay marcos de memoria disponibles en la lista de
marcos libres.
Al ocurrir el fallo de página, el sistema operativo debe elegir una página para retirarla de la memoria y usar el espacio para la página que se necesita para desbloquear el sistema y que el hardware pueda seguir trabajando. Si la página por eliminar de la memoria fue modificada, se debe volver a escribir al disco para mantener la información actualizada; de lo contrario, si la página no fue modificada no es necesario rescribir la información a disco y la página que se carga simplemente se escribe sobre la página a borrar en memoria. La figura 8 muestra gráficamente un intercambio de páginas entre la memoria principal y el disco (memoria secundaria).
Al ocurrir el fallo de página, el sistema operativo debe elegir una página para retirarla de la memoria y usar el espacio para la página que se necesita para desbloquear el sistema y que el hardware pueda seguir trabajando. Si la página por eliminar de la memoria fue modificada, se debe volver a escribir al disco para mantener la información actualizada; de lo contrario, si la página no fue modificada no es necesario rescribir la información a disco y la página que se carga simplemente se escribe sobre la página a borrar en memoria. La figura 8 muestra gráficamente un intercambio de páginas entre la memoria principal y el disco (memoria secundaria).
Algoritmo de reemplazo "Primero en entrar, primero en salir" (FIFO)
El algoritmo más sencillo para
remplazo de páginas es el FIFO (First In – First Out). Este algoritmo asocia a
cada página el momento en que ésta fue traída a memoria. Cuando una página debe
ser reemplazada se selecciona a la más antigua.
No es estrictamente necesario registrar el momento
de entrada de la página a memoria, sino que se puede crear una cola en la que
se van agregando las páginas conforme van llegando a la memoria. Cuando se debe
eliminar una página, se selecciona la que está al frente de la lista (o sea, la
más antigua de la lista). Cuando llega una página nueva, se inserta en la parte
trasera de la cola.
No hay comentarios:
Publicar un comentario