Você está na página 1de 24

TEMA 6.

ADMISTRACIN DE LA MEMORIA

6.1Organizacin y gestin de la memoria. Conceptos generales


6.2Gestin de la memoria en los sistemas monoprogramados
6.3 Gestin de la memoria en los sistemas multiprogramados
6.4 Asignacin de memoria contigua
6.4.1 Particiones estticas
6.4.2 Particiones dinmicas
6.4.3 Estrategias de colocacin
6.4.4 Intercambio
6.5 Asignacin de memoria no contigua
6.5.1 Esquema general de traduccin
6.5.2 Paginacin
6.5.2.1 Memoria asociativa
6.5.2.2 Pginas compartidas
6.5.2.3 Proteccin
6.5.2.4 Dos visiones de la memoria
6.5.3 Segmentacin
6.5.3.1 Visin del usuario de la memoria
6.5.3.2 Hardware
6.5.3.3 Implementacin de las Tablas de Segmentos
6.5.3.4 Comparticin y Proteccin
6.5.3.5 Fragmentacin
6.5.4 Segmentacin Paginada

Durante este nuevo tema nos enfrentaremos con el problema de la gestin de la memoria.
Haremos un breve estudio preliminar de las posibles alternativas y variantes a la hora de organizar y
administrar el espacio de direcciones de un sistema. Esta primera toma de contacto nos servir de
excusa para introducir algunos conceptos generales, que se irn desarrollando luego.
Empezaremos por el tipo de gestin ms bsico, el de los sistemas de monoprogramacin
que apenas necesitan de ninguna organizacin. La irrupcin de los sistemas multiprogramados hace
necesario tomar decisiones sobre aspectos tan diversos como cunto espacio se dedica a cada
proceso, de qu modo se le asigna, en qu lugar se ubica, durante cunto tiempo permanece en
memoria, qu sucede si no existe suficiente espacio o cmo se protege frente a accesos ajenos.
Todos estos factores sern valorados primero para tcnicas de asignacin contigua(particiones
estticasy dinmicas) y para mtodos de asignacin no contigua (paginacin, segmentaciny
segmentacin paginada). Tambin se discutir el soporte hardware, y el grado de proteccin y
comparticin que es posible con cada uno de los esquemas. Dentro del segundo paquete de
estrategias de administracin de la memoria tendrn un particular inters los esquemas de traduccin
de direcciones, por su repercusin en el tiempo efectivo de acceso a memoria y, por tanto, en el
rendimiento del sistema.

6.1 La organizacin y gestin de la memoria. Conceptos generales


Para que un proceso pueda ejecutarse debe estar ubicado en la memoria principal del
ordenador. Una parte del sistema operativo se va a encargar de gestionar la memoria principal, de
forma que los procesos puedan residir en la memoria sin conflictos. La gestin de la memoria implica
varias tareas, una de ellas es llevar un registro de qu zonas estn libres (es decir, no estn siendo
utilizadas por ningn proceso), y qu zonas estn ocupadas por qu procesos. Otra tarea importante
surge en sistemas en los que no todos los procesos, o no todo el cdigo y datos de un proceso, se
ubican en la memoria principal. En estos sistemas, a menudo se debe pasar parte, o la totalidad del
cdigo y datos de un proceso, de memoria a disco, o viceversa; siendo el sistema operativo
responsable de esta tarea. De esta forma se libera al usuario de realizar estas transferencias de
informacin, de las cuales no es consciente.
Otros dos temas importantes en la gestin de la memoria son el de la carga de los programas
de disco a memoria y el de la proteccin. Desde el momento en que varios procesos deben compartir
la memoria del ordenador surge el problema de la proteccin. En general, se pretende que un proceso
no pueda modificar las direcciones de memoria en las que no reside. Esto es as ya que en las
direcciones de memoria donde no est ubicado el proceso pueden residir otros procesos, o cdigo o
estructuras de datos del S.O. Si un proceso puede modificar indiscriminadamente la memoria, podra,
por ejemplo, cambiar el valor de una direccin de memoria donde residiera una variable de otro
proceso, con la consecuente ejecucin incorrecta del proceso propietario de la variable. Algunos
sistemas ni siquiera permiten que un proceso pueda leer las direcciones de memoria en las que no
reside, con esto se consigue privacidad sobre el cdigo y datos de los procesos. Conforme avance
este tema y el siguiente se profundizar en todos estos aspectos.
Existen varias formas de gestionar la memoria. Por lo comn, la forma de gestin depender
de la mquina virtual que se quiera proporcionar y del hardware subyacente. Con independencia de
la forma de gestin es necesario decidir qu estrategias se deben utilizar para obtener un rendimiento
ptimo. Las estrategias de administracin de la memoria determinan el comportamiento de una
organizacin de memoria determinada cuando se siguen diferentes polticas: Cundo se coge un
nuevo programa para colocarlo en la memoria ? Se coge el programa cuando el sistema lo necesita,
o se intenta anticiparse a las peticiones del sistema ? En qu lugar de la memoria principal se
coloca el siguiente programa por ejecutar ? Se colocan los programas lo ms cerca posible unos de
otros en los espacios disponibles de la memoria principal para reducir al mnimo el desperdicio de
espacio, o se colocan lo ms rpido posible para reducir el tiempo empleado en tomar la decisin ?
Los sistemas actuales son en su mayor parte sistemas con almacenamiento virtual, muchas
de la formas de gestin estudiadas en este tema tienen principalmente valor histrico, pero sientan las
bases de los sistemas actuales.

Jerarqua de la memoria
Los programas y datos necesitan estar en la memoria principal para ser ejecutados, o para
poder ser referenciados. Los programas o datos que no se necesitan de inmediato pueden guardarse
en la memoria secundaria hasta que se necesiten, y en ese momento se transfieren a la memoria
principal para ser ejecutados o referenciados. Los soportes de memoria secundaria, como cintas o
discos, son en general menos caros que la memoria principal, y su capacidad es mucho mayor.
Normalmente, es mucho ms rpido el acceso a la memoria principal que a la secundaria.
En los sistemas con varios niveles de memoria hay muchas transferencias constantes de
programas y datos entre los distintos niveles. Estas transferencias consumen recursos del sistema,
como tiempo de la CPU, que de otro modo podran utilizarse provechosamente.

En los aos sesenta se hizo evidente que la jerarqua de la memoria poda extenderse un
nivel ms, con una clara mejora del rendimiento. Este nivel adicional, la memoria cach, es una
memoria de alta velocidad, mucho ms rpida que la memoria principal. La memoria cach es
extremadamente cara, si se compara con la principal, por lo que slo se utilizan memorias cach
relativamente pequeas. La figura 6.1 muestra la relacin que existe entre la memoria cach, la
principal y la secundaria.
La memoria cach introduce un nivel adicional de transferencia de informacin en el sistema.
Los programas en memoria principal se pasan a la memoria cach antes de ejecutarse. En la
memoria cach se pueden ejecutar mucho ms rpido que en la principal. La esperanza de los
diseadores es que el trabajo extra requerido por la transferencia de programas sea mucho menor
que el incremento del rendimiento obtenido por la ejecucin ms rpida en la cach.

6.2 Gestin de la memoria en los sistemas monoprogramados


En los sistemas de monoprogramacin slo existe un proceso de usuario, que disfruta de
todos los recursos del ordenador. Esto va a simplificar notablemente la gestin de la memoria, ya que
sta slo debe ser compartida por los programas del sistema operativo, y por el nico proceso de
usuario existente. Esto se muestra en la figura 6.2. Dependiendo de detalles de diseo, el sistema
operativo ocupar la parte baja de la memoria RAM, como se muestra en la figura 6.2 (a); o la parte
alta de la memoria ROM, como se muestra en la figura 6.2 (b). El PC de IBM ubica parte del sistema
operativo en RAM, y los gestores de dispositivos en ROM; a esta ltima parte se le llama BIOS (Basic
Input/Output System, sistema bsico de entrada/salida), esto ltimo se ilustra en la figura 6.2 (c).

Si el usuario conoce la ubicacin en la memoria del sistema operativo, entonces puede


escribir programas en trminos de direcciones absolutas de memoria. Una direccin absoluta de
memoria es una direccin fsica (es decir, real) de la memoria. En contraposicin se tienen las
direcciones relativas. Un programa est escrito en trmino de direcciones relativas cuando se
escribe suponiendo que empieza a cargarse en la direccin cero de la memoria. Por lo general, los
usuarios escriben programas en lenguajes de alto nivel, por lo que son los traductores los
encargados de generar las direcciones que ocupan las variables, procedimientos, etc, en la memoria.
Los compiladores no generan direcciones absolutas de memoria, pues no saben dnde se
almacenarn los procesos.
Por lo comn, los sistemas operativos monousuario de monoprogramacin (muy comunes en
las microcomputadoras) no tienen proteccin de la memoria. Por lo tanto, el nico proceso de
usuario que existe en la memoria, puede modificar posiciones de memoria pertenecientes al sistema
operativo, esto provocara errores al ejecutarse la zona modificada. La proteccin se puede realizar
mediante un registro de lmite integrado en la CPU. Si se tiene un esquema como el de la figura 6.2
(b) el registro de lmite contendr la direccin de inicio de carga del S.O. El hardware, en tiempo de
ejecucin, verifica que las direcciones generadas por el proceso de usuario no son superiores al valor
del registro de lmite. En caso de ser superior, el proceso de usuario intenta acceder al S.O., esto
provoca una interrupcin hardware que gestiona el S.O., normalmente eliminando al proceso.

6.3 Gestin de la memoria en los sistemas multiprogramados


En un sistema de multiprogramacin la memoria debe ser compartida por varios procesos de
cara a obtener una mayor utilizacin de los recursos del ordenador. Esto provoca que la gestin de la
memoria se complique sustancialmente. En primer lugar, hay que llevar un recuento de las zonas de
memoria ocupadas por los procesos. As, cuando un nuevo proceso entre en la memoria se le
asignar una zona que estaba libre. Otro problema a resolver viene dado por el hecho de que en el
momento de escribir un programa no se sabe en qu zona de memoria se ubicar, siendo posible que
durante la vida de un proceso ste cambie varias veces de emplazamiento. Habr que tener en
cuenta, tambin, la proteccin de las zonas de memoria ocupadas por los procesos, mxime en
sistemas multiusuario donde los procesos pueden pertenecer a distintos usuarios.
En lo que resta de este tema, y en el tema siguiente, se estudiarn varias formas de gestin
de la memoria utilizadas en sistemas de multiprogramacin.

6.4 Asignacin de memoria contigua


En un esquema de asignacin de memoria contigua un proceso se ubica en su totalidad en
posiciones consecutivas de memoria. Un ejemplo de este tipo de asignacin es el utilizado en los
sistemas de monoprogramacin vistos previamente. En este apartados se estudian dos mtodos de
asignacin contigua empleados histricamente en sistemas multiprogramados.
6.4.1 Particiones estticas
Esta forma de gestin consiste en dividir la memoria en varias zonas, pudiendo ser cada zona
de un tamao diferente. Esto se ilustra en la figura 6.3. El tamao de las zonas podr ser modificado
eventualmente por algn usuario responsable de la administracin del ordenador.
Los trabajos se traducan mediante compiladores y ensambladores absolutos, para
ejecutarse en una particin especfica. Una vez introducido un proceso en una particin, permanece
en ella hasta su finalizacin. Si un trabajo se iniciaba, y la particin para la que estaba compilado
estaba ocupada, tena que esperar, aunque estuvieran libres otras particiones. Esto provoca una
prdida de eficiencia.

De cara a mejorar el rendimiento es preciso que un proceso se pueda cargar en cualquier


particin. Para ello, los programas se escriben en trminos de direcciones relativas a la direccin de
comienzo de carga cero. Sin embargo, los programas no se cargan a partir de la direccin cero, esta
circunstancia se debe resolver mediante la reasignacin o reubicacin, cmo se realiza sta ?.
Una posible implantacin viene proporcionada por el hardware. Existe un registro, denominado
registro base, en el que el sistema operativo, dentro de la operacin de cambio de proceso, escribe
la direccin de memoria a partir de la cual se almacen el proceso. Esta direccin coincidir con la de
comienzo de la particin en que reside, y forma parte de su descriptor(PCB). Cuando la CPU genera
una direccin de memoria, sta es transformada por el hardware antes de ser introducida en el bus
del sistema. La transformacin consiste en sumarle a la direccin el registro base.
Para clarificar esto, supngase que la instruccin que actualmente ejecuta la CPU guarda el
contenido del acumulador en la direccin relativa 100 de la memoria. Esta direccin, 100, (que
podra, por ejemplo, guardar el contenido de una variable de otro proceso) es relativa a una direccin
0 de comienzo del programa. Si el programa se ha cargado en la posicin 10000 de la memoria, el
registro base contendr el valor 10000. Cuando la CPU ejecuta la instruccin, genera la direccin 100
de memoria (la cual fsicamente pertenece a otro proceso). Sin embargo, el hardware suma 10000 a
este valor, introducindose 10100 en el bus del sistema, direccin que realmente ocupa la variable.
Observe que con este esquema, si se quiere reubicar el proceso a otro lugar de la memoria, slo hay
que desplazarlo de lugar, y modificar el registro base con la nueva direccin de comienzo de carga.

Una solucin software al problema de la reasignacin consiste en modificar las instrucciones


cuando el programa se carga en la memoria. Para que esto ocurra es preciso que el enlazador (el
programa que a partir de los ficheros objeto genera un nico objeto) incluya en el programa binario
una lista que indique qu partes del programa son direcciones a reasignar, y cules no (constantes,
cdigos de operadores u otros elementos que no deban ser reasignados). Con esta solucin, cada
reubicacin en la memoria implica una reasignacin de las direcciones de memoria del programa.
Proteccin
Si se tiene el esquema hardware del registro base, para lograr la proteccin de las zonas de
memoria basta con aadir un nuevo registro, denominado registro lmite. Este registro guarda la
ltima direccin de la particin, y forma tambin parte del PCB del proceso. El hardware, despus de
sumar el registro base a la direccin relativa, comprueba que la direccin obtenida no supere el valor
del registro lmite. Si se supera el valor, se est intentando acceder a una zona que no corresponde al
proceso; en esta situacin, el hardware genera una interrupcin. El sistema operativo sirve a la
interrupcin, lo normal es que mande una seal al proceso por violacin de memoria. Si el proceso no
tiene definido atrapar esa seal, lo cual es lo ms probable, se eliminar al proceso.
Cuando un proceso quiera ejecutar cdigo del sistema operativo, por ejemplo, para realizar
una E/S, no tiene acceso directo a las rutinas que tiene el sistema operativo en memoria para
implementar dicha funcin, sino que debe realizar una llamada al sistema para no violar la
proteccin. Este esquema es necesario, pues los programas de usuario tienen que avisar al sistema
operativo de que le solicitan servicios (al hacer una llamada al sistema), el sistema operativo
atender las peticiones si son correctas, o si pueden ser factibles en dicho momento (por ejemplo, no
se asignar una impresora que est siendo utilizada por otro proceso). Los procesos de usuario no
pueden llamar directamente al sistema operativo gracias a la proteccin de memoria.
Una ltima observacin, al margen de la proteccin: cuando un proceso se introduce en una
particin, lo ms probable es que su tamao no sea el mismo (es decir, sea algo menor) que el de la
particin. Esto origina un problema de desperdicio de memoria conocido como fragmentacin
interna.
6.4.2 Particiones dinmicas
En este mtodo se va asignando la memoria dinmicamente a los procesos, conforme se
introducen en la memoria. A cada proceso se le asigna exactamente la memoria que necesita.
En la figura 6.4 se ilustra cmo evoluciona la ocupacin de la memoria en un sistema de este
tipo. Al principio slo se encuentra el proceso A en la memoria. Despus, se insertan los procesos B y
C . En la figura 6.4-d A concluye. Luego, D entra y B sale. Por ltimo E entra.
Con este mtodo de gestin de la memoria se evita el problema de la fragmentacin interna.
Sin embargo, aparece el problema de la fragmentacin externa entre particiones, el cual se aprecia
en la figura 6.4-f. El problema consiste en que se creen huecos libres demasiado pequeos como
para que quepan procesos, aunque la unin de todos esos huecos producira un hueco considerable,
lo que acarrea el desperdicio de la memoria. Una posible solucin es la compactacin de la
memoria, que consiste en desplazar todos los procesos hacia la parte inferior de la memoria mientras
sea posible. Como la compactacin lleva mucho tiempo, a veces no se realiza, o se hace por la
noche, en horas de poco uso del ordenador. Hay que tener en cuenta que el sistema debe detener
todas sus actividades mientras realiza la compactacin. Ello puede ocasionar tiempos de respuesta
irregulares para usuarios interactivos, y podra ser devastador en un sistema de tiempo real.
Adems, con una combinacin normal de trabajos que cambia rpidamente, es necesario compactar
a menudo. En este caso, los recursos del sistema que se consumen quiz no justifiquen las ventajas
de la compactacin.

El esquema de los registro base y lmite sigue siendo vlido para la reasignacin y la
proteccin. Otro tema a tener en cuenta es la cantidad de memoria por asignar a un proceso recin
creado. Si los procesos se crean con un tamao fijo invariante, la asignacin es muy sencilla, se
asigna exactamente lo que se necesite.
Si, por el contrario, los segmentos de datos de los procesos pueden crecer, como es el caso
de la asignacin dinmica de memoria a partir de una pila, que ocurre en muchos lenguajes de
programacin, aparece un problema cuando un proceso intenta crecer. Si hay un hueco adyacente al
proceso, ste puede ser asignado, y el proceso podr crecer hacia el hueco. Sin embargo, si el
proceso es adyacente a otro proceso, el proceso de crecimiento deber ser desplazado a un hueco de
la memoria lo suficientemente grande; o bien, habr que eliminarlo.
Si es de esperar que la mayora de los procesos crezcan conforme se ejecuten, sera una
buena idea asignar un poco de memoria adicional siempre que un proceso pase a la memoria, con el
fin de reducir el gasto excesivo
asociado con el traslado de
procesos que ya no caben en
su memoria asignada. En la
figura
5-a
vemos
una
configuracin de la memoria en
la que se asign a dos procesos
el espacio adicional para el
crecimiento.
Si los procesos pueden
tener dos segmentos de
crecimiento, como por ejemplo,
el segmento de datos, que se
utiliza como una pila, y el stack,
se
sugiere
un
mtodo
alternativo, el de la figura 5-b.
En esta figura se puede ver que
cada proceso tiene un stack de
crecimiento hacia abajo, en la
parte superior de la memoria
asignada a l; adems, tiene un segmento de datos justo encima del programa, el cual crece hacia
arriba. La memoria entre ellos se puede utilizar para cualquiera de los segmentos. Si el espacio se
agota, puede ocurrir que el proceso sea desplazado a un hueco con el espacio suficiente; o bien, ser
aniquilado.

Registro de la ocupacin de la memoria


En el sistema de particiones estticas es sencillo llevar el registro de la ocupacin de la
memoria, basta con guardar sobre cada particin si est libre, u ocupada por qu proceso, as como
sus direcciones de comienzo y fin de particin. Por contra, con las particiones dinmicas, el nmero
de stas vara con el tiempo, as como su tamao. Una forma posible de registrar la ocupacin de la
memoria es utilizar una lista enlazada de los segmentos de la memoria asignados o libres. La
memoria de la figura 6.6-a se presenta en la figura 6-c como una lista enlazada de segmentos. Cada
entrada de la lista especifica un hueco (H) o un proceso (P), la direccin donde comienza, su longitud,
y un puntero a la siguiente entrada.
En este ejemplo, la lista de segmentos est ordenada por direcciones. Este orden tiene la
ventaja de que al terminar un proceso la actualizacin de la lista es directa. Un proceso que termina,
tiene dos vecinos (a menos que se encuentre en la parte superior o inferior de la memoria). Estos
pueden ser procesos o huecos, lo que produce las cuatro combinaciones de la figura 6.7. En la figura
6.7-a, la actualizacin de la lista requiere el reemplazo de una P por una H. En la figura 6.6 (b) y (c),
dos entradas se funden en una, y la lista se acorta en una entrada. En la figura 6.6-d tres entradas se
fusionan en una. Puesto que en el descriptor del proceso que termina se guardar un puntero a la
entrada de la lista enlazada que ocupa dicho proceso, sera conveniente que la lista fuera
doblemente enlazada. Esta estructura facilita la bsqueda de la entrada anterior y, por tanto, la
verificacin de si es posible una fusin.

Figura 6.6. (a) Una parte de la memoria, con cinco procesos y 3 huecos. La marca muestra
las unidades de asignacin de la memoria. Las regiones sombreadas ( 0 en el mapa de bits) estn
libres. (b) El mapa de bits correspondiente. (c) La misma informacin como lista enlazada.
6.4.3 Estrategias de colocacin
Cuando en un sistema de particiones dinmicas se debe asignar memoria principal para un
nuevo proceso, y los procesos y huecos se mantienen en una lista ordenada por direcciones, se
pueden utilizar diversos algoritmos para la eleccin del hueco de memoria donde ubicar al proceso.
Supongamos que se conoce la cantidad de memoria por asignar.
El algoritmo ms simple es el primero en ajustarse (first fit). Se revisa la lista de huecos
hasta encontrar un espacio lo suficientemente grande. El espacio se divide entonces en dos partes,
una para el proceso, y otra para la memoria no utilizada, excepto en el caso poco probable de un
ajuste perfecto. Este algoritmo es rpido, ya que busca lo menos posible.

Otro algoritmo es el mejor en ajustarse (best fit), el cual busca en toda la lista, y elige el
mnimo hueco suficientemente grande como para ubicar al proceso. Este algoritmo intenta que los
huecos que se creen en la memoria sean lo ms pequeos posible.

Como ejemplo de los algoritmos, retomemos la figura 6.6. Si se necesita un bloque de tamao
2, el primero en ajustarse asignar el espacio en 5, mientras que el mejor en ajustarse asignar el
espacio en 18.
Realizando simulaciones se ha demostrado que el algoritmo del mejor ajuste desperdicia
ms la memoria, pues al crear huecos demasiado pequeos, stos no pueden ser utilizados por
procesos. Un algoritmo que enfrenta el problema de la manera contraria es el del peor ajuste (worst
fit). En este algoritmo se elige el hueco ms grande disponible. De esta forma aumenta la
probabilidad de que el nuevo hueco creado sea lo suficientemente grande como para albergar un
proceso.
6.4.4 Intercambio (swapping)
En un sistema con particiones estticas el nmero de procesos con posibilidades de estar en
estado listo viene determinado por el nmero de particiones, y en uno de particiones dinmicas por el
tamao de la memoria principal y el tamao de los procesos, ya que en ambos mtodos un proceso
permanece en una particin hasta que finaliza. Supongamos un sistema en que dicho nmero es
cinco, es muy probable que en un momento dado los cinco procesos que ocupan las particiones estn
bloqueados (por ejemplo, porque esperan la finalizacin de una operacin de E/S). Mientras los cinco
procesos permanezcan bloqueados se desperdicia la CPU. Para remediar este inconveniente muchos
sistemas operativos optaron por permitir ejecutar concurrentemente ms procesos de los que pueden
entrar fsicamente en la memoria principal del ordenador. Para ello se utiliza la memoria secundaria
(generalmente los discos) que, aunque ms lenta, tiene mayor capacidad de almacenamiento que la
principal. La solucin consiste en tener en disco una copia de la parte de la memoria que ocupa todo
proceso. En el disco se encuentran todos los procesos, en la memoria slo unos cuantos. Para que un
proceso se pueda ejecutar debe residir en memoria principal.
La razn por la que se aumenta el nmero de procesos con posibilidades de tener
instrucciones en memoria principal es porque cuanto mayor sea este nmero, es menos probable que
se d la circunstancia de que todos estn bloqueados y, por lo tanto, es menor la posibilidad de que la
CPU permanezca inactiva.
Algunos sistemas UNIX utilizaban el intercambio en un sistema de particiones dinmicas. El
movimiento de procesos entre la memoria principal y el disco lo realizaba el planificador de nivel
medio, conocido como el intercambiador (swapper a medio plazo). El intercambio de la memoria
principal al disco (swapping out) se iniciaba cuando el S.O. precisa memoria libre y estaba toda ocupa
debido a alguno de los siguientes eventos:

- Una llamada al sistema fork que necesitaba memoria para un proceso hijo.
- Una llamada al sistema brk de solicitud de memoria dinmica en un proceso que no tiene
suficiente memoria libre como para aceptar la peticin.
- Una pila que se agranda, y ocupa un espacio mayor al asignado.
Adems, cuando haba que recuperar un proceso presente en el disco (swapping in) desde
hace mucho tiempo con frecuencia se necesitaba sacar a otro proceso de memoria a disco para
disponer de espacio para el primero.
El intercambiador elega una vctima al examinar los procesos bloqueados en espera de algo
(por ejemplo, una entrada del terminal). Es mejor sacar a un proceso bloqueado (pasar a estado
suspendido_bloqueado) que sacar a uno listo. Si existan varios procesos bloqueados ubicados en
la memoria principal se elega a uno cuya combinacin de prioridad y tiempo de residencia en
memoria principal fuera ms desfavorable. As, un buen candidato era un proceso que hubiera
consumido mucho tiempo de CPU recientemente, al igual que uno que hubiera permanecido en la
memoria durante mucho tiempo, aun cuando durante este tiempo hubiera realizado E/S. Si no se
dispone de procesos bloqueados, entonces se elega a un proceso listo en base a los mismos
criterios.
Cada pocos segundos el intercambiador examinaba la lista de procesos intercambiados para
ver si alguno estaba listo para su ejecucin. En caso de que existiera alguno, se seleccionaba a aquel
que hubiese permanecido en el disco durante mucho tiempo. A continuacin el intercambiador
verificaba si el intercambio sera fcil o difcil. Un intercambio fcil era aquel en el que existiera la
suficiente memoria libre, de forma que no haba necesidad de sacar a un proceso para hacer espacio
para el nuevo. Un intercambio difcil precisaba la eliminacin de uno o ms procesos. La implantacin
de un intercambio fcil se llevaba a cabo al traer el proceso a la memoria. Un intercambio difcil se
implantaba liberando primero la memoria suficiente sacando a disco a uno o ms procesos, y
despus, cargando en la memoria el proceso deseado.
Este algoritmo se repeta hasta que se cumpliera alguna de estas condiciones: (1) ningn
proceso en el disco est suspendido_listo; o (2) la memoria est tan ocupada por procesos recin
trados que no hay espacio para ms. Para evitar un trasiego excesivo entre memoria y disco que
pudiera afectar al rendimiento no se intercambiaba hacia el disco a un proceso hasta que hubiera
permanecido en la memoria durante 2 segundos.
El espacio libre en la memoria principal y en el dispositivo de intercambio se registraba
mediante una lista enlazada de huecos. Si se necesitaba espacio en alguno de los dos, el algoritmo
del primero en ajustarse lea la lista adecuada de huecos, y devolva el primer hueco que encontrara y
que fuese lo bastante grande, a la vez que eliminaba este espacio de la lista de huecos.

6.5 Asignacin de memoria no contigua


Hasta ahora se han estudiado esquemas de administracin de la memoria en los que los
procesos se almacenan en posiciones contiguas (consecutivas) de memoria. Sin embargo, un
proceso puede dividirse en bloques, y estos bloques pueden situarse en posiciones no contiguas de
memoria principal. Es ms, no es preciso que se encuentren en la memoria todos los bloques de un
proceso para que se pueda ejecutar, basta con que se encuentren los bloques que contienen cdigo o
datos actualmente referenciados, el resto puede permanecer en memoria secundaria.
La memoria virtual
La clave del concepto de memoria virtual es la disociacin de las direcciones a las que hace
referencia un proceso en ejecucin de las direcciones disponibles en la memoria principal.

10

Las direcciones a las que hace referencia un proceso en ejecucin, en este esquema, se
llaman direcciones virtuales. El intervalo de direcciones virtuales a las que puede hacer referencia
un proceso en ejecucin se llama espacio de direcciones virtuales, V, del proceso. El intervalo de
direcciones reales de la memoria principal de un ordenador concreto se llama espacio de
direcciones reales, R. El nmero de direcciones de V se denota |V|, y el nmero de direcciones de R,
|R|. En los sistemas de almacenamiento virtual ya implantados lo normal es que |V| >> |R|, aunque se
han construido sistemas en los que |V| < |R|.
La memoria virtual es una tcnica de gestin de la memoria que posibilita que el espacio de
direcciones virtuales sea mayor al espacio de direcciones reales. En otras palabras, se permite hacer
programas de tamao mayor al de la memoria principal. Para lograr esto, el sistema operativo se
encarga de mantener en la memoria principal solamente aquellas partes del espacio de direcciones
del proceso que actualmente estn siendo referenciadas, el resto permanece en disco.
La memoria virtual se basa en el hecho de que muchos programas presentan un
comportamiento conocido como operacin en contexto, segn el cual, en cualquier intervalo
pequeo de tiempo un programa tiende a operar dentro de un mdulo lgico en particular, sacando
sus instrucciones de una sla rutina y sus datos de una sla zona de datos. De esta forma, las
referencias de memoria de los programas tienden a agruparse en pequeas zonas del espacio de
direcciones. La localidad de estas referencias viene reforzada por la frecuente existencia de bucles:
cuanto ms pequeo sea el bucle, menor ser la dispersin de las referencias. La observacin de
este comportamiento conduce al postulado (Denning, 1970) del llamado principio de localidad: "Las
referencias de un programa tienden a agruparse en pequeas zonas del espacio de direcciones.
Estas zonas, adems, tienden a cambiar slo de forma intermitente".
La validez del principio de localidad vara de programa en programa: ser, por ejemplo, ms
vlido en programas que lleven a cabo accesos secuenciales a vectores que en programas que
accedan a estructuras complejas de datos.
La memoria virtual se compagina con la multiprogramacin. Al no tener que almacenar los
procesos enteros en la memoria, pueden entrar ms en la memoria principal, con lo que es ms
probable que siempre exista un proceso en estado listo. Por otro lado, cuando un proceso espera a
que se cargue en la memoria principal parte de su cdigo o datos, se inicia una E/S con el disco.
Mientras dura dicha E/S la CPU puede ejecutar otro proceso.
Aunque los procesos
slo hacen referencia a
direcciones virtuales, deben
ejecutarse en la memoria real.
Por lo tanto, durante la
ejecucin de un proceso es
preciso
establecer
la
correspondencia entre las
direcciones virtuales y las
reales. Como se ver ms
adelante
esta
correspondencia
debe
realizarse de una manera
rpida, pues si no, se
ralentizara demasiado el
tiempo de ejecucin de los
procesos.
Se han desarrollado
varios mtodos para asociar
las direcciones virtuales con
las reales. Los mecanismos
de traduccin dinmica de
direcciones
convierten
la
direcciones
virtuales
en
direcciones reales en tiempo

11

de ejecucin. Todos estos sistemas tienen la propiedad de que las direcciones contiguas en el espacio
de direcciones virtuales de un proceso no son necesariamente contiguas en la memoria principal. Esto
se conoce como contigidad artificial (fig. 6.8). Debe quedar claro que toda esta correspondencia es
transparente al programador, que escribe sus programas en trminos de direcciones consecutivas de
memoria virtual.
6.5.1 Esquema general de traduccin
Los mecanismos de traduccin dinmica de direcciones deben mantener mapas de
correspondencia de traduccin de direcciones que indiquen qu localidades de la memoria virtual
estn en memoria principal en un momento dado y dnde se encuentran.
Existen dudas en cuanto a si los bloques en que se dividen los procesos deben ser del mismo
tamao o de tamaos diferentes. Cuando los bloques son del mismo tamao, se llaman pginas, y la
organizacin de la memoria virtual correspondiente se conoce como paginacin. Cuando los bloques
pueden tener tamaos diferentes se llaman segmentos, y la organizacin de la memoria virtual
correspondiente se llama segmentacin. Algunos sistemas combinan ambas tcnicas, con segmentos,
que son entidades de tamao variable, compuestas de pginas de tamao fijo ( Segmentacin
paginada ).
Las direcciones en un sistema de correspondencia son bidimensionales. Para referirse a un
elemento en particular, el programa especifica el bloque en el que se encuentra el elemento, y su
desplazamiento a partir del inicio del bloque. Una direccin virtual, v, se denota por un par ordenado
(b,d), donde b es el nmero de bloque en el que se encuentra el elemento al que se hace referencia, y
d es el desplazamiento a partir del inicio del bloque.
La traduccin de una direccin virtual v = (b,d) a una direccin real, r, se ejecuta de la
siguiente forma (fig. 9). Cada proceso tiene su propia tabla de correspondencia de bloques, mantenida
por el sistema operativo dentro de la memoria principal. Un registro especial dentro de la CPU,
denominado registro de origen de la tabla de correspondencia de bloques, se carga con la direccin
real, a, de la tabla de correspondencia de bloques del proceso durante el cambio de proceso. La tabla
contiene una entrada por cada bloque del proceso, y las entradas siguen un orden secuencial para el
bloque 0, el bloque 1, etctera. Ahora se suma el nmero de bloque, b, a la direccin base, a, de la
tabla de bloques, para formar la direccin real de la entrada del bloque b en la tabla de
correspondencia de bloques. Esta entrada contiene la direccin real, b', de inicio del bloque b. El
desplazamiento, d, se suma a la direccin de inicio del bloque, b', para formar la direccin real
deseada, r = b' + d.

12

Todas las tcnicas de correspondencia de bloques empleadas en los sistemas de


segmentacin, paginacin, y paginacin y segmentacin combinada son similares a la
correspondencia mostrada en la figura 6.9.
Es importante sealar que la traduccin de una direccin virtual a real la realiza una unidad
hardware, que transforma todas las direcciones generadas por la CPU antes de que pasen al bus del
sistema. Es esencial que esta transformacin la realice el hardware, y no el sistema operativo, pues
muchas instrucciones mquina incluyen referencias a memoria, y la correspondencia debe
realizarse rpidamente, para no ralentizar en exceso el tiempo de ejecucin de los procesos. Por
ejemplo, las dos sumas indicadas en la figura 6.9 deben ser ms rpidas que las sumas
convencionales del lenguaje mquina.
Aunque el hardware consulta las tablas de correspondencia de bloques para la
transformacin de direcciones, es el sistema operativo el encargado de rellenar y gestionar dichas
tablas. Un proceso no tiene por qu tener todos sus bloques en memoria principal, recurdese que el
espacio de direcciones virtuales puede ser muy superior al espacio de direcciones reales, esto hace
que a veces un proceso referencie a una direccin de un bloque que no se encuentra en la memoria
principal. Para detectar esto, las tablas de correspondencias tienen un "bit de presencia" por entrada
(cada entrada representa un bloque), que indica si el bloque se encuentra presente en la memoria
principal o no. El hardware de traduccin debe verificar este bit en cada referencia a memoria.
Si el bloque no est en memoria principal, el hardware produce una interrupcin. Esta
interrupcin provoca que el control pase al software (sistema operativo), para que ste inicie la
transferencia del bloque que falta desde la memoria secundaria a la memoria principal, y actualice de
acuerdo con ello la tabla de correspondencias. El proceso en ejecucin se har no listo hasta que se
haya completado esta transferencia. La posicin de los bloques en la memoria secundaria puede
guardarse en la misma tabla de correspondencias.
6.5.2 Paginacin
El concepto de almacenamiento a un slo nivel, en el que la memoria secundaria aparece
como una extensin de la memoria principal, se introdujo por primera vez en el ordenador Atlas de la
Universidad de Manchester alrededor de 1960, y desde entonces ha ejercido una profunda influencia
en el diseo de los ordenadores.
El almacenamiento a un slo nivel puede llevarse a cabo mediante una tcnica llamada
paginacin, segn la cual el espacio de direcciones virtuales se divide en pginas del mismo tamao
(en el Atlas eran de 512 palabras). La memoria principal se divide tambin en marcos o pginas
fsicasdel mismo tamao. Estos marcos son compartidos entre los distintos procesos que haya en el
sistema, de forma que en cualquier momento un proceso dado tendr unas cuantas pginas
residentes en la memoria principal (sus pginas activas) y el resto en la memoria secundaria (sus
pginas inactivas). El mecanismo de paginacin cumple dos funciones:
- Llevar a cabo la transformacin de una direccin virtual a fsica, o sea, la determinacin de
la pgina a la que corresponde una determinada direccin de un programa, as como del marco, si lo
hay, que ocupa esta pgina;
- Transferir, cuando haga falta, pginas de la memoria secundaria a la memoria principal, y de
la memoria principal a la memoria secundaria cuando ya no sean necesarias.
La primera funcin se aborda a continuacin, y se deja para el siguiente tema la segunda
funcin.
Con el fin de determinar la pgina a la que hace referencia un programa, los bits de mayor
peso de la direccin se interpretan como el nmero de pgina, y los bits de menor peso como el
nmero de palabra dentro de esta pgina. De ah que si el tamao de pgina es 2 n, los n bits finales
de la direccin representarn el nmero de palabra y los bits restantes del principio el nmero de
pgina. El nmero total de bits en la direccin es suficiente para direccionar la totalidad de la
memoria virtual. As, por ejemplo, en el Atlas las direcciones de programa tenan 20 bits de longitud,
proporcionando una memoria virtual de 220 palabras; el tamao de la pgina era de 512 palabras (2 9),

13

y de ah que los 9 bits inferiores representasen el nmero de palabra y los 11 superiores


representasen el nmero de la pgina. El nmero total de pginas en la memoria virtual era por tanto
de 211 (en contraposicin a las 32 pginas fsicas de que dispona la memoria principal).
Es de destacar el hecho de que la divisin de la direccin en nmero de palabra y nmero de
pgina, es tarea del hardware, y es transparente al programador: por lo que a Jl concierne est
programando en un espacio secuencial de direcciones muy grande.
La transformacin de nmero de pgina y de palabra en la direccin fsica de memoria se
realiza a travs de una tabla de pginas, cuyo p-simo elemento contiene la posicin p' del marco que
contiene a la pgina p (la posibilidad de que la p-sima pgina no se encuentre en la memoria
principal se abordar dentro de un momento). El nmero de palabra, w, se suma a p' para obtener la
direccin buscada (ver la figura 10).
La transformacin de direcciones consiste, pues, en:
f(a) = f(p, w) = p' + w
donde la direccin de programa, a, el nmero de pgina, p, y el nmero de palabra, w, estn
relacionados con el tamao de pgina Z a travs de:
p = parte entera de (a/Z)
w = resto de (a/Z)

As pues, cada vez que la CPU genere una direccin de memoria sta es transformada por
una unidad hardware, de forma que en el bus del sistema se introduce la direccin fsica
correspondiente. Es importante observar que la paginacin es en s misma una forma de reubicacin
dinmica. Cada direccin lgica es transformada en alguna direccin fsica por el hardware de
paginacin. Observe tambin que si el tamao de pgina (como es lo usual) es una potencia de dos,
el hardware no precisa realizar ninguna divisin, simplemente sabe que los ltimos n bits, si el tamao
de pgina es de 2n , representan el desplazamiento, y los primeros bits la pgina.
Cada proceso debe tener su propia tabla de pginas, y su direccin de comienzo en la
memoria principal forma parte de la porcin del PCB utilizada para realizar un cambio de proceso.

14

Como el nmero de marcos (cantidad de memoria real) asignados a un proceso ser


normalmente menor que el nmero de pginas que ste utiliza, es muy posible que una direccin del
programa haga referencia a una pgina que no se encuentre en aquel momento en la memoria
principal. En este caso el elemento correspondiente de la tabla de pginas estar vaco, provocando
el hardware una interrupcin de "fallo de pgina" si se intenta acceder a ella. Esta interrupcin
provoca que el control pase al software (al sistema operativo), para que ste inicie la transferencia de
la pgina que falta desde la memoria secundaria a la memoria principal, y actualice de acuerdo con
ello la tabla de pginas. El proceso en ejecucin se har no listo hasta que se haya completado esta
transferencia. La posicin de las pginas en la memoria secundaria puede guardarse en una tabla
separada o en la misma tabla de pginas. En este ltimo caso, es necesario un "bit de presencia" en
cada elemento de la tabla de pginas, para indicar si la pgina se encuentra presente o no en la
memoria principal, y si el campo de direcciones debe interpretarse como una direccin de marco, o
bien como una direccin de la memoria secundaria.
Si no existe ningn marco vaco en el momento en que ocurre un fallo de pgina, hay que
guardar en la memoria secundaria alguna otra pgina con el fin de hacer sitio a la nueva. La eleccin
de la pgina que habr que sacar es el resultado de un algoritmo de reemplazo de pgina, del cual
veremos varios ejemplos en el tema siguiente. Por el momento, vamos a destacar tan slo el hecho
de que la informacin que necesita el algoritmo de cambio de pgina, puede estar contenida en
algunos bits adicionales que se aaden a cada elemento de la tabla de pginas.
Quizs habra que aclarar, que toda la operacin de transformaciones de direcciones la lleva
a cabo el hardware, excepto en el caso en que haya que traer una pgina de la memoria secundaria.
En este caso, la aplicacin del algoritmo de cambio de pgina, as como la actualizacin de la tabla de
pginas, las lleva a cabo el software.
La anterior discusin proporciona una visin general de cmo funciona la paginacin. En la
prctica hay que hacer una serie de modificaciones para llegar a una implementacin viable. Una de
ellas es que la transformacin de direccin virtual a fsica debe ser rpida.
6.5.2.1 Memoria asociativa
En el sistema que hemos descrito el tiempo necesario para cada referencia a memoria queda
doblado, debido a la necesidad de acceder primero a la tabla de pginas. Una forma de evitarlo podra
ser la de tener guardada la tabla de pginas en un conjunto de registros rpidos en lugar de sobre la
memoria ordinaria. Sin embargo, el tamao de la tabla de pginas es proporcional al tamao del
espacio de direcciones virtuales; de ah que el nmero de registros necesarios sea demasiado grande
para que esta alternativa resulte econmicamente viable. La solucin al problema consiste en adoptar
una tcnica diferente para acceder a las pginas activas. Esta tcnica representa el tener que
incorporar a la mquina una memoria asociativa, que consistir en un pequeo conjunto de registros
de direccin de pgina (PARs, del ingls page address registers), cada uno de los cuales contiene el
nmero de pgina de una pgina activa. Los PARs presentan la propiedad de poderse buscar en ellos
de forma simultnea el nmero de pgina asociado a una direccin de programa en particular.
Por ejemplo, en la figura 6.11, la direccin de programa 3243 se divide en el nmero de
pgina 3 y el nmero de palabra 243 (vamos a suponer, por comodidad, que el tamao de la pgina
sea 1000). El nmero de pgina se compara entonces de forma simultnea con el contenido de todos
los PARs, y se encuentra que coincide con el valor del PAR 5. Ello indica que la pgina 3 ocupa en la
actualidad la pgina fsica nmero 5, de forma que la direccin buscada ser la 5243.
El empleo de un almacenamiento de tipo asociativo reduce el tiempo empleado en la
transformacin de direcciones en un orden de magnitud con respecto al caso en el que se guardaba la
tabla de pginas sobre memoria principal.

15

Con el fin de que se pueda hacer referencia a todas las pginas activas a travs de un PAR,
hay que disponer de tantos como marcos haya en la memoria. Ello es posible en sistemas con una
memoria principal reducida (como por ejemplo, el Atlas), pero en sistemas mayores no es viable,
desde el punto de vista econmico, disponer de todos los PARs necesarios para ello (aunque es de
esperar que estos argumentos de tipo econmico cambien a medida que se desarrolla la tecnologa).
Se puede llegar a una solucin de compromiso, guardando para cada proceso una tabla de pginas
completa en la memoria, y utilizando una pequea memoria asociativa para referenciar unas pocas
pginas asociadas a los procesos activos ms recientes. En este caso, el marco al que har
referencia cada PAR, no vendr implcito por la situacin de ste, sino que deber incluirse como un
campo adicional en el mismo PAR. El hardware de direccionamiento de la memoria lleva a cabo,
entonces, la operacin de transformacin de direcciones que se muestra en la figura 6.12. Como
antes, slo se requiere la intervencin del software en el caso de que haya que sustituir una pgina.
Un problema que no ilustra la figura 6.11 es el de distinguir en la memoria asociativa las
pginas asociadas al proceso en ejecucin de las pginas correspondientes a otros procesos. Una
solucin consistira en ampliar los PARs para incluir la identificacin de los procesos, junto con el
nmero de la pgina. Cada direccin que se presente a la memoria asociativa deber incluir, segn
esto, el identificador del proceso junto con los bits de la pgina.
Evidentemente, es de desear que la memoria asociativa contenga los nmeros de las pginas
a las que haya mayores posibilidades de acceder. Lamentablemente, no existe ningn algoritmo
general que nos asegure que as suceda (vase el siguiente tema). En la prctica se cargan
cclicamente en la memoria asociativa las direcciones de las pginas a las que se ha hecho referencia
con ms frecuencia recientemente. Este algoritmo, ms bien primitivo, es, de hecho, bastante eficaz.
El porcentaje de veces que se encuentra un nmero de pgina entre los registros asociativos
est relacionado claramente con el nmero de registros asociativos. Con 8 o 16 registros asociativos,
puede obtenerse un porcentaje del 80 al 90%. Un porcentaje del 80% significa que el 80% de las
veces encontramos el nmero de pgina deseado entre los registros asociativos. Si explorar los
registros asociativos lleva 50 nanosegundos, y 750 nanosegundos acceder a memoria, entonces un
acceso a memoria "mapeada" lleva 800 nanosegundos cuando el nmero de pgina se encuentra en
los registros asociativos. Si no conseguimos encontrar el nmero de pgina (50 ns), entonces
tenemos que acceder a la memoria en primer lugar para buscar el nmero de marco en la tabla de
pginas (750 ns) y entonces acceder a la palabra deseada en memoria (750 ns), dando en total 1550
nanosegundos. Para encontrar el tiempo efectivo de acceso a memoria, tenemos que ponderar
cada caso con su probabilidad:
t. efectivo de acceso a memoria = 0,80 x 800 + 0,20 x 1550 = 950 ns

16

En este ejemplo, sufrimos un 26,6% de retardo en el tiempo de acceso a memoria (de 750 a
950 nanosegundos).

6.5.5.2 Pginas compartidas


Otra ventaja de la paginacin es la posibilidad de compartir programas de uso corriente. Esto
es particularmente importante en un entorno de tiempo compartido. Consideremos un sistema que
soporta 40 usuarios, cada uno de los cuales ejecuta un editor de textos. Si el editor de textos consta
de 30K de cdigo y 5K de espacio para datos, necesitaramos 1400K para permitir a los 40 usuarios.
No obstante, si el programa es reentrante, podra compartirse como se muestra en la figura 6.13.
Aqu vemos un editor de tres pginas que es compartido por tres procesos. Cada proceso tiene su
propia pgina de datos
El cdigo reentrante (tambin llamado cdigo puro) es un cdigo no automodificable. Si el
cdigo es reentrante, entonces nunca cambia durante la ejecucin. As, dos o ms procesos pueden
ejecutar el mismo cdigo al mismo tiempo. Cada proceso, para su ejecucin, tiene su PCB y su
memoria para mantener los datos. Por supuesto, los datos de todos esos procesos diferentes varan
para cada uno de ellos.
Tan slo hace falta mantener una copia del editor en la memoria fsica. Cada tabla de pginas
de usuario-proceso hace referencia a la misma copia fsica del editor, pero las pginas de datos lo
hacen a marcos diferentes. As, para permitir 40 usuarios, precisamos solamente una copia del editor,
30K, ms 40 copias del espacio de 5K por usuario. El espacio total requerido es ahora de 230K, en
lugar de 1400K, un ahorro significativo.

17

Tambin pueden compartirse otros programas muy utilizados: compiladores, ensambladores,


sistemas de bases de datos, etc. Para que sea compartible, el cdigo tiene que ser reentrante (no
automodificable). Este trmino significa que nunca debera darse una tentativa de almacenar algo en
el cdigo, que es de slo bsqueda o slo lectura. Obviamente, es crucial que las pginas
compartidas sean inamovibles. Si un usuario cambiara una posicin, cambiara para todos los
usuarios. La naturaleza de slo lectura del cdigo compartido no debera dejarse a merced de la
correccin del cdigo. El sistema operativo debe reforzar esa propiedad.
6.5.5.3 Proteccin
La proteccin de la memoria en un entorno paginado se consigue por medio de unos bits de
proteccin asociados a cada pgina. Normalmente estos bits se mantienen en la tabla de pginas. Un
bit puede definir que una pgina sea de lectura/escritura o de slo lectura. Cada referencia a memoria
pasa a travs de la tabla de pginas para encontrar el nmero de marco correcto. Al tiempo que se
calcula la direccin fsica, pueden verificarse los bits de proteccin para asegurar que no se escribe
sobre una pgina de slo lectura. Una tentativa de escribir sobre una pgina de slo lectura ocasiona
una excepcin hardware al sistema operativo (por violacin de acceso a una zona de la memoria
principal).
Esta concepcin de la proteccin puede ser extendida fcilmente para obtener una proteccin
ms detallada. Podemos disponer de hardware que ofrezca proteccin de slo lectura, lecturaescritura o slo ejecucin. O bien, por medio de bits de proteccin independientes para cada tipo de
acceso, puede permitirse cualquier combinacin de estos accesos, al tiempo que las tentativas
ilegales generan una excepcin al sistema operativo.
6.5.5.4 Dos visiones de la memoria
Un aspecto muy importante de la paginacin es la clara separacin entre la visin de la
memoria que tiene el usuario y la memoria fsica real. El programa de usuario cree que la memoria es
un espacio contiguo, conteniendo solamente ese nico programa. En realidad, el programa de usuario
est disperso por la memoria fsica, que tambin contiene otros programas. La diferencia que existe
entre la visin que el usuario tiene de la memoria y la memoria fsica real se salva por medio del
hardware de traduccin de direcciones o de transformacin (mapping). El hardware de transformacin

18

traduce las direcciones lgicas en direcciones fsicas. Esta operacin permanece oculta al usuario, y
la controla el sistema operativo.
Un resultado de la distincin entre direcciones fsicas y lgicas es que de hecho pueden no
ser iguales. Por ejemplo, en el XDS-940, una direccin lgica es de 14 bits y una direccin fsica es de
16 bits. Un nmero de pgina de 3 bits se usa como ndice en la tabla de pginas para seleccionar un
nmero de marco de 5 bits. As, puede haber hasta 4 veces ms memoria fsica que la que un usuario
puede direccionar.
Esta tcnica fue adoptada en particular por los fabricantes de miniordenadores. Muchos
miniordenadores fueron diseados en los aos 60, cuando la memoria era cara y los programas
tenan que ser pequeos. De esta manera las direcciones estaban limitadas a 15 o 16 bits. Con la
disponibilidad de la memoria de semiconductores, ms barata, se hizo factible aumentar la memoria
fsica de estos miniordenadores. Pero incrementar el tamao de la direccin para obtener direcciones
de 17 o 18 bits, precisas para la memoria fsica aumentada, significaba, o bien redisear el conjunto
de instrucciones, o bien extender el tamao de palabra para acomodar los bits extra. Cualquier
solucin implicara un cambio importante, invalidando todos los programas y documentacin
existentes. La solucin que adoptaron la mayora de los fabricantes fue el mapping de memoria. Las
direcciones lgicas (15 o 16 bits), se transforman en direcciones fsicas (17 o 18 bits).
Multiprogramando el sistema, puede utilizarse toda la memoria. Sin embargo, los usuarios individuales
no pueden emplear ms memoria que antes, puesto que el espacio para la direccin lgica no ha sido
incrementado. No obstante, hay que tener claro que en los sistemas actuales el rango de direcciones
virtuales suele ser muy superior al rango de direcciones reales.
El sistema operativo controla esta transformacin, y puede activarla para el usuario y
desactivarla para el sistema operativo. Puesto que el sistema operativo gestiona memoria fsica, tiene
que estar al tanto de la memoria fsica: qu marcos estn asignados, qu marcos estn disponibles,
cuntos marcos hay en total, etc. Esta informacin se mantiene generalmente en una estructura
denominada tabla de marcos. La tabla de marcos tiene una entrada para cada marco, que indica si
est libre o asignado y, si est asignado, a qu pgina de qu proceso.
Adems, el sistema operativo tiene que conocer qu procesos de usuario operan en el
espacio de usuario, y tiene que transformar todas las direcciones lgicas para generar direcciones
fsicas. Si un usuario realiza una llamada al sistema (para realizar E/S) y da una direccin como
parmetro (por ejemplo, un buffer), esa direccin tiene que ser traducida para generar la direccin
fsica correcta. El sistema operativo puede utilizar la direccin de la tabla de pginas del proceso (que
se guarda en su descriptor o PCB) para traducir las direcciones lgicas en fsicas siempre que tenga
que realizar por l mismo la operacin.

19

6.5.3 Segmentacin
Un aspecto importante de la gestin de la memoria que la paginacin convierte en inevitable
es la separacin de la visin que el usuario tiene de la memoria y la memoria fsica real. La visin del
usuario no coincide con la memoria fsica real. La visin del usuario se transforma en la memoria
fsica. La traduccin de direcciones permite esta diferencia entre la memoria lgica y la fsica.
6.5.3.1 Visin del usuario de la memoria

Cul es la visin de la memoria que tiene el usuario ? Concibe el usuario la memoria como
una tabla lineal de palabras, algunas de las cuales contienen instrucciones mientras que otras
contienen datos, o bien se prefiere alguna otra visin de la memoria ? Hay un acuerdo general en que
el usuario o programador de un sistema no piensa en la memoria como una tabla lineal de palabras.
Ms bien prefieren concebirla como una coleccin de segmentos de longitud variable, no
necesariamente ordenados (fig. 6.14).

Consideremos cmo ve usted un programa cuando lo est escribiendo. Piensa en l como un


programa principal, con un conjunto de subrutinas, procedimientos, funciones o mdulos.
Tambin puede haber diversas estructuras de datos: tablas, matrices, pilas, variables, etc. Cada uno
de estos mdulos o elementos de datos se referencian por un nombre. Usted habla de la "tabla de
smbolos", A "la funcin Sqrt", "el programa principal", sin tener en cuenta qu direcciones de memoria
ocupan estos elementos. Usted no se preocupa de si la tabla de smbolos se almacena antes o
despus de la funcin Sqrt. Cada uno de estos elementos es de longitud variable; la longitud est
definida intrnsecamente por el propsito del segmento en el programa. Los elementos dentro de un
segmento estn identificados por su desplazamiento desde el principio del segmento: la primera
instruccin del programa, la decimosptima entrada de la tabla de smbolos la quinta funcin Sqrt, etc.
La segmentacin es un esquema de administracin de la memoria que soporta la visin que
el usuario tiene de la misma. Un espacio de direcciones lgicas es una coleccin de segmentos. Cada
segmento tiene un nombre y una longitud. Las direcciones especifican tanto el nombre del segmento
como el desplazamiento dentro del segmento. Por lo tanto, el usuario especifica cada direccin
mediante dos cantidades: un nombre de segmento y un desplazamiento. (Comprese este esquema
con la paginacin, donde el usuario especificaba solamente una nica direccin, que el hardware
particionaba en nmero de pgina y desplazamiento, siendo todo ello invisible al programador).
Por simplicidad de implementacin, los segmentos estn numerados y se referencian por un
nmero de segmento en lugar de por un nombre. Normalmente el programa de usuario se ensambla
(o compila), y el ensamblador (o el compilador) construye automticamente segmentos que reflejan

20

el programa de entrada. Un compilador de Pascal podra crear segmentos separados para (1) las
variables globales, (2) la pila de llamada de procedimientos, para almacenar parmetros y devolver
direcciones, (3) el cdigo de cada procedimiento o funcin, y (4) las variables locales de cada
procedimiento y funcin. El cargador tomara todos esos segmentos y les asignara nmeros de
segmento.

6.5.3.2 Hardware
Aunque el usuario ahora puede referenciar los objetos del programa por medio de una
direccin de dos dimensiones, la memoria fsica real es todava, por supuesto, una secuencia
unidimensional de palabras. La transformacin se efecta por medio de una tabla de segmentos.
El empleo de una tabla de segmentos se muestra en la figura 6.15. Una direccin lgica
consta de dos partes: un nmero de segmento s y un desplazamiento dentro de ese segmento, d. El
nmero de segmento se utiliza como un ndice en la tabla de segmentos. Cada entrada de la tabla de
segmentos tiene una base de segmento y un lmite. El desplazamiento d de la direccin lgica tiene
que estar comprendido entre 0 y el lmite de segmento. En caso contrario se produce una excepcin
al sistema operativo (tentativa de direccionamiento lgico ms all del fin de segmento). Si este
desplazamiento es legal, se aade a la base para producir la direccin de la tabla deseada en la
memoria fsica. La tabla de segmentos es as esencialmente una matriz de pares registros
base/lmite.

6.5.3.3 Implementacin de tablas de segmentos


Al igual que la tabla de pginas, la tabla de segmentos puede situarse bien en registros
rpidos o bien en memoria. Una tabla de segmentos mantenida en registros puede ser referenciada
muy rpidamente: la adicin a la base y la comparacin con el lmite pueden realizarse
simultneamente para ahorrar tiempo. El PDP-11/45 utiliza este mtodo; tiene 8 registros de
segmento. Una direccin de 16 bits se forma a partir de un nmero de segmento de 3 bits y de un
desplazamiento de 13 bits. Esta disposicin permite hasta 8 segmentos; cada segmento puede ser de
hasta 8 K-bytes. Cada entrada en la tabla de segmentos tiene una direccin base, una longitud y un

21

conjunto de bits de control de acceso que especifican acceso denegado, acceso de slo lectura, o
acceso de lectura/escritura al segmento.
El Burroughs B5500 permita 32 segmentos de hasta 1024 palabras cada uno. Estas
especificaciones definan un nmero de segmento de 5 bits y un desplazamiento de 10 bits. Sin
embargo, la experiencia con este sistema mostr que los segmentos eran pocos y que el lmite del
tamao del segmento era demasiado pequeo (las tablas mayores de 1K tenan que fragmentarse
entre varios segmentos). Por ello, el GE 645 utilizado por Multics permite hasta 256 K-segmentos de
hasta 64 K-palabras.
Con tantos segmentos no es factible mantener la tabla de segmentos en registros, de modo
que tiene que mantenerse en memoria. Un registro de base de tabla de segmentos (STBR) apunta a
la tabla de segmentos. Puesto que el nmero de segmentos utilizado por un programa puede variar
ampliamente, tambin se utiliza un registro de longitud de tabla de segmentos (STLR). En el caso de
una direccin lgica (s, d) verificamos primero que el nmero de segmento s es legal (s < STLR),
Entonces, aadimos el nmero de segmento al STBR resultando la direccin en memoria de la
entrada de la tabla de segmentos (STBR + s). Esta entrada se lee en la memoria y actuamos igual
que antes: se verifica el desplazamiento frente a la longitud de segmento, y se calcula la direccin
fsica de la palabra deseada como la suma de la base del segmento y el desplazamiento.
Igual que con la paginacin, esta transformacin requiere dos referencias a memoria por
direccin lgica, el ordenador disminuir su velocidad en un factor de 2, a menos que se haga algo
para evitarlo. La solucin normal consiste en utilizar un conjunto de registros asociativos para
mantener las entradas utilizadas ms recientemente en la tabla de segmentos. Un conjunto de
registros asociativos relativamente pequeo (8 \ 16) puede reducir generalmente el retardo a los
accesos a memoria hasta no ms all de un 10% o 15% ms lentos que los accesos a memoria
"mapeada".

6.5.3.4 Comparticin y proteccin


Una ventaja importante de la segmentacin es la asociacin de la proteccin con los
segmentos. Puesto que los segmentos representan una porcin del programa definida
semnticamente, es probable que todas las entradas en el segmento se utilicen de la misma manera.
De ah que tengamos algunos segmentos que son instrucciones, mientras que otros son datos. En
una arquitectura moderna las instrucciones son no automodificables, de modo que los segmentos de
instrucciones pueden definirse como de slo lectura o slo ejecucin. El hardware verificar los bits de
proteccin asociados a cada entrada en la tabla de segmentos para impedir accesos ilegales a
memoria, tales como tentativas de escribir en un segmento de slo lectura o de utilizar un segmento
de slo ejecucin como datos. Situando una tabla en un segmento propio, el hardware verificar
automticamente que toda indexacin en la tabla es legal, y no sobrepasa los lmites de la misma.
As, muchos errores frecuentes en programas sern detectados por hardware antes de que puedan
ocasionar un dao serio.
Otra ventaja de la segmentacin est relacionada con la comparticin de cdigo y datos. Los
segmentos se comparten cuando las entradas en las tablas de segmentos de dos procesos diferentes
apuntan a las mismas posiciones fsicas.
La comparticin se produce a nivel de segmento. Por lo tanto, cualquier informacin puede
compartirse definindole un segmento. Pueden compartirse varios segmentos, de modo que es
posible compartir un programa compuesto de ms de un segmento.
Por ejemplo, consideremos el uso de un editor de textos en un sistema de tiempo
compartido. Un editor completo podra resultar bastante largo, y formado por muchos segmentos.
Estos segmentos pueden compartirse entre todos los usuarios, limitando la memoria fsica necesaria
para soportar las tareas de edicin. En lugar de necesitar n copias del editor, precisamos solamente
una. An necesitamos segmentos nicos e independientes para almacenar las variables locales de
cada usuario. Estos segmentos, por supuesto, no deben ser compartidos.

22

Tambin es posible compartir solo partes de programas. Por ejemplo, subrutinas de uso
frecuente pueden compartirse entre muchos usuarios definindolas como segmentos de slo lectura
compartibles. Por ejemplo, dos programas Fortran pueden utilizar la misma subrutina Sqrt, pero slo
ser precisa una copia fsica de la rutina Sqrt.
Aunque esta comparticin parece ser bastante sencilla, tiene algunas sutilezas. Tpicamente,
los segmentos de cdigo tienen referencias a s mismos. Por ejemplo, un salto condicional tiene
normalmente una direccin de transferencia. La direccin de transferencia es un nombre de segmento
y un desplazamiento. El nmero de segmento de la direccin de transferencia ser el del segmento de
cdigo. Si tratamos de compartir este segmento, todos los procesos que lo compartan tienen que
definir el segmento de cdigo compartido con el mismo nmero de segmento.
Por ejemplo, si queremos compartir la rutina Sqrt y un proceso quiere definirla como
segmento 4 y otro lo hace como segmento 17, cmo podra la subrutina Sqrt referenciarse a s
misma? Puesto que solamente hay una copia fsica de Sqrt, tiene que referenciarse a s misma de la
misma manera para ambos usuarios: tiene que tener un nmero de segmento nico. A medida que
crece el nmero de usuarios que comparten el segmento, tambin crece la dificultad de encontrar un
nmero de segmento aceptable.
Los segmentos de datos de slo lectura (sin punteros) pueden compartirse an usando
nmeros de segmento diferentes; lo mismo puede hacerse con segmentos de cdigo que no se
referencian directamente a s mismos, sino slo indirectamente. Por ejemplo, la bifurcacin
condicional que especifica la direccin de desplazamiento a partir del valor actual del contador de
programa o respecto a un registro que contiene el nmero de segmento actual, permite que el cdigo
no tenga que realizar una referencia al nmero de segmento actual.
El ordenador GE 645 utilizado con Multics tena 4 registros que contenan los nmeros de
segmento del segmento actual, del segmento de pila, del segmento de enlace y de un segmento de
datos. Los programas pocas veces hacen referencia directamente a un nmero de segmento, sino
siempre indirectamente a travs de estos cuatro registros de segmento. Esto permite que el cdigo
pueda compartirse libremente.

6.5.3.5 Fragmentacin
El sistema operativo tiene que encontrar y asignar memoria para todos los segmentos de un
programa de usuario. Esta situacin es similar a la paginacin, excepto en el hecho de que los
segmentos son de longitud variable; las pginas son todas del mismo tamao. Por tanto, como en el
caso de las particiones dinmicas, la asignacin de memoria es un problema de asignacin dinmica
de almacenamiento, resuelto probablemente mediante un algoritmo del mejor o primer ajuste.
La segmentacin puede ocasionar entonces fragmentacin externa, cuando todos los bloques
libres de memoria son demasiado pequeos para acomodar a un segmento. En este caso, el proceso
puede simplemente verse obligado a esperar hasta que haya disponible ms memoria (o al menos
huecos ms grandes), o puede utilizarse la compactacin para crear huecos mayores. Puesto que la
segmentacin es por naturaleza un algoritmo de reubicacin dinmica, podemos compactar la
memoria siempre que queramos.
En qu medida es mala la fragmentacin externa en un esquema de segmentacin ? La
respuesta a estas preguntas depende principalmente del tamao medio de segmento. En un extremo,
se podra definir cada proceso como un segmento; este esquema es el de las particiones dinmicas.
En el otro extremo, cada palabra podra situarse en su propio segmento y reubicarse por separado.
Esta disposicin elimina la fragmentacin externa. Si el tamao medio de segmento es pequeo, la
fragmentacin externa tambin ser pequea. (Por analoga, consideremos la colocacin de las
maletas en el maletero de un coche; parece que nunca encajan bien. Sin embargo, si se abren las
maletas y se colocan en el maletero los objetos sueltos, todo encaja). Puesto que los segmentos
individuales son ms pequeos que el proceso en conjunto, es ms probable que encajen en los
bloques de memoria disponibles.

23

24

Você também pode gostar