1. ADMINISTRACIÓN Y MANEJO DE LA MEMORIA
Adaptado por:
GIOVANNI ANDRÉS TOVAR CLAVIJO
Sistemas Operativos
2. Administración y manejo de la memoria
Relocalización
Encadenamiento
Carga
Sin intercambio ni paginación
Segmentación
Algoritmos de sustitución de paginas
Aspectos de diseño para sistemas de paginación
3. Introducción
La memoria física de un computador es comúnmente dividida en dos áreas,
memoria del monitor residente y memoria del usuario. El problema
principal de este esquema es el proporcionar una protección eficiente que
evite que programas del usuario modifiquen (accidentalmente o
intencionalmente) código o datos del monitor residente, ya que esto dejaría
fuera de acción al sistema operativo. Existen varias soluciones a este
problema, pero el mas común es el de utilizar un registro limite de dirección
comúnmente llamado "registro barrera" (fence register), en el cual se coloca
la dirección de la primera posición de memoria que un programa del usuario
puede utilizar.
Cada dirección generada por una instrucción o dato de un programa, es
comparada con el contenido del registro barrera. Si la dirección generada es
mayor o igual que la barrera, entonces la direcci6n es valida ya que
comprende alguna localidad de la memoria del usuario. En caso contrario,
se trata de una referencia ilegal, por lo que se genera una interrupción al
S.O. para que maneje este tipo de error (generalmente imprime un letrero y
aborta el programa)
4. Introducción
La dirección del registro de barrera puede ser cambiado según las
necesidades de memoria, por ejemplo si crece el monitor residente al
actualizarlo.
Otro problema a considerar es la carga en memoria de los programas del
usuario. Aunque la dirección de la memoria del computador empieza en
00000, la primera dirección del programa del usuario no puede ser 00000,
sino la primera direcci6n mas allá de la barrera. Una de las formas de
corregir esto es al tiempo de compilación, ya que si se conoce la direcci6n de
la barrera, se pueden generar direcciones absolutas que comiencen y se
extiendan a partir de la barrera. Sin embargo, si la dirección de la barrera
cambia, es necesario recompilar el programa para poder ser corrido
nuevamente.
5. Relocalización
Una mejor alternativa al método de direcciones absolutas, consiste en
generar direcciones relativas o re localizables, las cuales no toman en
cuenta el valor de la barrera al momento de compilación, sino que la
correcci6n es diferida hasta el tiempo de carga o de ejecución del
programa. En el primer método, al momento de cargar el programa
en memoria, el valor de la barrera es sumado a todas las direcciones
en que debería cargarse cada instrucción o dato del programa, así
como también a las direcciones a las que hace referencia cada
instrucci6n (variables del programa), de tal forma que siempre se
tengan direcciones a partir de la barrera.
Este método funciona siempre y cuando la barrera no cambie durante
la ejecución del programa, sino solamente antes de correr el programa
(p.e. entre programa y programa). Debido a esta condición de barrera
estática, se dice que se tiene "Relocalización Estática". En muchos
casos, los sistemas operativos cuentan con partes transitorias que se
pueden eliminar y volver a cargar.
6. Relocalización
Por ejemplo, en los casos en que algún manejador de dispositivo no se utilice
frecuentemente, puede ser quitado para utilizar ese espacio de memoria
para programas del usuario, y volver a cargarlo cuando sea requerido por
algún programa en ejecución. Este esquema, hace que sea necesario cambiar
la direcci6n de la barrera incluso durante la ejecución de un programa. Una
solución a este problema es cargar el programa en memoria igual que en el
método anterior, sumándole el valor de la barrera a todas las direcciones
generadas por el compilador, excepto a las direcciones a que hacen
referencia las instrucciones del programa (variables); estas son dejadas tal
cual. La corrección es hecha hasta el momento en que al ser ejecuta cada
instrucción en la CPU y se genere un intento de accesar la memoria.
En ese momento, a la direcci6n generada le es sumado el valor de la barrera y
luego es enviada a la memoria. Por lo tanto, el usuario siempre trabaja con
direcciones lógicas (las generadas por el compilador), y el hardware de
relocalización se encarga de generar direcciones físicas.
7. Relocalización
Por ejemplo si la barrera se encuentra en 1700, cualquier intento de accesar
la localidad 0000, será automáticamente relocalizada a 1700. Un acceso a la
localidad 515, será relocalizada a la 2215.
A este sistema se le llama relocalización dinámica ya que la barrera puede
ser cambiada en cualquier momento. Por lo tanto, si es necesario cambiar la
barrera, solo es necesario cambiar el contenido del registro base, y trasladar
el programa del usuario a las nuevas localidades de memoria relativas a la
nueva barrera, y continuar con la ejecuci6n del programa.
Sin embargo, si cargamos mas de un programa en el área del usuario, los
sistemas anteriormente vistos ya no proporcionan la protección debida, ya
que si bien el S. 0. queda protegido, los programas de los usuarios no.
8. Relocalización
Si ejecutamos el programa del usuario, es posible que este pueda modificar
el código o los datos de los programa 2 y 3. Si movemos la barrera hasta el
inicio del programa 2, el programa 1 queda protegido al igual que el monitor;
sin embargo, el programa 3 queda aun desprotegido.
0
Barrera
MONITOR
Usuario 1
Usuario 2
Usuario 3
Una solución a este problema, es utilizar dos registros para delimitar
plenamente la memoria del programa en ejecución.
9. Relocalización
0
MONITOR
Límite Inferior
Usuario 1
Barrera
Límite Superior
Usuario 2
Usuario 3
Los limites se implementan con registros igual que anteriormente. De esta
manera, si el programa en ejecución es el 2, el monitor y el programa 1
quedan protegidos por el limite inferior, mientras que el programa 3 queda
protegido por el limite superior. Una vez finalizada la ejecución del
programa 1, los registros son movidos al programa 2, y así sucesivamente .
Este esquema de cambio de barreras obviamente requiere un sistema de
relocalización dinámica.
10. Relocalización
El registro de limite checa por el limite superior que puede generar un
programa antes de ser relocalizado dinámicamente por el registro base
mientras que el limite inferior queda definido por la dirección 0000 que
generan los compiladores.
El use del esquema anteriormente mencionado u otros similares permiten
tener mas de un usuario residente en memoria simultáneamente, ya que es
posible dividir la memoria en múltiples regiones llamadas particiones.
Dos posibles métodos se derivan de este esquema:
Múltiples particiones contiguas fijas
Múltiples particiones contiguas variables.
11. Múltiples particiones contiguas fijas
En esta opción, se seleccionan regiones fijas de memoria para crear
procesos, por ejemplo una región de 10 K bytes para procesos muy
pequeños, regiones de 20 K para procesos de tamaño promedio, y 50 K para
procesos grandes.
Cuando un proceso llega del exterior, es puesto en la cola de procesos o
spool manejada por el asignador de procesos, cuando le toca su turno
(generalmente FIFO), la cantidad de memoria que requiere es tomada en
cuenta y es comparada contra las regiones de memoria vacías; si el proceso
puede ser cargado en alguna de ellas lo hace, pero si no, entonces busca el
siguiente que pueda ser cargado en las regiones disponibles. Para saber que
regiones de memoria están disponibles, se implementa una lista llamada
"cola de regiones de memoria disponibles", en la cual se anota la cantidad de
memoria del hueco libre y la direcci6n donde inicia.
12. Múltiples particiones contiguas fijas
El asignador de procesos también busca optimizar el desperdicio de
memoria; es decir, no cargar programas muy pequeños en regiones muy
grandes ya que estas son fijas. A este desperdicio se le llama fragmentación
interna.
0
COLA DE PROCESOS
MONITOR
33 K
Región de 15k
Proceso de 12k
7K 50K 40K 15K 12K 25K
Región de 30k
Proceso de 25k
128 k
Región de 50k
Proceso de 40k
13. Múltiples particiones contiguas fijas
Como puede verse, el primer proceso puede ser cargado en la región de 30K
con una fragmentación de 5K, el de 12K en la de 15K con fragmentación de 3,
el de 15K tendrá que esperar a que se desocupe la región de 15K (o decidir
cargarla en la de 40K con gran fragmentación), la de 40K puede ser cargada
en la de 50K con un desperdicio de 10K, y las de 50K y 7K tendrán que
esperar a que alguna regi6n adecuada se desocupe.
0
COLA DE PROCESOS
MONITOR
33 K
Región de 15k
Proceso de 12k
7K 50K 40K 15K 12K 25K
Región de 30k
Proceso de 25k
128 k
Región de 50k
Proceso de 40k
14. Múltiples particiones contiguas variables
El problema con particiones fijas es determinar los mejores tamaños de
regiones para minimizar la fragmentación interna y externa. Sin embargo,
con un conjunto de procesos dinámicos, es poco probable llegar a una
condición optima. La solución a este problema es permitir que las regiones
varíen de tamaño dinámicamente.
Esta solución es llamada múltiples particiones contiguas variables. Esta
forma de manejo de memoria consiste en tener una cola de regiones de
memoria que están disponibles. Al inicio se tiene un solo bloque de
memoria para programas del usuario que resulta de cargar el Sistema
Operativo en la memoria disponible. Cuando los procesos llegan, se checa
en la cola de regiones de memoria disponibles si se puede cargar el proceso.
Si la regi6n es muy grande, solo se asigna la necesaria y el resto es puesto en
la cola de regiones de memoria disponibles.
15. Múltiples particiones contiguas variables
Por ejemplo asuma que los siguientes procesos requieren servicio (memoria
total 256K):
COLA DE PROCESOS
No. de procesos
1
2
3
4
5
Memoria Requerida (K)
60
100
30
70
50
Tiempo Ráfaga
10
5
20
8
15
Si el algoritmo usado es del tipo primero en llegar primero en salir, podemos
cargar a memoria los 3 primeros procesos:
16. Múltiples particiones contiguas variables
COLA DE PROCESOS
No. de procesos
Memoria Requerida (K)
1
2
3
4
5
60
100
30
70
50
0
40 K
100 K
200 K
230 K
256 K
Tiempo Ráfaga
10
5
20
8
15
MONITOR
Proceso 1
Proceso 2
Proceso 3
###############
17. Múltiples particiones contiguas variables
La cola de regiones de memoria disponible queda con un hueco de 26K; sin
embargo, en ese hueco no es posible cargar ya ninguno de los procesos
pendientes, por lo que se dice que tenemos una fragmentación externa de
26K. Al terminar el proceso 2, regresa a la cola de regiones de memoria
disponibles un área de 100K en la cual podemos cargar el proceso 4 de 70K,
regresando a la cola el área restante de 30K.
La cola de regiones de memoria disponibles queda: 26, 30 con sus
respectivas direcciones de inicio. Como el proceso 5 no se puede cargar, nos
deja una fragmentación externa de 56K. El siguiente en terminar es el
proceso 1, permitiéndonos cargar el proceso 5 en el área de 60K dejado por el
proceso 1, y poniendo en la cola de regiones de memoria disponibles el área
no usada (10K). La cola de regiones de memoria nos queda: 26, 30, 10 con sus
respectivas direcciones.
18. Múltiples particiones contiguas variables
Como ya no hay procesos que cargar, no podemos afirmar que se tenga una
fragmentación externa de 66K. Esto dependerá de que se pueda cargar o no
el siguiente proceso que llegue. En caso negativo, entonces se tiene
efectivamente una fragmentación externa de 66K.
El esquema anterior, requiere de una estrategia para asignar los huecos de
memoria disponibles.
En general se tienen 3 algoritmos:
"Primero en ajustar" (first-fit)
"Mejor en ajustar" (best-fit)
"Peor en ajustar" (worst-fit).
19. Múltiples particiones contiguas variables
"PRIMERO EN AJUSTAR" (First Fit). Carga el programa en el primer
hueco suficientemente grande que encuentra en la lista de regiones de
memoria disponibles. Es el algoritmo mas rápido.
"MEJOR EN AJUSTAR" (Best Fit). Busca por el hueco de memoria que
menos fragmentaci6n produzca. Si la lista de regiones de memoria
disponibles es mantenida en orden ascendente, es fácil y rápido encontrar la
mas adecuada. De otra manera debemos buscar toda la lista.
"PEOR EN AJUSTAR" (Wosrt Fit). Carga el programa en el hueco mas
grande que encuentra y deja en la lista de regiones disponibles el tamaño del
resto de la memoria no usada. Esta estrategia a veces rinde mejores
resultados que la de mejor en caber, ya que produce huecos grandes de
fragmentaci6n que pueden ser mejor utilizados que fragmentaciones muy
pequeñas. Es adecuado mantener la lista ordenada de mayor a menor para
reducir el tiempo de búsqueda. El hardware usado para este sistema es
exactamente el mismo; es decir, dos registros que delimitan perfectamente
el área del programa a ejecutar.
20. Múltiples particiones contiguas variables
COMPACTACIÓN :
En la última parte del ejemplo, existe una fragmentación de 66K compuesta
por 3 huecos de 10, 30 y 26K, los cuales son mas difíciles de usar que si
fueran un solo bloque de 66K. Sin embargo, es posible compactar la
memoria haciendo que todos los huecos disponibles se junten ya sea en la
parte de abajo o del medio de la memoria.
Para efectuar la compactación, es necesario cambiar de localidad los
procesos, por lo que este sistema solo es posible si el hardware cuenta con
relocalización dinámica; ya que de otra forma, los procesos no podrían
trabajar en sus nuevas direcciones.
21. Paginación
El sistema de particiones variables sufre del problema de fragmentación
externa ya que un proceso debe ser cargado en memoria contigua. Este
problema puede ser resuelto por compactación o por paginación.
Paginación permite que un programa sea cargado en memoria no contigua;
es decir, en varios fragmentos fijos no contiguos .
Es importante notar que paginación es por si misma una forma de
relocalización dinámica. Un aspecto importante de paginación es la clara
separación entre la memoria desde el punto de vista del usuario y la
memoria %Ica actual. El usuario ve la memoria como un espacio contiguo,
conteniendo solo su programa. En realidad, el programa del usuario esta
disperso a través de toda la memoria %Ica, la cual también contiene otros
programas. La traducción entre ambas memorias es realizada por la tabla de
paginas que es manejada por el sistema operativo. Paginación viene a ser un
esquema de múltiples particiones fijas no contiguas.
22. Paginación
ASIGNACION DE MEMORIA EN PAGINACION.
En el sistema de paginación, cuando un proceso nuevo llega al dispositivo de
spool, es seleccionado por el asignador de procesos para ser cargado a
memoria. Primero comprueba su requerimiento de memoria en paginas. En
seguida busca en la lista de cuadros de memoria disponibles para ver si es
posible cargar el proceso. Cada pagina requiere un cuadro, por lo que si el
proceso consta de N paginas, deberá haber N cuadros de la memoria física
para poder cargarlo.
El sistema de paginación esta exento de fragmentación externa, ya que todos
los cuadros pueden ser otorgados a cualquier proceso que lo necesite. Sin
embargo, es posible tener fragmentaci6n interna ya que los cuadros son de
tamaño fijo y si un programa no logra llenar la pagina completa, se tendrá
un desperdicio. El peor caso es cuando un programa requiere de n paginas
mas una palabra, ya que casi toda la pagina quedara vacía.
23. Segmentación
Segmentación es otro método de administración de memoria, el cual
permite cargar un programa en memoria no contigua. Este método es mas
natural ya que generalmente un programa esta constituido por un programa
principal y varios subprogramas separados, por lo que cada una de estas
entidades puede ser guardada en un segmento de memoria individual de
tamaño exacto según lo requiera cada uno. Lo anterior indica que los
segmentos deben de ser de longitud variable, en contraste con paginación en
donde las paginas son de longitud fija. Cada segmento tiene un nombre o
numero y una longitud. El usuario por esto especifica cada dirección por dos
cantidades: un nombre de segmento y un desplazamiento.
Dado que ahora una dirección dentro de un programa del usuario (dirección
lógica), debe especificarse como una direcci6n de 2 dimensiones, y dado que
la memoria física es aun un arreglo de una sola dimensi6n, es necesario
implementar un dispositivo que mapee o convierta una direcci6n de dos
dimensiones en otra de una sola dimensi6n. Esto se hace por medio de la
tabla de segmentos.
24. Segmentación
FRAGMENTACION EN PAGINACION.
El asignador de procesos debe encontrar y cargar en memoria todos los
segmentos de un programa del usuario. Esta situación es similar a
paginación excepto que los segmentos son de longitud variable, (las paginas
son todas del mismo tamaño), por lo que la fragmentación interna puede ser
despreciable. Sin embargo, se puede tener fragmentación externa cuando
todos los segmentos disponibles son demasiado pequeños para cargar cierto
programa.
Segmentación viene a ser un esquema de múltiples particiones no contiguas
variables.