Está en la página 1de 59

3.

ADMINISTRACIÓN DE MEMORIA

3.1 MANEJO DE LA MEMORIA REAL


La organización y administración de la Memoria principal, memoria primaria o
memoria real de un sistema de cómputo ha sido uno de los factores más
importantes que influyen en el diseño de los sistemas operativos. Los términos
memoria y almacenamiento se han utilizado como sinónimos en la literatura.
Los programas y datos deben residir en la memoria principal para poderlos
ejecutar o para hacer referencia directamente a ellos. El almacenamiento
secundario (el medio más común es el disco magnético), proporciona
capacidad barata y en gran escala para los numerosos programas y datos que
deben mantenerse disponibles para su procesamiento.

3.1.1 ORGANIZACIÓN Y ADMINISTRACIÓN DEL ALMACENAMIENTO


Por organización del almacenamiento se entiende la forma de considerar el
almacenamiento principal. Esto es, la manera como se estructura la memoria
en sentido físico.
La administración del almacenamiento se orienta a lograr determinado
comportamiento de una organización de almacenamiento cuando se siguen
diferentes políticas.

3.1.2 JERARQUÍA DEL ALMACENAMIENTO


Los programas y datos necesitan estar en el almacenamiento principal para ser
ejecutados o para poder hacer referencia de ellos. Los programas o datos que
no se necesitan de inmediato pueden guardarse en el almacenamiento
secundario hasta que se necesiten y en ese momento se transfieren al
almacenamiento principal para ser ejecutados o hacer referencia a ellos. Los
medios de almacenamiento secundario, como cintas o discos, son en general
menos costosos que el almacenamiento principal y su capacidad es mucho
mayor. Normalmente es mucho más rápido el acceso al almacenamiento
principal que al secundario. En los sistemas con varios niveles de
almacenamiento hay muchas transferencias constantes de programas y datos
entre los diferentes niveles. Estas trasferencias consumen recursos del
sistema, como tiempo de la CPU, que de otro modo podría utilizarse con
provecho.
En los años sesenta se hizo evidente que la jerarquía del almacenamiento
podría extenderse un nivel más con una clara mejora del rendimiento y la
utilización. Este nivel adicional, la memoria caché, es un almacenamiento de
alta velocidad, mucho más rápido que el almacenamiento principal. La memoria
caché es extremadamente cara, comparada con la memoria principal, por lo
que sólo se utilizan memorias caché relativamente pequeñas. La figura 3.1
muestra la relación que existe entre la memoria caché, el almacenamiento
principal y el almacenamiento secundario.
La memoria caché introduce un nivel adicional de transferencia de información
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
más rápido que en la principal. La esperanza de los diseñadores que utilizan el
concepto de memoria caché es que el trabajo extra requerido por la
transferencia de los programas sea mucho menor que el aumento del
rendimiento obtenido por la rápida ejecución que es posible en la memoria
caché.

3.1.3 ESTRATEGIAS DE ADMINISTRACIÓN DEL ALMACENAMIENTO


Los recursos caros se administran intensivamente para obtener una mejor
utilización. Las estrategias de la administración del almacenamiento se ajustan
para obtener el mejor aprovechamiento posible del recurso de almacenamiento
principal. Las estrategias de la administración del almacenamiento se dividen
en las siguientes categorías.
1. Estrategias de obtención
a) Estrategias de obtención por demanda
b) Estrategias de obtención anticipada
2. Estrategias de colocación
3. Estrategias de reemplazo

Las estrategias de obtención determinan cuándo debe obtenerse la siguiente


parte el programa o los datos que se van a transferir del almacenamiento
secundario al principal.
Las estrategias de colocación tienen que ver con la determinación de la parte
del almacenamiento principal donde se colocará un programa entrante.

Las estrategias de reemplazo están relacionadas con la determinación de qué


parte del programa o de los datos se debe desalojar para dejar espacio a los
programas entrantes.

3.1.4 ASIGNACIÓN DEL ALMACENAMIENTO CONTIGUO Y NO CONTIGUO


Los primeros sistemas de cómputo requerían una asignación de
almacenamiento contiguo: cada programa tenía que ocupar un único bloque
contiguo de localidades de memoria. No fue sino hasta que se intentó hacer
multiprogramación con particiones variables cuando quedó claro que podía ser
útil la asignación de almacenamiento no contiguo.
En la asignación de almacenamiento no contiguo un programa se divide en
varios bloques o segmentos que se pueden colocar en el almacenamiento
principal en fragmentos que no necesitan ser adyacentes. Es más difícil para
un sistema operativo controlar la asignación del almacenamiento no contiguo,
pero la ventaja es que, si el almacenamiento principal tiene muchos huecos
pequeños disponibles en lugar de un único hueco grande, el sistema operativo
a menudo puede cargar y ejecutar un programa que en otro caso tendría que
esperar.

3.1.5 ASIGNACIÓN DE ALMACENAMIENTO CONTIGUO PARA UN


USUARIO ÚNICO
Los primeros sistemas de cómputo permitían que sólo una persona a la vez
utilizara la máquina. Todos los recursos de la máquina estaban a disposición
del usuario. El cobro del uso del computador era muy simple: como el usuario
disponía de toda la máquina, se le cobraban todos los recursos, ya fuera que
sus trabajos los utilizaran o no. De hecho, el mecanismo de cobro normal se
basaba en el tiempo de reloj. La máquina se asignaba a un usuario por algún
tiempo determinado y se le cobraba una tarifa fija por hora Algunos de los
sistemas compartidos actuales tienen algoritmos de cobro mucho más
complejos.

Originalmente, cada usuario escribía todo el código necesario para realizar una
aplicación específica, incluyendo las detalladas instrucciones de entrada/salida
a nivel de la máquina. Muy pronto el código de entrada/salida requerido para
realizar las funciones básicas se consolidó en un sistema de control de
entrada/salida (input/output control system, IOCS). Los usuarios que querían
hacer entrada/salida ya no tenían que codificar directamente las instrucciones,
sino que llamaban a las rutinas de IOCS para realizar el trabajo. Ello
simplificaba y aceleraba mucho el proceso de codificación. La implantación de
los sistemas de control de entrada/salida bien pudo haber constituido el
comienzo del concepto actual de sistemas operativos. La figura 3.2 ilustra la
organización del almacenamiento en un sistema representativo de asignación
de almacenamiento contiguo con un único usuario.
En tamaño de los programas está limitado por la cantidad de memoria principal,
pero es posible ejecutar programas más grandes que el almacenamiento
principal utilizando superposiciones(overlay). La figura 3.3 ilustra el concepto.
Si una sección de un programa no se necesita durante el resto de la ejecución
del programa, entonces se puede traer del almacenamiento secundario otra
sección del programa para ocupar el espacio utilizado por la que ya no se
necesita.

Las superposiciones ofrecen al programador una forma de ampliar el


almacenamiento principal limitado. Sin embargo, la superposición manual exige
una cuidadosa planificación y lleva mucho tiempo.
Protección en los sistemas de usuario único
En los sistemas de asignación de almacenamiento contiguo para un solo
usuario, este último tiene un control absoluto sobre todo el almacenamiento
principal. La memoria se divide en una parte en la que residen las rutinas del
sistema operativo, otra en la que residen los programas del usuario y otra no
utilizada. La cuestión de la protección es sencilla.
Si el programa del usuario se desvía puede destruir el sistema operativo. Si
esto resulta fatal y el usuario no puede proseguir, sabrá que algo anda mal,
terminará la ejecución, arreglará el problema y volverá a intentar la ejecución
de su programa. En tales circunstancias no resulta evidente la necesidad de
proteger el sistema operativo.
Pero supóngase que el usuario destruye el sistema operativo más "sutilmente".
Por ejemplo, supóngase que ciertas rutinas de entrada/salida son modificadas
por accidente, de tal modo que pueden estar truncados todos los registros de
salida. El trabajo puede seguir en ejecución; pero si los resultados no se
examinan sino hasta que se completa el trabajo, entonces se estarán
desperdiciando los recursos de máquina. Peor aún, el daño al sistema
operativo puede hacer que se produzcan salidas cuyos errores no san
evidentes.

Sin duda es obvio que el sistema operativo se debe proteger del usuario. La
protección se realiza con un registro de límites único integrado en la CPU,
como se muestra en la figura 3.4. Cada vez que un programa de usuario hace
referencia a una dirección de memoria, se revisa el registro de limites para
verificar que el usuario no está a punto de destruir el sistema operativo. El
registro de límites contiene la dirección más alta utilizada por el sistema
operativo. Si el usuario intenta entrar en el sistema operativo, se intercepta la
instrucción y el trabajo termina con un mensaje de error apropiado.

Naturalmente, el usuario necesita entrar de vez en cuando en el sistema


operativo para utilizar algunos servicios, como la entrada/salida. El problema se
resuelve dando al usuario una instrucción específica con la cual puede solicitar
los servicios del sistema operativo (es decir, una instrucción de llamada al
supervisor). El usuario que desee leer en una cinta enviará una instrucción
solicitando al sistema operativo que lo haga por él. El sistema operativo
realizará la función deseada y después devolverá el control al programa del
usuario.

A medida que se han vuelto más complejos los sistemas operativos ha sido
necesario llevar a la práctica mecanismos más avanzados para proteger al
sistema operativo de los usuarios y proteger a éstos entre sí.

3.1.6 MULTIPROGRAMACIÓN CON PARTICIONES FIJAS


Aun con los sistemas operativos de procesamiento por lotes, los sistemas de
usuario único siguen desperdiciando una gran cantidad de los recursos de
cómputo. La Figura 3.5 ejemplifica la situación. El programa consume el
recurso de la CPU hasta que se necesita una entrada o una salida. Cuando se
genera la solicitud de E/S, es frecuente que el trabajo no pueda continuar sino
hasta que se envíen o reciban los datos requeridos. Las velocidades de
entrada y salida son muy bajas, en comparación con las velocidades de la
CPU.

Figura 3.5 Utilización de la UCP en un sistema de un solo Usuario. Nota: En


muchos trabajos de un solo usuario, la duración de las esperas por
entrada/salida es mucho mayor con respecto a la duración de los periodos de
utilización de la UCP que lo indicado en

este diagrama.

Los diseñadores vieron que otra vez podrían aumentar notablemente el


aprovechamiento de la CPU mediante una administración intensiva. Esta vez
decidieron realizar sistemas de multiprogramación en los cuales varios usuarios
compiten al mismo tiempo por los recursos del sistema. El trabajo que está
esperando la terminación de una operación E/S cederá la CPU a otro trabajo
que esté listo para realizar cálculos, si es que hay uno en espera. De esta
forma pueden efectuarse simultáneamente las operaciones de E/S y los
cálculos de la CPU. Esto mejora mucho el aprovechamiento de la CPU y los
resultados del sistema.
Para aprovechar al máximo la multiprogramación, es necesario que varios
trabajos residan al mismo tiempo en el almacenamiento principal del
computador. Así, cuando un trabajo solicita E/S, la CPU puede conmutarse de
inmediato a otro y realizar cálculos sin retraso. Cuando este nuevo trabajo
abandona la CPU, otro puede estar listo para utilizarla.
La multiprogramación requiere por lo regular mucho más almacenamiento que
un sistema de usuario único. Sin embargo, la mejor utilización de la CPU y los
dispositivos periféricos justifica de sobra el costo del almacenamiento adicional.

Multiprogramación con particiones fijas: traducción y carga absolutas


Los primeros sistemas de multiprogramación utilizaban la multiprogramación
con partición fija, en la cual el almacenamiento principal se dividía en
particiones de tamaño fijo. En cada partición podía haber un solo trabajo. La
UCP se conmutaba rápidamente entre los usuarios para crear la ilusión de
simultaneidad.
Los trabajos se traducían con compiladores y ensambladores absolutos para
ejecutarse sólo en una partición específica. (Figura 3.6). Si un trabajo estaba
listo para ser ejecutado y su partición estaba ocupada , tenía que esperar,
aunque estuvieran libres otras particiones (Figura 3.7). Tal cosa provoca un
desperdicio del almacenamiento, pero el sistema operativo era relativamente
simple de llevar a la práctica.

Figura 3.6 multiprogramación con particiones fijas, con traducción y carga


absolutas.
Multiprogramación con particiones fijas: traducción y carga con
reubicación

Los compiladores, ensambladores y cargadores con reubicación sirven para


producir programas reubicables que se pueden ejecutar en cualquier partición
disponible que sea lo bastante grande para contenerlos (Figura 3.8). Dicho
esquema elimina parte del desperdicio de espacio inherente a la
multiprogramación con carga y traducción absolutos. Los traductores y
cargadores con reubicación son más complejos que los absolutos.
Protección en los sistemas con multiprogramación
En los sistemas de multiprogramación y asignación contigua, la protección se
logra a menudo con varios registros de limites. Con dos registros se pueden
establecer los límites superior e inferior de la partición de un usuario (Figura
3.9) o se puede indicar el límite inferior (o el límite superior) y la longitud de la
región. El usuario que necesita llamar el sistema operativo utiliza una
instrucción de llamada al supervisor para hacerlo. Esto permite al usuario
cruzar el límite del sistema operativo y solicitar sus servicios sin poner en
peligro la seguridad del sistema operativo.

Fragmentación en la multiprogramación con particiones fijas


La fragmentación del almacenamiento se presenta en todos los sistemas de
cómputo, sea cual sea la organización de su almacenamiento. En los sistemas
con
multiprogramación y particiones fijas, la fragmentación ocurre porque los
trabajos de los usuarios no llenan por completo las particiones designadas o
porque una partición se queda sin utilizar por ser demasiado pequeña para
contener un trabajo en espera.

3.1.7 MULTIPROGRAMACIÓN CON PARTICIONES VARIABLES


Al observar los diseñadores de sistemas operativos los problemas de la
multiprogramación con particiones fijas, decidieron que una mejora evidente
sería permitir que los trabajos ocuparon tanto espacio como necesitaran (pero
no todo el almacenamiento real). No se impondrían límites fijos, sino que se
daría a los trabajos todo el almacenamiento que necesitaran. Este esquema se
denomina multiprogramación con particiones variables. En la figura 3.10 se
ilustra la asignación inicial de las particiones en un sistema de
multiprogramación con particiones variables.
Aquí sólo se tratarán los esquemas de asignación contigua: un trabajo debe
ocupar localidades de memoria contiguas. En la multiprogramación con
particiones variables no se hacen suposiciones sobre el tamaño de los trabajos
(excepto que no deben ser mayores que el almacenamiento principal disponible
en el computador). Si cuando llega un trabajo los mecanismos de planificación
deciden que debe proseguir, se le asigna tanto espacio como necesite. No hay
desperdicio, pues la partición de un trabajo tiene exactamente el tamaño del
trabajo.
No obstante, todo esquema de organización del almacenamiento implica algún
grado de desperdicio. En la multiprogramación con particiones variables, el
desperdicio no se hace evidente sino hasta que los trabajos empiezan a
terminar y dejan huecos en el almacenamiento principal. Como se muestra en
la figura 3.11. Otros trabajos pueden utilizar dichos huecos, pero entonces los
huecos restantes se hacen más pequeños, acabando por ser tan reducidos que
no pueden contener nuevos trabajos. Así pues, en la multiprogramación con
particiones variables también hay desperdicio.
Condensación de Huecos

Cuando termina un trabajo en un sistema de multiprogramación con particiones


variables, se puede comprobar si el almacenamiento liberado colinda con otras
áreas libres del almacenamiento (huecos). Si es así, se puede registrar en la
lista de almacenamiento libre ya sea (1) un hueco adicional o (2) un hueco
único que refleje la unión del hueco existente y del nuevo hueco adyacente.
El proceso de fusionar huecos adyacentes para formar un solo hueco más
grande se denomina condensación y se ilustra en la figura 3.12. Mediante la
condensación de huecos se pueden recuperar los bloques contiguos de
almacenamiento más grandes que sea posible.
Compactación del almacenamiento.

A pesar de la condensación de los huecos, muchas veces resulta que los


huecos individuales distribuidos a lo largo del almacenamiento principal
constituyen una parte significativa del almacenamiento. A veces, cuando un
trabajo pide cierta cantidad de almacenamiento principal, ningún hueco
individual es lo bastante grande para contenerlo, aunque la suma de todos los
huecos sea mayor que el almacenamiento requerido por el nuevo trabajo.
La técnica de compactación del almacenamiento (figura 3.13) implica trasladar
todas las áreas ocupadas del almacenamiento a algún extremo de la memoria
principal. Esto deja un gran hueco único de almacenamiento libre, en lugar de
los numerosos huecos pequeños característicos de la multiprogramación con
particiones variables. Ahora todo el almacenamiento libre está contiguo, así
que un trabajo en espera puede ejecutarse si sus necesidades de memoria son
satisfechas por el hueco único resultante de la compactación. A veces, y en
forma por demás pintoresca, la compactación del almacenamiento se
denomina eructo del almacenamiento (burping the storage). Un nombre mas
convencional es recolección de basura (garbage collection).

La compactación presenta los siguientes inconvenientes.

Consume recursos del sistema que podrían utilizarse en forma productiva.


El sistema debe detener todas sus actividades mientras realiza la
compactación.
Ello puede ocasionar tiempos de respuestas irregulares para usuarios
interactivos
y podría ser devastador en sistemas de tiempo real.

La compactación implica reubicar los trabajos que estén en el


almacenamiento.
Eso significa que la información requerida para realizar la reubicación, que se
pierde por lo regular cuando se carga un programa, debe ahora mantenerse
accesible.

Con una combinación normal de trabajos que cambia rápidamente, a


menudo es necesario compactar. Los recursos del sistema que se consuman
quizá no justifiquen las ventajas de la compactación.

Estrategias de colocación en almacenamiento

Las estrategias de colocación en almacenamiento sirven para determinar en


qué lugar del almacenamiento principal se deben colocar los programas y datos
entrantes. En la figura 3.14 se ilustran tres estrategias mencionadas a menudo
en la literatura.
Estrategiadel mejor ajuste: Un trabajo que entre en el sistema se colocará en
el hueco del almacenamiento principal en el que quepa mejor y que deje la
menor cantidad posible de espacio sin utilizar. Para muchos, el mejor ajuste
parece ser intuitivamente la estrategia más atractiva.

Estrategiadel primer ajuste: Un trabajo que entre en el sistema se colocará


en el
almacenamiento principal en el primer hueco disponible lo bastante grande
para contenerlo. Intuitivamente, el primer ajuste también es atractivo, pues
permite decidir con rapidez dónde se colocará un trabajo.

Estrategia del peor ajuste: A primera vista ésta parecería una elección
extravagante, pero después de un examen más cuidadoso, el peor ajuste
también posee un fuerte atractivo intuitivo. El peor ajuste consiste en colocar un
programa en el almacenamiento primario en el hueco donde peor se ajusta, es
decir, en el hueco más grande posible. El atractivo intuitivo es sencillo:
Después de colocar el
programa en ese gran hueco, el hueco restante a menudo será también grande
y por consiguiente podrá contener un nuevo programa relativamente grande.
Una variante de la estrategia del primer ajuste, denominada estrategia del
siguiente ajuste, comienza cada búsqueda de un hueco disponible en el lugar
donde terminó la búsqueda anterior.

3.1.8 MULTIPROGRAMACIÓN CON INTERCAMBIO DE ALMACENAMIENTO

En algunos sistemas de intercambio(Swapping)(Figura 3.15), un trabajo ocupa


el almacenamiento principal de una vez. Ese trabajo se ejecuta hasta que no
puede continuar y entonces cede el almacenamiento y la CPU al siguiente
trabajo. Así todo el almacenamiento está dedicado a un trabajo por un periodo
breve; después se saca ese trabajo (es decir, se intercambia con el de afuera)
y se carga el siguiente (es decir, se intercambia con el de adentro). Un trabajo
normalmente será intercambiado en ambos sentidos repetidas veces antes de
completarse.
Muchos de los primeros sistemas de tiempo compartido se efectuaron con esta
técnica de intercambio. Se podían garantizar tiempos de respuesta razonables
para unos pocos usuarios, pero los diseñadores sabían que se necesitarían
mejores técnicas para manejar un gran número de usuarios. Los sistemas de
intercambio de principios de los años sesenta dieron lugar a los sistemas de
paginación de uso común en la actualidad.
Se han desarrollado sistemas de intercambio más avanzados que permiten
mantener en memoria principal varias imágenes (copias) de usuario al mismo
tiempo. En estos sistemas una imagen de usuario se saca sólo cuando su
almacenamiento es requerido por una imagen de usuario entrantes. Con
suficiente espacio de almacenamiento, tales sistemas reducen
considerablemente el tiempo gastado en los intercambios.
3.2 ORGANIZACIÓN DE LA MEMORIA VIRTUAL

El término almacenamiento virtual suele asociarse con la capacidad para


obtener acceso a direcciones en un espacio de almacenamiento mucho mayor
que el disponible en el almacenamiento primario de un sistema de cómputo
determinado. El almacenamiento virtual no es un concepto nuevo. Apareció por
primera vez en el sistema de cómputo Atlas construido en la Universidad de
Manchester, Inglaterra, en 1960. No obstante, el empleo generalizado de los
sistemas de almacenamiento virtual es relativamente reciente. Los
microprocesadores actuales manejan el almacenamiento virtual.
Los dos métodos más comunes para poner en práctica el almacenamiento
virtual son la paginación y la segmentación. Algunos sistemas de
almacenamiento virtual
emplean una técnica u otra, mientras que algunos otros utilizan ambas. Todos
los sistemas de almacenamiento virtual tienen la propiedad de que las
direcciones calculadas por programas en ejecución no son necesariamente las
disponibles en el almacenamiento primario. De hecho, las direcciones virtuales
se seleccionan por lo regular de un conjunto de direcciones mucho más grande
que el disponible en el almacenamiento primario.

3.2.1 EVOLUCIÓN DE LA ORGANIZACIÓN DEL ALMACENAMIENTO

La figura 3.16 muestra cómo ha evolucionado la organización del


almacenamiento desde los sistemas de almacenamiento real dedicados a un
solo usuario hasta los
sistemas de almacenamiento virtual que combinan técnica paginación y
segmentación.
3.2.2 ALMACENAMIENTO VIRTUAL: CONCEPTOS BÁSICOS

La clave del concepto de almacenamiento virtual es la disociación de las


direcciones a las que hace referencia un proceso en ejecución de las
direcciones disponibles en el almacenamiento primario. Las direcciones a las
que hace referencia un proceso en ejecución se conocen como direcciones
virtuales. Las direcciones disponibles en el almacenamiento primario se
conocen como direcciones reales. El intervalo de direcciones virtuales a las que
puede hacer referencia un proceso en ejecución se conoce como espacio de
direcciones virtuales, V, del proceso. El intervalo de direcciones reales
disponibles en un sistema de cómputo determinando se conoce como espacio
de direcciones reales, R, del computador. El número de direcciones en V se
denota |V|, y el número de direcciones en R, |R|. En los sistemas de
almacenamiento virtual ya implantados lo normal es que |V| >> |R|, aunque se
han construido sistemas en los cuales |V| < |R|. Aunque los procesos sólo
hacen referencia a direcciones virtuales, deben ejecutarse en el
almacenamiento real. Por tanto, es preciso establecer la correspondencia entre
las direcciones virtuales y las reales durante la ejecución de un proceso. Esto
debe hacerse con rapidez, pues en caso contrario el rendimiento del sistema se
degradaría a niveles inaceptables, eliminando así las ganancias logradas por el
empleo del concepto de almacenamiento virtual (figura 3.17)

Se han desarrollado varios métodos para asociar las direcciones virtuales con
las reales. Los mecanismos de traducción dinámica de direcciones (dynamic
address translation, DAT) convierten las direcciones virtuales en direcciones
reales mientras se ejecuta un proceso. 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 el
almacenamiento real. Esto se conoce como contigüidad artificial(figura 3.18).
De esta forma se libera al usuario de la preocupación por la posición de
procedimientos y datos en el almacenamiento real. El usuario puede escribir los
programas con la mayor naturalidad, atendiendo a detalle de eficiencia del
algoritmo y estructura del programa y haciendo caso omiso de los detalles de la
estructura de hardware subyacente. La computadora se considera (o puede
ser) un vehículo de realización de algoritmos en un sentido lógico, en lugar de,
en un sentido físico, un dispositivo de características únicas, algunas de las
cuales pueden obstaculizar el proceso de diseño de programas.

3.2.3 PAGINACIÓN: CONCEPTOS BÁSICOS

Teniendo en cuenta la complejidad del manejo de bloques de tamaño variable


en la multiprogramación con particiones variables, lo más conveniente es
comenzar con la correspondencia de bloques de tamaño fijo; es decir, la
paginación.

Una dirección virtual en un sistema de paginación es un par ordenado (p, d) en


el cual p es el número de la página del almacenamiento virtual en la que reside
el elemento al que se hace referencia, y d es el desplazamiento dentro de la
página p donde se localiza dicho elemento(figura 3.19). Un proceso puede
ejecutarse si su página activa se encuentra en el almacenamiento primario. Las
páginas se transfieren del almacenamiento secundario al primario y se colocan
dentro de bloques llamados marcos de página que tienen el mismo tamaño que
las páginas entrantes. Los marcos de página comienzan en direcciones de
almacenamiento real que son múltiplos enteros del tamaño fijo de la página
(figura 3.20). Una página entrante puede colocarse en cualquier marco de
página disponible.
Nota: Los marcos de pagina son receptáculos, nichos o huecos donde se van a
depositar bloques de información.
La traducción dinámica de direcciones en la paginación se realiza de la
siguiente forma. Un proceso en ejecución hace referencia a una dirección de
almacenamiento virtual v=(p, d). Un mecanismo de correspondencia de
páginas (Figura 3.21) busca la página p en una tabla de correspondencia de
páginas y determina que la página p se encuentra en el marco de página p’ . La
dirección de almacenamiento real se forma concatenando p’ y d.

Ahora consideremos el proceso con mayor detalle. Debido sobre todo a que
normalmente no todos las páginas del proceso se encuentran en el
almacenamiento primario al mismo tiempo, la tabla de correspondencia de
páginas debe indicar si la página a la que se hace referencia se encuentra o no
en el almacenamiento primario; si sí está, donde se encuentra y si no, dónde
puede encontrarse en el almacenamiento secundario. La figura 3.22 muestra
una tabla de correspondencia de páginas representativas. Un bit de residencia
de página, r, tiene valor 0 si la pagina no se encuentra en el almacenamiento
primario, entonces s es su dirección en el almacenamiento secundario. Si la
página se encuentra en el almacenamiento primario, entonces p’ es su número
de marco de página. Obsérvese que p’ no es una dirección real en el
almacenamiento primario; la dirección de almacenamiento primario en la cual
comienza el marco de página, p’’ es el producto de p’ y el tamaño fijo de la
página (suponiendo que los marcos de páginas estén numerados
consecutivamente a partir de cero).

Traducción de direcciones en la paginación por correspondencia directa

Un proceso en ejecución hace referencia a una dirección virtual v = (p,d). Antes


de que un proceso comience su ejecución, el sistema carga (durante la
conmutación de contexto) la dirección en almacenamiento primario de la tabla
de correspondencia de páginas en el registro de origen de la tabla de
correspondencia de páginas. La dirección base, b, de la tabla de
correspondencia de páginas se suma al número de página, p, para formar la
dirección en almacenamiento primario, b + p, de la entrada de la página p en la
tabla de correspondencia de páginas. Esta entrada indica que el marco de
página p' corresponde a la página virtual p. Después, p' se concatena con el
desplazamiento, d, para formar la dirección real, r Se dice que éste es un
ejemplo e correspondencia directa porque la tabla de correspondencia de
páginas contiene una entrada para cada página del almacenamiento virtual del
proceso. Si el proceso tiene n páginas en su almacenamiento virtual, entonces
la tabla de correspondencia de páginas con correspondencia directa del
proceso contiene entradas sucesivas para las páginas 0, 1, 2,..., n - 1. La
correspondencia directa se parece mucho al acceso a un elemento de un
arreglo mediante índices; cualquier entrada de la tabla puede localizarse
directamente con un solo acceso a la tabla, véase la figura 3.23.

Tanto la dirección virtual que se traduce, como la dirección base de la tabla de


correspondencia de páginas, se conservan en registros de alta velocidad en el
procesador central, de manera que las operaciones en las que participan
pueden
realizarse con rapidez dentro de un solo ciclo de ejecución de instrucciones.
Pero la tabla de correspondencia de páginas con correspondencia directa, que
puede ser muy grande, se conserva por lo regular en almacenamiento primario.
En consecuencia, la referencia a la tabla requiere un ciclo completo de
almacenamiento primario. Como el tiempo de un ciclo de almacenamiento
primario representa la mayor parte de un ciclo de ejecución de instrucciones y
se necesita un ciclo de ejecución de almacenamiento primario adicional para la
correspondencia de páginas, el empleo de traducción de direcciones de
páginas mediante correspondencia directa puede hacer que el sistema ejecute
los programas a la mitad de la velocidad, lo cual es inadmisible. Por tanto, para
lograr una traducción más rápida, la mayor parte de los sistemas actuales
colocan la tabla completa de correspondencia directa de páginas en una
memoria caché de muy alta velocidad. Tal cosa ha sido posible gracias a que
los costos de la memoria caché han disminuido constantemente debido a los
avances en la tecnología de memorias.

Traducción de direcciones en la paginación por correspondencia


asociativa

Una forma de acelerar la traducción dinámica de direcciones, es colocar toda


tabla
de correspondencia de páginas dentro de un almacenamiento asociativo
accesible por contenido (y no por dirección), el cual tiene ciclos de un orden de
magnitud más rápidos que los del almacenamiento primario. La figura 3.24
muestra cómo se realiza la traducción dinámica de direcciones con una
correspondencia asociativa pura. Un programa en ejecución hace referencia a
una dirección virtual V = (p,d). Cada entrada en el almacenamiento asociativo
se revisa en forma simultánea en busca de la página p. Se devuelve p' como el
marco de página que corresponde a p, y p' se concatena con d para formar la
dirección real, r. Obsérvese que las flechas dirigidas al mapa de
correspondencias asociativo entran realmente en cada celda del mapa. Esto
indica que se revisa al mismo tiempo cada celda del almacenamiento
asociativo en busca de p. Ésta es la razón de que el almacenamiento
asociativo tenga un costo prohibitivo, aun comparado con la memoria caché,
por lo que nunca se utiliza la correspondencia asociativa pura; aquí se muestra
por si alguna vez se vuelve económica la correspondencia asociativa. De
nuevo, el dilema que se presenta es que la traducción dinámica de direcciones
debe ejecutarse con rapidez para hacerse práctico el concepto de
almacenamiento virtual. Si resulta muy costoso el empleo de la memoria caché
para establecer una correspondencia directa pura, o del almacenamiento
asociativo para establecer una correspondencia asociativa pura, los
diseñadores pueden escoger un esquema intermedio que ofrezca muchas de
las ventajas de la memoria caché o del almacenamiento asociativo, pero con
un costo más modesto.
Traducción de direcciones en la paginación con correspondencia
combinada
asociativa/directa

La mayor parte de la exposición ha tratado hasta ahora acerca del hardware


necesario para poner en práctica de manera eficiente el almacenamiento
virtual. El
hardware se ha presentado desde un punto de vista lógico más que físico. No
nos interesa la estructura precisa de los dispositivos, sino su organización
funcional y sus velocidades relativas. Esta visión del hardware es la que deben
tener los diseñadores de sistemas operativos, sobre todo en ambientes de
desarrollo en los cuales puedan modificarse los diseños de hardware.
En las tres últimas décadas, las mejoras han sido mucho más rápidas en el
hardware que en el software. Se ha llegado al punto en que los diseñadores
prefieren no comprometerse con una tecnología de hardware en particular,
pues esperan que pronto se disponga de una tecnología mejor. Los
diseñadores de sistemas operativos no tienen por lo general muchas opciones,
ya que deben poner en práctica los sistemas operativos con las tecnologías
existentes. También deben enfrentarse a las realidades y los factores
económicos del hardware actual. Hoy día, la memoria caché y la asociativa son
mucho más caras que el almacenamiento primario de acceso directo, lo que
lleva a algunos diseñadores a recurrir a un mecanismo conciliador de
correspondencia de páginas.
Se utiliza un almacenamiento asociativo capaz de contener sólo un pequeño
porcentaje de la tabla de correspondencia de páginas de un proceso (Figura
3.25) (esto se denomina a veces buffer de traducción de búsqueda rápida,
translation lookaside buffer). Las entradas de página mantenidas en este mapa
de correspondencias concuerdan nada más con las páginas a las que se ha
hecho referencia más recientemente, utilizando la heurística de que tales
páginas tienen probabilidades de ser requeridas en un futuro cercano. (Éste es
un ejemplo de localidad. La traducción dinámica de direcciones se realiza de la
siguiente forma. Un programa en ejecución hace referencia a una dirección
virtual v = (p,d). El mecanismo de traducción intenta encontrar primero la
página p en el mapa de correspondencias parcial asociativo. Si p está ahí, el
mapa asociativo devuelve p' como número de marco correspondiente a la
página virtual p, y p' se concatena con el desplazamiento d para formar la
dirección real, r, que corresponde a la dirección virtual v = (p,d). Si no se
encuentra la página p en el mapa de correspondencias parcial asociativo, se
hace referencia a un mapa directo convencional en el almacenamiento
principal. La dirección, b, en el registro de origen de la tabla de páginas se
suma a p para localizar la entrada apropiada para la página p en la tabla del
mapa de páginas de correspondencia directa en almacenamiento primario. La
tabla indica que p' es el marco de página que corresponde a la página virtual p,
y p' se concatena con el desplazamiento d, para
formar la dirección real r correspondiente a la dirección virtual v = (p,d). Ahora
que se ha localizado p en el marco p', el mapa de correspondencias parcial
asociativo se actualiza para incluir esta información; el hardware reemplaza
esta entrada por la de la página menos recientemente utilizada. Ahora, las
referencias (en el futuro cercano) a la página p serán traducidas con rapidez
por medio del mapa de correspondencias de páginas asociativo parcial.
El mapa de correspondencias de páginas asociativo parcial no necesita ser
grande para lograr un buen desempeño. De hecho, sistemas que utilizan esta
técnica con sólo 8 ó 16 registros de almacenamiento asociativo alcanzan a
menudo un 90% del rendimiento que podría obtenerse con un mapa de
correspondencias asociativo completo, el cual podría requerir en los sistemas
actuales cientos o hasta miles de veces ese número de registros.
Utilizar o no el mecanismo combinado de correspondencia asociativa/directa es
una decisión de ingeniería basada en los factores económicos y capacidades
relativos de las tecnologías de hardware existentes. En consecuencia, es
importante que los estudiantes y diseñadores de sistemas operativos estén al
tanto de las nuevas tecnologías de hardware.
Compartimiento en un sistema de paginación

En los sistemas multiprogramados, en especial en los de tiempo compartido, es


común que muchos usuarios ejecuten los mismos programas. Si se asignan
copias individuales de esos programas a cada usuario, se desperdiciaría
mucho almacenamiento primario. La solución obvia es compartir las páginas
que deben compartirse.
El compartimiento debe controlarse con cuidado para evitar que un proceso
modifique los datos que está utilizando otro proceso. En la mayor parte de los
sistemas actuales que realizan comportamiento, los programas se dividen en
áreas separados de procesamiento y de datos. Los procedimientos no
modificables no deben compartirse sin un control de concurrencia cuidadoso.
Los datos no modificables (como una información tabular fija, por ejemplo)
pueden compartirse. Los procedimientos modificables no pueden compartirse
(aunque alguien podría imaginar un ejemplo esotérico en el cual pudiera tener
sentido hacerlo con alguna forma de control de concurrencia).

Toda la exposición hace evidente la necesidad de identificar si cada página se


puede compartir o no. Una vez clasificadas de esta forma todas las páginas de
los procesos, se realiza el comportamiento en los sistemas de paginación pura
como la figura 3.26. Si se hace que ciertas entradas en la tabla de
correspondencia de páginas de diferentes procesos apunten hacia el mismo
marco de página, esos procesos compartirán dicho marco. Compartir reduce la
cantidad de almacenamiento primario necesaria para la ejecución eficiente de
un grupo de procesos, y puede hacer posible que un sistema de servicio a más
usuarios.
Obsérvese en la figura 3.26 que se han colocado las entradas de las páginas
de los procedimientos compartidos en las mismas posiciones en cada mapa de
correspondencias de página (en relación con el comienzo de cada mapa de
correspondencia de páginas).
3.2.4 SEGMENTACIÓN

En la multiprogramación con particiones variables, la colocación de los


programas en el almacenamiento se realiza con una técnica del primer ajuste,
mejor ajuste o peor ajuste. No obstante, persiste la limitación de ejecutar los
programas en un bloque de localidades contiguas de almacenamiento real.
En los sistemas de almacenamiento real con segmentación se elimina dicha
restricción y un programa (y sus datos) pueden ocupar muchos bloques
separados de almacenamiento real (figura 3.27). Los bloques no tienen que ser
del mismo tamaño y sí deben estar formados por localidades contiguas, pero
no es forzoso que ellos sean adyacentes.
Esto da pie a varios problemas interesantes. Por ejemplo, el problema de evitar
que un usuario sea destruido por otros resulta ahora más complejo. Ya no es
suficiente con un par de registros de límites. Así mismo, resulta más difícil
limitar el intervalo de acceso de un programa. Uno de los esquemas para lograr
la protección del almacenamiento en los sistemas con segmentación es el
empleo de claves de protección del almacenamiento, como se ilustra en la
figura 3.28.
En los sistemas de almacenamiento virtual con segmentación, una dirección
virtual es un par ordenado v = (s, d), donde s es el número de segmento en
almacenamiento virtual en el que se encuentra el elemento al que se hace
referencia y d es el desplazamiento dentro del segmento s en donde se localiza
dicho elemento (Figura 3.29). Un proceso sólo se puede ejecutar si su
segmento activo (como mínimo) se encuentra en el almacenamiento primario.
Los segmentos se transfieren del almacenamiento secundario al primario como
unidades completas. Todas las localidades del segmento se colocan en
localidades contiguas del almacenamiento primario. Un segmento entrante
puede colocarse en cualquier área disponible del almacenamiento primario
cuyo tamaño sea suficiente para contenerlo. Las estrategias de colocación para
la segmentación son idénticas a las empleadas en la multiprogramación con
particiones variables, y las técnicas más comunes son las del primer ajuste y
del mejor ajuste.

La traducción dinámica de direcciones en la segmentación se realiza de la


siguiente forma. Un proceso en ejecución hace referencia a una dirección de
almacenamiento virtual v = (s, d) (Figura 3.30). Un mecanismo de
correspondencia de segmentos busca el segmento s en la tabla de
correspondencia de segmentos y determina que el segmento s se encuentra en
el almacenamiento real a partir de la dirección s’. La dirección de
almacenamiento real correspondiente a la dirección de almacenamiento virtual
v = (s, d) se forma sumando s’ y d.
Control del acceso en los sistemas con segmentación

No se recomienda otorgar a cada proceso un acceso ilimitado a todos los


segmentos del sistema. De hecho, una de las cualidades de los sistemas con
segmentación es el cuidadoso control de acceso que puede realizarse, lo cual
se logra asignando a cada proceso ciertos derechos de acceso a cada
segmento y, de hecho, denegando por completo el acceso a muchos
segmentos.
La figura 3.31 muestra los tipos de control de acceso más comunes empleados
por los sistemas actuales. Si un proceso tiene acceso para lectura a un
segmento,
podrá obtener cualquier información contenida en le segmento. Si lo desea
puede realizar una copia completa del segmento.
Si un proceso tiene acceso para escritura a un segmento, entonces puede
modificar cualquier parte del contenido del segmento, y colocar información
adicional. Si lo desea, el proceso puede destruir toda la información del
segmento.
Un proceso con acceso para ejecución a un segmento puede ejecutar ese
segmento como programa. El acceso de ejecución se suela denegar para
segmentos de datos.
Un proceso con acceso para adición a un segmento puede agregar información
adicional al final del segmento, pero no puede modificar la información
existente.
En un sistema con estos cuatro tipos de control de acceso se pueden crear 16
modos de control de acceso diferentes permitiendo o denegando cada uno de
los tipos. Alguno de dichos modos son interesantes, en tanto que otros no
tienen sentido. Por sencillez, considérense las ocho combinaciones diferentes
de los accesos para lectura, escritura y ejecución de la figura 3.32.
En el modo 0 no se permite el acceso al segmento. Esto es útil en esquemas
de seguridad en los que cierto proceso no debe obtener acceso al segmento.
En el modo 1 el proceso tiene acceso sólo para ejecución al segmento.} Este
modo es útil cuando se permite a un proceso usar el programa contenido en el
segmento, pero no puede copiarlo ni modificarlo. Los modos 2 y 3 no son útiles;
no tiene sentido otorgar a un proceso derecho para modificar un segmento si
no tiene derecho a leerlo. En el modo 4 se permite ah proceso acceso sólo
para lectura al segmento. Esto es útil en aplicaciones de consulta de
información en las cuales un proceso debe tener acceso a ha información, pero
no puede modificaría.
En el modo 5 se permite al proceso acceso para lectura/ejecución al segmento.
Esto es útil en situaciones en las cuales se permite a un proceso utilizar el
programa contenido en el segmento, pero no puede modificar ha copia original;
sin embargo, el proceso sí puede hacer su propia copia del segmento y
modificarla.
En el modo 6 se permite al proceso acceso para lectura/escritura a un
segmento. Esto es útil cuando eh segmento contiene datos que pueden ser
leídos o escritos por el proceso, pero que deben protegerse de una ejecución
accidental (ya que el segmento no es un programa).
En el modo 7 se permite ah proceso acceso ilimitado a un segmento. Esto es
útil para conceder al proceso un acceso total a sus propios segmentos y para
asignarle un estado de máxima confianza para obtener acceso a segmentos de
otros usuarios. El sencillo mecanismo de control del acceso descrito en esta
sección constituye la base de la protección de segmentos en muchos sistemas
reales.
Traducción de direcciones con segmentación por correspondencia
directa

Al igual que en los sistemas paginados, existen muchas estrategias para


realizar la traducción de direcciones con segmentación. Puede hacerse con
correspondencia directa, asociativa o directa/asociativa combinada. Puede
realizarse con memorias caché de tamaño suficiente para contener toda la
tabla de correspondencia de segmentos o con almacenamientos asociativos
parciales de tamaño suficiente para contener entradas para los segmentos a
los que se ha hecho referencia más recientemente. En la figura 3.33 se
muestra con detalle una entrada representativa de una tabla de mapa de
correspondencias de segmentos.

Primero se verá el caso en el cual ha traducción de direcciones se realiza en


forma normal y después se tratarán varios problemas que pueden presentarse.
Un
proceso en ejecución hace referencia a una dirección virtual v = (s, d). Eh
número de segmentos, s, se suma a la dirección base, b, en el registro de
origen de la tabla de correspondencia de segmentos para formar la dirección
de memoria real, b + s, de la entrada para el segmento s en la tabla de
correspondencia. Esta tabla contiene la dirección de memoria primaria s', en la
cual comienza el segmento. El desplazamiento, d, se suma a s' para formar la
dirección real, r = s' + d, correspondiente a la dirección virtual v = (s, d).
La figura 3.34 muestra con detalle una entrada representativa de una tabla de
correspondencia de segmentos. Un bit de residencia, r, indica si el segmento
se encuentra o no en el almacenamiento primario. Si es así, s' es la dirección
del almacenamiento primario en la que comienza el segmento. Si éste no se
ncuentra en el almacenamiento primario, entonces a es la dirección en
almacenamiento secundario de donde debe leerse el segmento antes de que
el proceso pueda continuar su ejecución. Todas las referencias al segmento
deben verificarse contra la longitud del segmento, l, para asegurar que se
encuentra dentro de él. En cada referencia al segmento se revisan también los
bits de protección para ver si está permitida la operación que se intenta. Ahora
bien, durante la traducción dinámica de direcciones, una vez localizada en la
tabla de correspondencia la entrada para el segmento s, se examina primero r
para comprobar si el segmento está en el almacenamiento primario. Si el
segmento no se encuentra ahí, se genera una falla por falta de seguimiento, lo
cual hace que el sistema operativo asuma el control y cargue el segmento al
que se hizo referencia desde la dirección a del almacenamiento secundario.
Cuando el segmento está cargado, continúa la traducción de la dirección
comprobando si el desplazamiento d es menor o igual que la longitud del
segmento, l. Si no es así, se genera una excepción por desbordamiento de
segmento, lo que provoca que el sistema operativo tome el control y termine la
ejecución de este proceso. Si el desplazamiento se encuentra dentro del
intervalo del segmento, se revisan los bits de protección para asegurar que
está permitida la operación intentada. Si es así, el último paso es sumar la
dirección base, s', del segmento en almacenamiento primario al
desplazamiento, d, para formar la dirección de almacenamiento real r = s' + d
correspondiente a la dirección de almacenamiento virtual v = (s,d). Si no está
permitida la operación que se intenta, se genera una excepción por protección
de segmento, lo cual hace que el sistema operativo tome el control y termine la
ejecución de este proceso.

Compartición en un sistema con segmentación

Una de las ventajas que tiene la segmentación sobre la paginación es que la


segmentación es un concepto lógico, no físico. En su forma más general, los
segmentos no están restringidos arbitrariamente a cierto tamaño, sino que
pueden ser(dentro de límites razonables) tan grandes (o tan pequeños) como
sea necesario. Un segmento correspondiente a un arreglo tiene el tamaño del
arreglo. Un segmento correspondiente a una estructura de datos dinámica
puede crecer o decrecer según lo haga la estructura de datos misma. Un
segmento correspondiente a código de procedimientos generado por un
compilador será tan grande como sea necesario para contener el código.
La compartición de segmentos es bastante sencilla comparado con la
compartición en un sistema de paginación pura. Si un arreglo en un sistema de
paginación pura tiene tres páginas y media de longitud, entonces, en lugar de
tener entradas simples para indicar "arreglo compartido", habrá que tener
entradas
individuales para cada una de las páginas donde reside el arreglo El manejo de
la página parcial puede ser difícil. La situación empeora con una estructura de
datos dinámica. Cuando una estructura así crece y ocupa una nueva página,
las indicaciones de compartición, deberán ajustarse en el momento de la
ejecución. En un sistema con segmentación, cuando un segmento se declara
como compartido las estructuras de datos pueden crecer o decrecer sin afectar
el hecho lógico de que residen en segmentos compartidos.
La figura 3.34 muestra cómo se logra la compartición en un sistema de
segmentación pura. Para que dos procesos puedan compartir un segmento,
basta que tengan entradas en sus tablas de segmentos que apunten al mismo
segmento del almacenamiento primario.

3.2.5 SISTEMAS CON PAGINACIÓN/SEGMENTACIÓN

Tanto la segmentación como la paginación ofrecen ventajas significativas como


organizaciones del almacenamiento virtual. A partir de los sistemas construidos
a mediados de los años sesenta, en particular Multics y el TSS de IBM, se han
construido muchos sistemas que combinan la paginación con la segmentación.
Tales sistemas ofrecen las ventajas de ambas técnicas de organización del
almacenamiento virtual. Los segmentos tienen por lo general un tamaño
múltiplo de páginas; no es necesario que todas las páginas de un segmento
estén en almacenamiento primario a la vez, y las páginas que son contiguas en
el almacenamiento virtual no son por fuerza contiguas en el almacenamiento
real. Las direcciones son tridimensionales, y una dirección de almacenamiento
virtual, v, es una tripleta ordenada v = (s,p,d), donde s es el número de
segmento, p el número de página dentro del segmento y d el desplazamiento
dentro de la página donde se encuentra el elemento deseado (Figura 3.35).

Traducción dinámica de direcciones en sistemas con


paginación/segmentación

Considérese ahora la traducción dinámica de direcciones virtuales a


direcciones reales en un sistema con paginación/segmentación que utiliza
correspondencia
combinada asociativa/directa como se muestra en la figura 3.36A. Un proceso
en ejecución hace referencia a una dirección virtual v=(s,p,d). Las páginas a las
que e ha hecho referencia más recientemente tienen entradas en un
almacenamiento parcialmente asociativo. Se realiza una búsqueda asociativa
para tratar de localizar (s,p) en el almacenamiento asociativo. Si se encuentra
(s,p), entonces el marco de página del almacenamiento primario p’ en el cual
reside la página p del segmento s, se concatena con el desplazamiento d para
formar la dirección real, r, correspondiente a la dirección virtual v=(s,p,d), con lo
cual finaliza la traducción de la dirección.
Por lo regular, la mayor parte de las peticiones de traducción de direcciones
son satisfechas mediante la búsqueda en el almacenamiento asociativo.
Cuando esto no es posible, se establece una correspondencia directa de la
siguiente forma. La dirección base, b, de la tabla de mapa de correspondencia
de segmentos (en almacenamiento primario) se suma el número de
segmentos, s, para formar la dirección, b + s, de la entrada para el segmento s
en la tabla de mapa de correspondencia de segmentos en el almacenamiento
primario. La entrada en dicha tabla índica la dirección base s’, de la tabla de
páginas (en el almacenamiento primario) para el segmento s. El número de
página, p, se suma a s’ para firmar la dirección p+s’, de la tabla de páginas
para la página p del segmento s. Esta tabla indica que p’ es el número de
marco de página que corresponde a la página virtual p. El número de marco, p’,
se concatena con el
desplazamiento, d, para formar la dirección real, r, correspondiente a la
dirección virtual v=(s,p,d).
Este proceso de traducción da por hecho, desde luego, que cada elemento de
información se encuentra donde se supone que debe estar. Pero hay muchos
pasos donde puede fallar el proceso. La búsqueda en la tabla de mapa de
correspondencia de segmentos puede indicar que el segmento s no se
encuentra en el almacenamiento primario, lo que ocasiona una falla por falta de
segmentos y hace que el sistema operativo localice el segmento en el
almacenamiento secundario, cree una tabla de páginas para el segmento y
cargue la página apropiada en el almacenamiento primario, reemplazando
posiblemente una página existente de ese proceso o de algún otro. Si el
segmento se encuentra en el almacenamiento primario, la referencia a la tabla
de mapa de correspondencia de páginas puede indicar que la página deseada
no se encuentra en el almacenamiento primario. Ello generaría una falla de
página, haciendo que el sistema operativo tome el control, localice la página en
el almacenamiento secundario y la cargue (una vez más, reemplazando
posiblemente otra página). Al igual que en la segmentación pura, una dirección
de almacenamiento virtual puede rebasar el final del segmento, generando así
una excepción por desbordamiento de segmento. Por otra parte, los bits de
protección también pueden indicar que no está permitida la operación que se
va a realizar sobre la dirección virtual a la que se hace referencia, con lo que se
genera así una excepción por protección del segmento. El sistema operativo
debe manejar todas estas posibilidades.
El almacenamiento asociativo (o de igual forma, una memoria caché de alta
velocidad) es crítico para la operación eficiente de este mecanismo de
traducción
dinámica. Si se utilizara un mecanismo de correspondencia directa pura,
manteniendo el mapa de correspondencia complejo dentro del almacenamiento
primario, el promedio de referencias al almacenamiento virtual requeriría un
ciclo de almacenamiento para obtener acceso a la tabla de correspondencia de
segmentos, un segundo ciclo para hacer referencia a la tabla de
correspondencia de páginas y un tercer ciclo para hacer referencia al elemento
deseado en el almacenamiento real. De esta manera cada referencia a un
elemento implicaría tres ciclos de almacenamiento y el sistema de cómputo
funcionaria a un tercio de su velocidad normal, ¡con lo que consumiría dos
tercios de su tiempo en la traducción de direcciones! Resulta interesante que
muchos sistemas logren operar al 90% o más de la velocidad máxima de sus
procesadores de control con sólo 8 ó 16 registros asociativos.
La figura 3.37 índica la estructura detallada de tablas requerida por un sistema
con paginación/segmentación. En el nivel más alto está un tabla de procesos
que contiene una entrada por cada proceso conocido por el sistema. La
entrada en dicha tabla para un proceso dado apunta a la tabla de
correspondencia de segmentos del proceso. Cada entrada en la tabla de
correspondencia de segmentos de un proceso apunta a la tabla de
correspondencia de páginas del segmento asociado, y cada entrada de esa
tabla apunta al marco de página donde reside esa página o bien a la dirección
en almacenamiento secundario donde puede encontrarse la página. En un
sistema con un número muy grande de procesos, segmentos y páginas, esta
estructura de tabla puede consumir una porción importante del almacenamiento
primario. La cuestión aquí es que la traducción de dirección se realiza con más
rapidez en el momento de la ejecución si todas las tablas están en el
almacenamiento primario; pero con más tablas en el
almacenamiento primario, el sistema tiene capacidad para menos procesos y
así baja la productividad.
Los diseñadores de sistemas operativos deben evaluar dicha cuestión para
lograr
el delicado equipo necesario para que el sistema funcione eficientemente y
proporcione un servicio seguro a sus usuarios.
Compartimiento en un sistema con paginación/segmentación

En los sistemas con paginación/segmentación son muy importantes las


ventajas de compartir segmentos. El compartimiento se logra mediante
entradas en la tablas de correspondencia de segmentos de diferentes procesos
que apuntan a la misma tabla de correspondencia de páginas, como se indica
en la figura 3.38.
El compartimiento tanto en sistemas de paginación como en aquellos con
segmentación o paginación segmentación, requiere un cuidadoso manejo por
parte del sistema operativo. En particular, el lector debe considerar lo que
sucedería si una página entrante reemplazara una página compartida por
muchos procesos.
3.3 ADMINISTRACIÓN DE LA MEMORIA VIRTUAL

3.3.1 ESTRATEGIAS DE ADMINISTRACIÓN DE MEMORIA VIRTUAL

Estrategias de obtención. Determinan cuándo se debe transferir una página o


un
segmento del almacenamiento secundario al primario. Las estrategias de
obtención por demanda esperan a que un proceso en ejecución haga
referencia a una página o un segmento antes de extraer la página o el
segmento al almacenamiento primario. Los esquemas de obtención anticipada
intentan determinar por adelantado a cuáles páginas o segmentos hará
referencia un proceso. Si la probabilidad de una referencia es alta y hay
espacio disponible, entonces se trae al almacenamiento primario la página o el
segmento antes de que se haga la referencia explícita.

Estrategias de colocación. Determinan en qué lugar del almacenamiento


primario se debe colocar una página o un segmento entrante. Los sistemas de
paginación vuelven trivial la decisión de la colocación, porque una página
entrante se puede ubicar en cualquier marco de la página disponible. Los
sistemas con segmentación requieren estrategias de colocación como las
tratadas en el contexto de los sistemas de multiprogramación con particiones
variables.

Estrategias
de reemplazo. Sirven para decidir cuál página o segmento se
debe desplazar para dejar espacio a una página o segmento entrante cuando
está completamente ocupado el almacenamiento primario.

3.3.2 ESTRATEGIAS DE REEMPLAZO DE PÁGINAS

En los sistemas con paginación es común que estén en uso todos los marcos
de páginas. En este caso, las rutinas de administración del almacenamiento del
sistema operativo deben decidir que página del almacenamiento primario se
debe desplazar para dejar espacio a una página entrante. Se verán las
siguientes estrategias de reemplazo de páginas:

El principio de optimalidad


Reemplazo de páginas aleatorio
Primeras entradas-primeras salidas (PEPS)
La menos recientemente utilizada (LRU)
La menos frecuentemente utilizada (LFU)
La no utilizada recientemente (NUR)
Modificaciones de PEPS
Frecuencia de fallas de página
Paginación por demanda
Paginación Anticipada
El principio de optimalidad

El principio de optimalidad establece que, para obtener un rendimiento optimo,


la página que se debe remplazar es aquélla que tardará más tiempo en volver a
ser utilizada. Se puede demostrar la optimalidad de esta estrategia, pero desde
luego ésta es irrealizable puesto que no podemos predecir el futuro. Esta
estrategia óptima de reemplazo se denomina OPT o MIN.
Por tanto, para lograr un buen rendimiento se intenta una aproximación al
principio
de optimalidad utilizado técnicas de reemplazo de páginas que se aproximen al
reemplazo óptimo de páginas.

Reemplazo de páginas aleatorio

Si se busca una estrategia de reemplazamiento, el reemplazo de páginas


aleatorio
es una técnica sencilla para lograrlo. Así, todas las páginas que se encuentran
en el almacenamiento principal tienen la misma probabilidad de ser elegidas
para el reemplazo. Esta estrategia podría seleccionar cualquier página para ser
emplazada, incluyendo la siguiente página a la que se hará referencia (lo cuál
constituye, por supuesto, la peor elección de reemplazo de páginas). Las
decisiones de reemplazo aleatorio de páginas se pueden tomar rápidamente, y
con un número significativo de marcos de páginas donde elegir sólo habría una
pequeña probabilidad de reemplazar una página a la que se vaya hacer
referencia de nuevo casi de inmediato. Sin embargo, este esquema casi no se
utiliza debido a su enfoque aleatorio para acertar o errar.

Reemplazo de páginas de primeras entradas-primeras salidas (PEPS)

En el reemplazo de páginas de primeras entradas-primeras salidas (PEPS),


para cada página se registra el instante en que entró en el almacenamiento
primario. Cuando se necesita reemplazar una página, se escoge la que ha
permanecido en el almacenamiento primario. Cuando se necesita reemplazar
una página, se escoge la que ha permanecido en el almacenamiento durante
mayor tiempo. Por lo tanto esta estrategia parece razonable, pues esa página
ha tenido su oportunidad y es tiempo de darle una oportunidad a otra página.
Lamentablemente, es probable que esta estrategia reemplace páginas muy
utilizadas, ya que si una página permanece en el almacenamiento primario
durante mucho tiempo puede deberse a que está en uso constante. Por
ejemplo en los grandes sistemas de tiempo compartido es común que muchos
usuarios compartan una copia de un editor de texto cuando capturan y corrigen
sus programas. La estrategia de reemplazo de páginas de primeras entradas-
primeras salidas en tales sistemas podría decidir reemplazar una página muy
utilizada del editor, y esta será sin duda una mala elección, porque la página se
volvería a transferir al almacenamiento principal casi de inmediato. Dicha
estrategia también se podría poner en práctica con una simple cola PEPS: a
medida que llega una página, se coloca al final de la cola, y las páginas que se
reemplaza son las de principio de cola.

Reemplazo de páginas de la menos recientemente utilizada (LRU).


Esta estrategia selecciona, para su reemplazo, aquella página que no ha sido
utilizada durante el mayor tiempo. La estrategia se basa en la heurística de
localidad según la cual el pasado reciente es un buen indicador del futuro
cercano, de modo que LRU exige que se marque cada página con el instante
en que se hace referencia a ella. Esto podría requerir mucho trabajo adicional,
por lo que la estrategia LRU pese a ser atractiva, no se usa a menudo en los
sistemas actuales; lo que se hace es utilizar estrategias que se aproximen a la
LRU y que no ocasionen esos grandes costos. La estrategia LRU se puede
realizar con una estructura de listas que contenga una entrada por cada marco
de página ocupado. Cada vez que se hace referencia a un marco de páginas,
la entrada correspondiente a esa página se coloca al principio de la lista, y las
entradas más antiguas se llevan al final de la lista. Cuando hay que reemplazar
una página para dejar espacio a otra entrante, se selecciona la entrada final de
la lista, se libera el marco de página correspondiente (lo cual posiblemente
requiera escribir una página modificada en el almacenamiento secundario), se
coloca la página entrante en el marco de página y la entrada correspondiente a
ese marco de página se coloca al principio de la lista, porque esa página es la
que ha sido utilizada más recientemente. Este esquema llevaría a la práctica
fielmente la estrategia LRU, pero también incurre en un considerable trabajo
extra.
Siempre hay que tener cuidado al aplicar razonamiento heurísticos en los
sistemas operativos. Por ejemplo, en la estrategia LRU, la página menos
recientemente usada podría ser la siguiente en ser utilizada, si un programa
realiza un ciclo grande que abarque varias páginas. Si se reemplazara la
página LRU, el sistema se encontraría a sí mismo transfiriendo esa página de
nuevo al almacenamiento principal casi de inmediato. Dicho fenómeno también
podría ocurrir en un sistema con una serie de llamadas a procedimientos
profundamente anidados; a medida que los procedimientos llamados volvieran
a la página que contenía la llamada original, esa página podría reemplazarse
fácilmente como página LRU justo antes del retorno final.

Reemplazo de páginas de la menos frecuente utilizada (LFU)

Una aproximación a LRU es la estrategia de “la menos frecuentemente


utilizada”(LFU), en la cual lo importante es la intensidad con la que se ha
utilizado cada página; la página por remplazar es aquella que se ha utilizado
menos frecuentemente o a la que se ha hecho referencia con menos
frecuencia. De nuevo, el atractivo intuitivo es real, pero con toda facilidad se
podría seleccionar para reemplazo una página equivocada. Por ejemplo, la
página menos frecuentemente utilizada podría ser aquella que se trajo al
almacenamiento principal más recientemente. Esa página ha sido utilizado una
sola vez, mientras que las demás páginas que se encuentran en
almacenamiento principal podrían haber sido utilizadas en varias ocasiones. El
mecanismo de reemplazo de páginas reemplazará esta página, aunque de
hecho tenga una alta probabilidad de ser utilizada de inmediato.
Al parecer, todos los esquemas de reemplazo de páginas corren cierto riesgo
de tomar decisiones equivocadas. Esto sucede por el simple hecho de que no
se puede predecir con precisión el futuro. Por tanto es deseable una estrategia
de reemplazo de paginas que tomo decisiones razonables la mayor parte del
tiempo y que implique un gasto extra reducido.

Reemplazo de páginas de la no utilizada recientemente (NUR)

Un esquema popular de aproximación a la LRU con poco trabajo extra es el de


“la
no utilizada recientemente” (NUR). No es probable que sean utilizadas pronto
las páginas que no sean utilizadas recientemente, por lo que pueden
reemplazarse con páginas entrantes.
Cuando es deseable reemplazar una página que no ha sido modificada
mientras estaba en el almacenamiento primario, la estrategia NUR se lleva a la
práctica con la adición de dos bits de hardware por página. Esos bits son

a) bit de referencia = 0 si no se ha hecho referencia a la página


= 1 se ha hecho referencia a la página

b) bit de modificación = 0 si la página no ha sido modificada


= 1 si la página ha sido modificada

El bit de modificación se denomina a menudo bit sucio. La estrategia NUR


trabaja en la forma siguiente. Inicialmente los bits de referencia de todas las
páginas valen
cero. Cuando ocurre una referencia a una página, su bit de referencia toma el
alor 1.
Inicialmente, los bits de modificación de todas las páginas valen cero. Cuando
una página se modifica, su bit de modificación toma el valor 1. Cuando se va a
reemplazar una página, primero se intenta encontrar una página a la que no se
ha hecho referencia (por que estamos aproximando la estrategia LRU). De otro
modo, no queda más elección que remplazar una página a la que se hizo
referencia. Si una página no ha sido objeto de una referencia, se comprueba si
ha sido modificada. Si no ha sido se reemplaza, pues requiere menos trabajo
que el reemplazo de una página modificada, la cual debe escribirse en el
almacenamiento secundario. De otro modo, hay que reemplazar una página
modificada.

Modificaciones de PEPS; reemplazo de páginas por reloj y reemplazo de


páginas con segunda oportunidad

La evidente debilidad de la estrategia PEPS es que puede decidir reemplazar


una
página muy utilizada que ha permanecido en memoria durante mucho tiempo.
Esta posibilidad se puede evitar reemplazando solo aquellas páginas cuyos bits
de
referencia valgan 0.
La variante de PEPS denominada “con segunda oportunidad” examina el bit de
referencia de la página más antigua; si este bit vale 0, se selecciona de
inmediato la página para ser remplazada. Si el bit de referencia vale 1, se le
asigna el valor 0 y la página se pasa al final de la lista y se considera en
esencia como una página nueva; gradualmente, dicha página se desplaza
hacia el principio de la lista, donde será seleccionada para reemplazo sólo si su
bit de referencia sigue valiendo 0. En esencia esto da a la página una segunda
oportunidad de permanecer en el almacenamiento principal si su bit de
referencia cambia a 1 antes de que la página llegue al principio de la lista.
La variación “por reloj” del algoritmo de la segunda oportunidad dispone las
páginas en una lista circular, en lugar de una lista lineal. Un apuntador a la lista
se
desplaza alrededor de la lista circular en la misma forma que gira la manecilla
de un reloj. Cuando el bit de referencia de una página toma el valor 0, el
apuntador se mueve al siguiente elemento de la lista (simulando el movimiento
de esta página al final de la lista PEPS).

REEMPLAZO DE PÁGINAS POR FRECUENCIA DE FALLAS DE PÁGINAS

Una medida de la eficiencia con que se ejecuta un proceso en un ambiente de


paginación es su tasa de fallas de página. Los procesos que fallan
constantemente pueden estar hiperpaginando por que tienen muy pocos
marcos de páginas y no pueden mantener sus conjuntos de trabajo en
almacenamiento primario. Los procesos que casi nunca fallan pueden tener de
hecho demasiados marcos de páginas y estar impidiendo el proceso de otros
procesos del sistema. Idealmente, los procesos deben operar en algún punto
entre esos extremos. El algoritmo de frecuencia de fallas de página (page fault
frequency, PFF) ajusta el conjunto de páginas residentes de un proceso (es
decir aquellas páginas que están actualmente en la memoria) basándose en la
frecuencia con que el proceso tiene fallas de página (o, alternativamente,
según el tiempo que hay entre fallas de página denominado entre fallas).

El PFF registra el tiempo entre la ultima falla de página y el vigente. Si ese


tiempo es mayor que un valor límite superior, entonces se liberan todas las
páginas a las que no se haya hecho referencia en ese intervalo. Si el tiempo es
menor que un valor limite inferior, la página entrante se convierte en un
miembro del conjunto de páginas residentes del proceso.
Lo práctico del PFF es que ajusta dinámicamente el conjunto de páginas
residentes de un proceso en respuesta al comportamiento cambiante del
proceso. Si un proceso esta conmutándose a un conjunto de trabajo mayor,
entonces tendrá fallas frecuentes de páginas y el PFF le dará más marcos de
páginas. Una vez que se acumule el nuevo conjunto de trabajo, la frecuencia
de fallas de páginas se reducirá y el PFF mantendrá el conjunto de páginas
residentes o incluso podrá reducirlo Evidentemente, la clave para la obtención
adecuada y eficiente del PFF es mantener los limites en valores apropiados.

Una ventaja del PFF con respecto al reemplazo de páginas con conjunto de
trabajo es que ajusta el conjunto de páginas residentes sólo después de cada
falla de pagina, mientras que un mecanismo de conjunto de trabajo debe
operar después de cada referencia a la memoria.

PAGINACIÓN POR DEMANDA


El sentido común indica que las páginas de un proceso deben cargarse por
demanda. No se debe transferir ninguna página del almacenamiento
secundario al
primario hasta que un proceso en ejecución haga explícitamente referencia a
ella. Hay varias razones por las cuales es atractiva esta estrategia.

Los resultados de la teoría de la computabilidad, es específicamente el


problema de la detención, indican que no se pueden predecir con precisión la
trayectoria de ejecución que seguirá un programa. Así pues, cualquier intento
de carga páginas con anticipación a su uso puede hacer que se carguen las
páginas equivocadas.

La paginación por demanda garantiza que las únicas páginas que se
transfieren al almacenamiento principal son aquellas que requieren los
procesos.

Eltrabajo extra requerido para decir cuáles páginas se deben transferir al


almacenamiento principal es mínimo. Las estrategias de obtención anticipada
de páginas pueden requerir mucho tiempo de ejecución adicional.

PAGINACIÓN ANTICIPADA

En la paginación anticipada, el sistema operativo intenta predecir cuáles


páginas necesitará un proceso y entonces carga dichas páginas cuando hay
espacio disponible. Si se toman las decisiones correctas, se puede reducir
considerablemente el tiempo de ejecución total del proceso. Mientras el
proceso se ejecuta con sus páginas actuales, el sistema carga nuevas página,
que estarán disponibles cuando las requiera el proceso.

Ventajas de la paginación anticipada.

Sise pueden tomar las decisiones correctas en casi todos los casos, se
reducirá
bastante el tiempo de ejecución de un proceso. Así pues, es importante tratar
desarrollar mecanismo de paginación anticipada, aunque no puedan ser cien
por
ciento precisos.

En muchos casos se puede tomar decisiones precisas. Si la toma de


decisiones se puede realizar con relativamente poco trabajo extra, entonces la
ejecución de un proceso dado se puede acelerar en gran medida sin afectar
negativamente otros procesos activos.

Como el hardware de la computadora se vuelve cada vez más económico,


las consecuencias de una mala decisión son menos serias. Se puede adquirir
almacenamiento principal extra para manejar la acumulación de páginas
excedentes que un mecanismo de anticipación transferiría al almacenamiento
principal.

LIBERACIÓN DE PÁGINAS
En una administración del almacenamiento mediante conjuntos de trabajos, los
procesos indican por referencia explícita cuáles páginas desean utilizar. Los
procesos que ya no requieran páginas específicas deberán desechar tales
páginas de sus conjuntos de trabajo. Por lo regular, hay un tiempo durante el
cual permanecen en el almacenamiento principal las páginas que ya no se
requieren.
Cuando es evidente que ya no será necesario una página, un usuario podría
dar una orden de liberación voluntaria de página para liberar el marco de
página. Esto eliminaría el retraso que implica dejar que el proceso deseche
poco a poco la página de su conjunto de trabajo.
La liberación voluntaria de páginas podría eliminar el desperdicio y acelerar la
ejecución de un programa, pero la mayoría de los usuarios de los sistemas de
cómputo actuales ni siquiera saben qué es una página y no se les puede pedir
que tomen decisiones al nivel del sistema. La incorporación de mandatos de
liberación de páginas en los programas de usuario podría ser mucho más lento
el desarrollo de las aplicaciones.
La esperanza real en esta área es que los compiladores y sistemas operativos
detecten automáticamente las situaciones en las que debe liberar una página, y
mucho antes de lo que es posible con las estrategias que emplean conjuntos
de trabajo.

TAMAÑO DE PAGINAS

En los sistemas de paginación, el almacenamiento real se divide normalmente


en marcos de página de tamaño fijo. ¿Qué factores determinan si una página
debe ser grande o pequeña? Aquí se resumen algunos de ellos:

Cuanto menor sea el tamaño de la página, más páginas y más marcos de


páginas habrá y mayores tendrán que ser las tablas de páginas. En los
sistemas en los que las tablas de páginas ocupan el almacenamiento primario,
hay una necesidad de páginas más grandes. El desperdicio de
almacenamiento debido a tablas excesivamente grandes se denomina
Fragmentación de tablas. Cabe señalar que este argumento es menos válido
hoy día gracias a la disponibilidad de memorias muy grandes y económicas.

Con tamaño de páginas grandes, se paginan en el almacenamiento primario


grandes cantidades de información a la que quizá nunca se haga referencia.
Esto
indica la necesidad de páginas más pequeña.

Dadoque las transferencias de E/S desde el disco son relativamente lentas,


se desea reducir al mínimo el número de transferencias a que se somete un
programa a medida que se ejecuta. Esto parece indicar la necesidad de
tamaño de páginas grades.

Losprogramas tienden a exhibir la propiedad de localidad de referencia y


esas localidades tienden a ser más pequeñas. Así, un tamaño de página más
pequeño ayudará a un programa a establecer un conjunto trabajo más
ajustado; es decir, las páginas del conjunto de trabajo que se mantienen en el
almacenamiento real
contendrán más elementos de información a los que se hará referencia
intensamente.

Debido a que las unidades de procedimientos y datos rara vez comprenden


un número entero de páginas, los sistemas con paginación experimentan
fragmentación interna, como se ilustra en la figura 3.39. Existe la misma
posibilidad de que un segmento de longitud s tenga su última página casi llena
o casi vacía y, por tanto, en promedio hay media página de fragmentación
interna (con la restricción de que una página no puede contener partes de más
de un segmento). Cuanto menor sea el tamaño de la página, menor será la
fragmentación interna.

Muchos resultados publicados, tanto teóricos como empíricos, sugieren la


necesidad de páginas pequeñas. La figura 3.40 muestra los tamaños de página
utilizados en varios computadores populares e importantes a lo largo de la
historia.0bservese el tamaño relativamente pequeño de página elegido por la
VAX8800. Obsérvese también la popularidad de los tamaños de página de
aproximadamente 4K caracteres. A medida que aumenta el tamaño y se
reduce el costo de las memorias de las computadoras, y conforme proliferan
las aplicaciones que utilizan más memoria, es probable que el significado de
“tamaño de página pequeño” sea modificado en el contexto de máquinas más
poderosas. De hecho, tamaños de páginas de 32K e incluso de 1Mb podrían a
llegar a ser considerados “pequeños”.

COMPORTAMIENTO DE UN PROGRAMA CUANDO SE USA PAGINACIÓN

La paginación es un concepto valioso y tal vez se seguirá integrando en los


sistemas de cómputo en las próximas décadas. Se han realizado muchos
estudios que examinan el comportamiento de los procesos en los ambientes de
paginación. La figura 3.41 muestra el porcentaje de las páginas de un proceso
representativo a las que se ha hecho referencia desde el momento en que
comenzó a ejecutarse el proceso. La pronunciada pendiente ascendente inicial
indica que un proceso tiende a ser referencia a una porción significativa de sus
páginas inmediatamente después de comenzar la ejecución. Con el tiempo, la
pendiente disminuye y la gráfica se aproxima asintóticamente al 100%. Sin
duda, algunos procesos hacen referencia al 100% de sus páginas, pero la
gráfica se dibuja para reflejar el hecho de que muchos procesos se pueden
ejecutar durante largo tiempo sin hacer referencia al 100% de sus páginas.
Esto sucede a menudo cuando se llama rara vez a ciertas rutinas de
procesamiento de errores.
La figura 3.42 indica el efecto de variar el tamaño de la página manteniendo
constante la cantidad de almacenamiento principal. La gráfica muestra que el
número de fallas de página experimentados por un proceso en ejecución tiende
a crecer a medida que aumenta el tamaño de la página. Esto ocurre por que al
aumentar el tamaño de la página se traen a un almacenamiento primario de
tamaño fijo más procedimientos y datos a los que no se hará referencia. Por
consiguiente, hay una disminución en el porcentaje del limitado
almacenamiento primario del proceso ocupado por procedimientos y datos a
los que se hará referencia. Como el patrón de referencias del proceso es en
esencia independiente de la cantidad de almacenamiento primario asignado, se
generan más fallas de página para traer los procedimientos y datos requeridos
al almacenamiento principal durante la ejecución del proceso. La porción
punteada de la gráfica indica que a medida que el tamaño de la página se
aproxima al tamaño de todo el proceso, el número de fallas de página decae
rápidamente a cero.
La figura 3.43 muestra como varia el tiempo medio entre fallas (es decir, el
tiempo entre las fallas de página) a medida que aumenta el número de páginas
asignado a un proceso. La gráfica es monótonamente creciente; cuantos más
marcos de página tiene un proceso, mayor es el tiempo entre las fallas de
página (por supuesto, siempre que no haya un comportamiento extraño como
el observado en la anomalía PEPS). Pero la gráfica se curva en un punto y su
pendiente decae con rapidez. Es el punto en el cual el proceso tiene todo su
conjunto de trabajo en el almacenamiento primario. En un principio, el tiempo
entre las fallas crece muy rápidamente, a medida que se puede mantener en el
almacenamiento primario una parte mayor del conjunto de trabajo. Una vez que
la asignación de almacenamiento primario es suficiente para contener el
conjunto de trabajo, la curva se dobla en forma pronunciada, indicado que
asignar marcos de página adicionales no tiene un efecto tan grande en el
aumento de tiempo entre las fallas. La clave es tener el conjunto de trabajo en
el almacenamiento principal. Franklin, Graham y Gupta han observado
situaciones anómalas en las que aumentar el tamaño de la ventana del
conjunto de trabajo, y por tanto el del conjunto de trabajo, reduce de hecho el
tiempo entre fallas. No obstante, esta clase de comportamiento es poco común.
Se han realizado muchos otros experimentos que parecen indicar la necesidad
de páginas pequeñas. En uno de ellos, los investigadores midieron el número
de instrucciones ejecutadas por páginas antes de pasar a otra página. Con un
tamaño de página de 1024 palabras, la mayor parte del tiempo se ejecutaron
en una página menos de la quinta parte de las instrucciones.

También podría gustarte