3 Memoria

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 64

Sistemas de Computación 2

<< Sistemas Operativos >>

Administración
Administración de
de memoria
memoria
Administración
Administración de
de memoria
memoria
A través de los años se ha elaborado el concepto de jerarquía de memoria, de acuerdo con el cual,
las computadoras tienen unos cuantos megabytes de memoria caché, muy rápida, costosa y
volátil, unos cuantos gigabytes de memoria principal, de mediana velocidad, a precio mediano y
volátil, unos terabytes de almacenamiento en disco lento, económico y no volátil, y el
almacenamiento removible, como los DVDs y las memorias USB. El trabajo del sistema operativo
es abstraer esta jerarquía en un modelo útil y después administrarla.
Aunque actualmente una computadora doméstica promedio tiene 10,000 veces más memoria que
la IBM 7094, la computadora más grande en el mundo a principios de la década de 1960, los
programas están creciendo con más rapidez que las memorias.
En un sistema monoprogramado, la memoria se divide en dos partes: una parte para el sistema
operativo (monitor residente, núcleo) y una parte para el programa actualmente en ejecución. En
un sistema multiprogramado, la parte de usuario de la memoria se debe subdividir posteriormente
para acomodar múltiples procesos.
La parte del sistema operativo que administra (parte de) la jerarquía de memoria se conoce como
administrador de memoria. Su trabajo es administrar la memoria con eficiencia: llevar el registro
de cuáles partes de la memoria están en uso, asignar memoria a los procesos cuando la necesiten
y desasignarla cuando terminen.
Niveles
Niveles de
de memoria
memoria
La memoria del equipo informático se organiza en al
menos dos niveles, conocidos como memoria principal y V
memoria secundaria. V
La memoria principal proporciona acceso rápido a un O
coste relativamente alto. Adicionalmente, la memoria L
principal es volátil; es decir, no proporciona L
almacenamiento permanente. A
T
La memoria secundaria es más lenta y más barata que la T
memoria principal y normalmente no es volátil. Por tanto,
I
la memoria secundaria de larga capacidad puede
proporcionar almacenamiento para programas y datos a L
largo plazo, mientras que una memoria principal más
pequeña contiene programas y datos actualmente en uso.
Está claro que la tarea de mover la información entre los
dos niveles de la memoria debería ser una
responsabilidad del sistema y no del usuario, o del
programador.
Reubicación
Reubicación
En un sistema multiprogramado, la memoria principal disponible se comparte generalmente entre
varios procesos.
El programador no conoce qué otros procesos residirán en la memoria en el momento de la
ejecución del suyo.
Mientras que se está ejecutando el programa, puede que se descargue en el disco y que vuelva a
la memoria principal, pero en una ubicación distinta a la anterior (reubicación).
Se deben traducir las referencias a la memoria encontradas en el código del programa a las
direcciones físicas reales.
Cuando el proceso se carga en la memoria, se determina la ubicación real (absoluta) en la
memoria.
Un proceso puede ocupar diferentes particiones, lo que significa diferentes posiciones absolutas
de la memoria durante su ejecución (a partir de la carga).
La compactación también hará que un programa ocupe una partición distinta, lo que significa que
las ubicaciones absolutas de la memoria cambien.
Reubicación
Reubicación
Dirección lógica: Es una referencia a una posición de memoria independiente de la asignación
actual de datos a la memoria. Se debe hacer una traducción a una dirección física.
Dirección relativa: La dirección se expresa como una posición relativa a algún punto conocido.
Dirección física: La dirección absoluta o la posición real en la memoria principal.
De alguna forma, el hardware del Información Bloque de control del proceso
de control del Punto Instrucción de
procesador y el software del proceso de entrada al bifurcación
sistema operativo deben poder programa
traducir las referencias de Programa

memoria encontradas en el
código del programa en Direcciones
direcciones de memoria físicas, ascendentes Referencia
de datos
que reflejan la ubicación actual Datos
del programa en la memoria
principal.
Cima actual
de la pila
Pila
Protección
Protección
Cada proceso debe protegerse contra interferencias no deseadas por parte de otros procesos,
sean accidentales o intencionadas. Por tanto, los programas de otros procesos no deben ser
capaces de referenciar sin permiso a posiciones de memoria de un proceso, tanto en modo lectura
como escritura.
Por un lado, lograr los requisitos de la reubicación incrementa la dificultad de satisfacer los
requisitos de protección. Más aún, la mayoría de los lenguajes de programación permite el cálculo
dinámico de direcciones en tiempo de ejecución (por ejemplo, calculando un índice de posición en
un vector o un puntero a una estructura de datos). Por tanto, todas las referencias de memoria
generadas por un proceso deben comprobarse en tiempo de ejecución para poder asegurar que
se refieren sólo al espacio de memoria asignado a dicho proceso.
Los requisitos de protección de memoria deben ser satisfechos por el procesador (hardware) en
lugar del sistema operativo (software). Esto es debido a que el sistema operativo no puede
anticipar todas las referencias de memoria que un programa hará. Incluso si tal anticipación fuera
posible, llevaría demasiado tiempo calcularlo para cada programa a fin de comprobar la violación
de referencias de la memoria. Por tanto, sólo es posible evaluar la permisibilidad de una referencia
(acceso a datos o salto) en tiempo de ejecución de la instrucción que realiza dicha referencia.
Compartición
Compartición
Cualquier mecanismo de protección debe tener la flexibilidad de permitir a varios procesos
acceder a la misma porción de memoria principal.
Por ejemplo, si varios programas están ejecutando el mismo programa, es ventajoso permitir que
cada proceso pueda acceder a la misma copia del programa en lugar de tener su propia copia
separada. Procesos que estén cooperando en la misma tarea podrían necesitar compartir el
acceso a la misma estructura de datos.
Por tanto, el sistema de gestión de la memoria debe permitir el acceso controlado a áreas de
memoria compartidas sin comprometer la protección esencial.

Espacio de direcciones
Un espacio de direcciones (address space) es el conjunto de direcciones que puede utilizar un
proceso para direccionar la memoria. Cada proceso tiene su propio espacio de direcciones,
independiente de los que pertenecen a otros procesos (excepto en ciertas circunstancias
especiales en donde los procesos desean compartir sus espacios de direcciones).
Proporcionar a cada programa su propio espacio de direcciones, de manera que la dirección 28 en
un programa indique una ubicación física distinta de la dirección 28 en otro programa.
Técnicas
Técnicas de
de gestión
gestión de
de memoria
memoria
Descripción Virtudes Defectos
Particionamiento Fijo
La memoria principal se divide en particiones estáticas en Sencilla de implementar; poca sobrecarga para el OS. Uso ineficiente de la memoria, debido a la
tiempo de generación del sistema. Un proceso se puede cargar fragmentación interna; debe fijarse el
en una partición con igual o superior tamaño. numero máximo de procesos activos.
Particionamiento Dinámico
Las particiones se crean de forma dinámica, de tal forma que No existe fragmentación interna; uso mas eficiente de Uso ineficiente del procesador, debido a
cada proceso se carga en una partición del mismo tamaño que memoria principal. la necesidad de compactación para evitar
el proceso. la fragmentación externa.
Paginación simple
La memoria principal se divide en marcos del mismo tamaño. No existe fragmentación externa. Una pequeña cantidad de fragmentación
Cada proceso se divide en paginas del mismo tamaño que los interna.
marcos. Un proceso se carga a través de la carga de todas sus
paginas en marcos disponibles, no necesariamente contiguos.
Segmentación simple
Cada proceso se divide en segmentos. Un proceso se carga No existe fragmentación interna; mejora la utilización Fragmentación externa.
cargando todos sus segmentos en particiones dinámicas, no de la memoria y reduce la sobrecarga respecto del
necesariamente contiguas. particionamiento dinámico
Paginación con memoria virtual
Igual que la paginación simple, excepto que no es necesario No existe fragmentación externa; mayor grado de Sobrecarga por la gestión compleja de
cargar todas las paginas de un proceso. Las paginas no multiprogramación; gran espacio de direcciones memoria
residentes se traen bajo demanda de forma automática. virtuales.
Segmentación con memoria virtual
Igual que la segmentación excepto que no es necesario cargar No existe fragmentación interna; mayor grado de Sobrecarga por la gestión compleja de la
todos los segmentos de un procesos. Los no residentes se multiprogramación; gran espacio de direcciones memoria
traen bajo demanda. virtuales; soporte a protección y comparticion.
Particionamiento
Particionamiento Fijo
Fijo
La operación principal de la gestión de la memoria es traer los procesos a la memoria principal
para que el procesador los pueda ejecutar. En la mayoría de los esquemas para gestión de la
memoria, se puede asumir que el OS ocupa alguna porción fija de la memoria principal y que el
resto de la memoria principal está disponible para múltiples procesos. El esquema más simple
para gestionar la memoria disponible es repartirla en regiones con límites fijos.
Una posibilidad consiste en hacer uso de particiones del mismo tamaño. En este caso, cualquier
proceso cuyo tamaño es menor o igual que el tamaño de partición puede cargarse en cualquier
partición disponible. Si todas las particiones están llenas y no hay ningún proceso en estado Listo
o Ejecutando, el sistema operativo puede mandar a swap a un proceso de cualquiera de las
particiones y cargar otro proceso, de forma que el procesador tenga trabajo que realizar.
Existen dos dificultades con el uso de las particiones fijas del mismo tamaño:

Un programa podría ser demasiado grande para caber en una partición. En este caso, el
programador debe diseñar el programa con el uso de overlays, de forma que sólo se necesite
una porción del programa en memoria principal en un momento determinado. Cuando se
necesita un módulo que no está presente, el programa de usuario debe cargar dicho módulo en
la partición del programa, superponiéndolo (overlaying) a cualquier programa o datos que haya
allí.
Particionamiento
Particionamiento Fijo
Fijo

La utilización de la memoria principal es extremadamente ineficiente. Cualquier programa, sin
importar lo pequeño que sea, ocupa una partición entera. Este fenómeno, en el cual hay espacio
interno malgastado debido al hecho de que el bloque de datos cargado es menor que la
partición, se conoce con el nombre de fragmentación interna.
Con particiones del mismo tamaño, la ubicación de los procesos en memoria es trivial. En cuanto
haya una partición disponible, un proceso se carga en dicha partición.
Con particiones de diferente tamaño, hay dos formas posibles de asignar los procesos a las
particiones. La forma más sencilla consiste en asignar cada proceso a la partición más pequeña
dentro de la cual cabe. En este caso, se necesita una cola de planificación para cada partición,
que mantenga procesos en disco destinados a dicha partición
El uso de particiones de distinto tamaño proporciona un grado de flexibilidad frente a las
particiones fijas. Adicionalmente, se puede decir que los esquemas de particiones fijas son
relativamente sencillos y requieren un soporte mínimo por parte del sistema operativo y una
sobrecarga de procesamiento mínimo.
El uso de particionamiento fijo es casi desconocido hoy en día, los primeros mainframes de IBM, el
sistema operativo OS/MFT (Multiprogramming with a Fixed Number of Tasks; Multiprogramado con
un número fijo de tareas) utilizaban esta técnica.
Particionamiento
Particionamiento Fijo
Fijo yy Dinámico
Dinámico
Ej Particionamiento Fijo de memoria de 64MB Ej Particionamiento Dinámico y su efecto
Sistema Sistema Sistema Sistema
Sistema Operativo Sistema Operativo Operativo 8MB Operativo Operativo Operativo
8MB 8MB
2MB Proceso 1 20MB Proceso 1 20MB Proceso 1 20MB
8MB 4MB
6MB Proceso 2 14 MB Proceso 2 14 MB
8MB 56MB
8MB 36MB
22MB
Proceso 3 18MB
8MB
4MB
8MB
8MB
Sistema Sistema Sistema Sistema
Operativo Operativo Operativo Operativo
12MB
8MB 20MB 20MB 20MB Proceso 2 14MB
Proceso 1 Proceso 1
6MB
8MB
14MB Proceso 4 8MB Proceso 4 8MB Proceso 4 8MB
16MB
6MB 6MB 6MB
8MB
Proceso 3 18MB Proceso 3 18MB Proceso 3 18MB Proceso 3 18MB
Particiones Particiones 4MB 4MB 4MB 4MB
de igual de distinto
tamaño tamaño
Particionamiento
Particionamiento Dinámico
Dinámico
Con particionamiento dinámico, las particiones son de longitud y número variable. Cuando se lleva
un proceso a la memoria principal, se le asigna exactamente tanta memoria como requiera y no
más.
El método comienza correctamente, pero finalmente lleva a una situación en la cual existen
muchos huecos pequeños en la memoria. A medida que pasa el tiempo, la memoria se fragmenta
cada vez más y la utilización de la memoria se decrementa. Este fenómeno se conoce como
fragmentación externa, indicando que la memoria que es externa a todas las particiones se
fragmenta de forma incremental.
Una técnica para eliminar la fragmentación externa es la compactación: de vez en cuando, el
sistema operativo desplaza los procesos en memoria, de forma que se encuentren contiguos y de
este modo toda la memoria libre se encontrará unida en un bloque.
La desventaja de la compactación es el hecho de que se trata de un procedimiento que consume
tiempo y malgasta tiempo de procesador. Obsérvese que la compactación requiere la capacidad
de reubicación dinámica. Es decir, debe ser posible mover un programa desde una región a otra
en la memoria principal sin invalidar las referencias de la memoria de cada programa.
Particionamiento
Particionamiento Dinámico
Dinámico
Debido a que la compactación de memoria consume una gran Ej de configuración de la memoria
antes y después de la asignación de
cantidad de tiempo, a la hora de cargar o intercambiar un 8MB un bloque de 16MB 8MB
proceso a la memoria principal, y siempre que haya más de un
bloque de memoria libre de suficiente tamaño, el OS debe 12MB 12MB

decidir qué bloque libre asignar. Primer-ajuste


22MB
6MB
Tres algoritmos de colocación que pueden considerarse para
Mejor-ajuste
escoger entre los bloques libres de la memoria principal que 18MB
sean iguales o más grandes que el proceso que va a llevarse a Último
la memoria son: bloque
8MB 8MB
asignado
Mejor-ajuste escoge el bloque más cercano en tamaño a la 6MB 6MB
petición.
Primer-ajuste comienza a analizar la memoria desde el
principio y escoge el primer bloque disponible que sea 14MB 14MB

suficientemente grande.
Próximo-ajuste
Siguiente-ajuste comienza a analizar la memoria desde la 36MB
última colocación y elige el siguiente bloque disponible que sea 20MB

suficientemente grande.
Registros
Registros Base
Base yy Limite
Limite
Normalmente, todas las referencias de memoria de los procesos cargados son relativas al origen
del programa. Por tanto, se necesita un mecanismo hardware para traducir las direcciones
relativas a direcciones físicas de la memoria principal, en tiempo de ejecución de la instrucción que
contiene dicha referencia.
Cuando un proceso se asigna al estado Ejecutando, un registro especial del procesador, algunas
veces llamado registro base, carga la dirección inicial del programa en la memoria principal.
Existe también un registro limite, que indica el final de la ubicación del programa; estos valores
se establecen cuando el programa se carga en la memoria o cuando la imagen del proceso se
lleva a la memoria.
A lo largo de la ejecución del proceso, se encuentran direcciones relativas. Éstas incluyen los
contenidos del registro de las instrucciones, las direcciones de instrucciones que ocurren en los
saltos e instrucciones call, y direcciones de datos existentes en instrucciones de carga y
almacenamiento. El procesador manipula cada dirección relativa, a través de dos pasos. Primero,
el valor del registro base se suma a la dirección relativa para producir una dirección absoluta.
Segundo, la dirección resultante se compara con el valor del registro Limite. Si la dirección se
encuentra dentro de los límites, entonces se puede llevar a cabo la ejecución de la instrucción. En
otro caso, se genera una interrupción, que debe manejar el sistema operativo de algún modo.
Evita accesos no autorizados por parte de otros procesos.
Intercambio
Intercambio // Swapping
Swapping
En un sistema MS Windows o GNU/Linux común, se pueden iniciar entre 40 y 100 procesos o más
cada vez que se inicia la computadora. Por ejemplo, cuando se instala una aplicación MS
Windows, a menudo emite comandos de manera que en los inicios subsiguientes del sistema se
inicie un proceso que no haga nada, excepto buscar actualizaciones para la aplicación. Dicho
proceso puede ocupar fácilmente de 5 a 10 MB de memoria. Otros procesos en segundo plano
comprueban el correo entrante, las conexiones de red entrantes y muchas otras cosas. Y todo esto
se hace antes de que se inicie el primer programa de usuario. Hoy en día, los programas de
aplicaciones de usuario serios pueden ejecutarse ocupando fácilmente 500 MB y más. En
consecuencia, para mantener todos los procesos en memoria todo el tiempo se requiere una gran
cantidad de memoria y no puede hacerse si no hay memoria suficiente.
A través de los años se han desarrollado dos esquemas generales para lidiar con la sobrecarga de
memoria. La estrategia más simple, conocida como intercambio, consiste en llevar cada proceso
completo a memoria, ejecutarlo durante cierto tiempo y después regresarlo al disco.
Los procesos inactivos mayormente son almacenados en disco, de tal manera que no ocupan
memoria cuando no se están ejecutando (aunque algunos de ellos se despiertan periódicamente
para realizar su trabajo y después vuelven a quedar inactivos).
La otra estrategia, conocida como memoria virtual, permite que los programas se ejecuten incluso
cuando sólo se encuentran en forma parcial en la memoria.
Intercambio
Intercambio // Swapping
Swapping
Al principio, sólo el proceso A está en la
memoria. Después los procesos B y C se Sistema Sistema Sistema Sistema Sistema Sistema Sistema
crean o se intercambian desde disco. En el Operativo Operativo Operativo Operativo Operativo Operativo Operativo

cuarto esquema el proceso A se intercambia


al disco. Después llega D y sale B. Por D D D
último, A entra de nuevo. Como A está ahora A A A
en una ubicación distinta, las direcciones que
contiene se deben reubicar.
Cuando el intercambio crea varios huecos en A

la memoria, es posible combinarlos todos en B B B B


uno grande desplazando los procesos lo más
hacia abajo que sea posible. Esta técnica se
conoce como compactación de memoria. Por C C C C C
lo general no se realiza debido a que
requiere mucho tiempo de la CPU. Por
ejemplo, en una máquina con 16 GB que
pueda copiar 8 bytes en 8 nseg, se
requerirían aproximadamente 16 segundos
para compactar toda la memoria.
Intercambio
Intercambio // Swapping
Swapping
Si los segmentos de datos de los procesos pueden crecer, por ejemplo mediante la asignación
dinámica de memoria proveniente de un heap, como en muchos lenguajes de programación,
ocurre un problema cuando un proceso trata de crecer. Si hay un hueco adyacente al proceso,
puede asignarse y se permite al proceso crecer en el hueco; si el proceso está adyacente a otro
proceso, el proceso en crecimiento tendrá que moverse a un hueco en memoria que sea lo
bastante grande como para alojarlo, o habrá que intercambiar uno o más procesos para crear un
hueco con el tamaño suficiente. Si un proceso no puede crecer en memoria y el área de
intercambio en el disco está llena, el proceso tendrá que suspenderse hasta que se libere algo de
espacio (o se puede eliminar).
Si se espera que la mayoría de los procesos crezcan a medida que se ejecuten, probablemente
sea conveniente asignar un poco de memoria adicional cada vez que se intercambia o se mueve
un proceso, para reducir la sobrecarga asociada con la acción de mover o intercambiar procesos
que ya no caben en su memoria asignada. No obstante, al intercambiar procesos al disco, se debe
intercambiar sólo la memoria que se encuentre en uso; es un desperdicio intercambiar también la
memoria adicional.
Características
Características requeridas
requeridas
1) Todas las referencias a la memoria dentro de un proceso se realizan a direcciones lógicas, que
se traducen dinámicamente en direcciones físicas durante la ejecución. Esto significa que un
proceso puede ser llevado y traído a memoria de forma que ocupe diferentes regiones de la
memoria principal en distintos instantes de tiempo durante su ejecución.
2) Un proceso puede dividirse en varias porciones (páginas o segmentos) y estas porciones no
tienen que estar localizadas en la memoria de forma contigua durante la ejecución. La
combinación de la traducción de direcciones dinámicas en ejecución y el uso de una tabla de
páginas o segmentos lo permite.
Si las dos características anteriores se dan, entonces es necesario que todas las páginas o todos
los segmentos de un proceso se encuentren en la memoria principal durante la ejecución. Si la
porción (segmento o página) en la que se encuentra la siguiente instrucción a buscar está y si la
porción donde se encuentra la siguiente dirección de datos que se va a acceder también está,
entonces al menos la siguiente instrucción se podrá ejecutar.
Supongamos que se tiene que traer un nuevo proceso de memoria. El OS comienza trayendo
únicamente una o dos porciones, que incluye la porción inicial del programa y la porción inicial de
datos sobre la cual acceden las primeras instrucciones. Esta parte del proceso que se encuentra
realmente en la memoria principal para, cualquier instante de tiempo, se denomina conjunto
residente del proceso.
Características
Características requeridas
requeridas
Cuando el proceso está ejecutándose, las cosas ocurren de forma suave mientras que todas las
referencias a la memoria se encuentren dentro del conjunto residente. Usando una tabla de
segmentos o páginas, el procesador siempre es capaz de determinar si esto es así o no. Si el
procesador encuentra una dirección lógica que no se encuentra en la memoria principal, generará
una interrupción indicando un fallo de acceso a la memoria. El OS coloca al proceso interrumpido
en un estado de bloqueado y toma el control. Para que la ejecución de este proceso pueda
reanudarse más adelante, el OS necesita traer a la memoria principal la porción del proceso que
contiene la dirección lógica que ha causado el fallo de acceso. Con este fin, el OS realiza una
petición de I/O, una lectura a disco. Después de realizar la petición de I/O, el OS puede activar otro
proceso que se ejecute mientras el disco realiza la operación de I/O. Una vez que la porción
solicitada se ha traído a la memoria principal, una nueva interrupción de I/O se lanza, dando
control de nuevo al OS, que coloca al proceso afectado de nuevo en el estado Listo.
1) Pueden mantenerse un mayor número de procesos en memoria principal, debido a que sólo se
cargaran algunas de las porciones de los procesos a ejecutar, existe espacio para más
procesos.
2) Un proceso puede ser mayor que toda la memoria principal. El sistema operativo
automáticamente carga porciones de un proceso en la memoria principal cuando éstas se
necesitan.
Características
Características requeridas
requeridas
Debido a que un proceso ejecuta sólo en la memoria principal, esta memoria se denomina
memoria real. Pero el programador o el usuario perciben una memoria potencialmente mucho más
grande —la cual se encuentra localizada en disco. Esta última se denomina memoria virtual. La
memoria virtual permite una multiprogramación muy efectiva que libera al usuario de las
restricciones excesivamente fuertes de la memoria principal.
Así, en cualquier momento, sólo unas pocas porciones de cada proceso se encuentran en
memoria, y por tanto se pueden mantener más procesos alojados en la misma. Cuando el OS
traiga una porción a la memoria, debe expulsar otra. Si elimina una porción justo antes de que
vaya a ser utilizada, deberá recuperar dicha porción de nuevo casi de forma inmediata. Un abuso
de esto lleva a una condición denominada trasiego (thrashing): el sistema consume la mayor parte
del tiempo enviando y trayendo porciones de swap en lugar de ejecutar instrucciones. Evitar el
trasiego se resuelve con una gran variedad de algoritmos complejos pero muy efectivos. En
esencia, el OS trata de adivinar, en base a la historia reciente, qué porciones son menos probables
de ser utilizadas en un futuro cercano.
Para que la memoria virtual resulte práctica y efectiva, se necesitan dos ingredientes. Primero,
debe existir un soporte hardware para el esquema de paginación y/o segmentación. Segundo, el
OS debe incluir código para gestionar el movimiento de páginas y/o segmentos entre la memoria
secundaria y la memoria principal.
Paginación
Paginación simple
simple
Tanto las particiones de tamaño fijo como variable son ineficientes en el uso de la memoria; los
primeros provocan fragmentación interna, los últimos fragmentación externa. Supóngase, sin
embargo, que la memoria principal se divide en porciones de tamaño fijo relativamente pequeños,
y que cada proceso también se divide en porciones pequeñas del mismo tamaño fijo. A dichas
porciones del proceso, conocidas como páginas, se les asigna porciones disponibles de memoria,
conocidas como marcos, o marcos de páginas. Esta sección muestra que el espacio de memoria
malgastado por cada proceso debido a la fragmentación interna corresponde sólo a una fracción
de la última página de un proceso. No existe fragmentación externa.
En un momento dado, algunos de los marcos de la memoria están en uso y algunos están libres.
El sistema operativo mantiene una lista de marcos libres. El proceso A, almacenado en disco, está
formado por cuatro páginas. En el momento de cargar este proceso, el sistema operativo
encuentra cuatro marcos libres y carga las cuatro páginas del proceso A en dichos marcos. El
proceso B, formado por tres páginas, y el proceso C, formado por cuatro páginas, se cargan a
continuación. En ese momento, el proceso B se suspende y deja la memoria principal.
Posteriormente, todos los procesos de la memoria principal se bloquean, y el sistema operativo
necesita traer un nuevo proceso, el proceso D, que está formado por cinco páginas.
Supongamos que no hay suficientes marcos contiguos sin utilizar para ubicar un proceso. ¿Esto
evitaría que el sistema operativo cargara el proceso D?
Memoria principal Memoria principal
Paginación
Paginación simple
simple
Memoria principal Memoria principal Memoria principal Memoria principal
0 0
0 0 A.0 0 A.0 0 A.0 0 A.0 0 A.0 Table de 1 1

1
paginas del 2 2
1 1 1 1 1
A.1 A.1 A.1 A.1 A.1
proceso A
3 3
2 2 A.2 2 2 2 2
A.2 A.2 A.2 A.2

N 3 3 3 3 3 3
A.3 A.3 A.3 A.3 A.3 0 -
U Table de
M 4 4 4 B.0 4 B.0 4 4 D.0 paginas del 1 -
M proceso B 2 -
E 5 5 5 B.1 5 B.1 5 5 D.1
R
6 6
O 6 B.2 6 B.2 6 6 D.2 0 7
S 7 7 7 7 7 7 Table de 1 8
C.0 C.0 C.0
paginas del 2 9
D 8 8 8 8 C.1 8 C.1 8 C.1 proceso C
E 3 10
9 9 9 9 9 9
C.2 C.2 C.2
M
10 10 0 4
M 10 10 C.3 10 C.3 10 C.3
A 11 11 Table de 1 5
11 11 11 11
R D.3
paginas del 2 6
C 12 12 12 12 12 12 proceso D
D.4
O 3 11
13 13 13 13 13 13
4 12
14 14 14 14 14 14

13
1) Quince marcos 2) Carga proceso 3) Carga proceso 4) Carga proceso 5) Intercambiar 4) Carga proceso Lista de
disponibles A B C proceso C D marcos libres 14
Paginación
Paginación simple
simple
La respuesta es no, porque una vez más se puede utilizar el concepto de dirección lógica. El
sistema operativo mantiene una tabla de páginas por cada proceso. La tabla de páginas muestra
la ubicación del marco por cada página del proceso. Dentro del programa, cada dirección lógica
está formada por un número de página y un desplazamiento dentro de la página. Es importante
recordar que en el caso de una partición simple, una dirección lógica es la ubicación de una
palabra relativa al comienzo del programa; el procesador la traduce en una dirección física. Con
paginación, la traducción de direcciones lógicas a físicas las realiza también el hardware del
procesador. Ahora el procesador debe conocer cómo acceder a la tabla de páginas del proceso
actual. Presentado como una dirección lógica (número de página, desplazamiento), el procesador
utiliza la tabla de páginas para producir una dirección física (número de marco, desplazamiento).
Continuando con nuestro ejemplo, las cinco páginas del proceso D se cargan en los marcos 4, 5,
6, 11 y 12. Una tabla de páginas contiene una entrada por cada página del proceso, de forma que
la tabla se indexe fácilmente por el número de página (iniciando en la página 0). Cada entrada de
la tabla de páginas contiene el número del marco en la memoria principal, si existe, que contiene
la página correspondiente, Adicionalmente, el sistema operativo mantiene una única lista de
marcos libres de todos los marcos de la memoria que se encuentran actualmente no ocupados y
disponibles para las páginas.
Paginación
Paginación simple
simple
Por tanto vemos que la paginación simple, tal y como se describe aquí, es similar al
particionamiento fijo. Las diferencias son que, con la paginación, las particiones son bastante
pequeñas; un programa podría ocupar más de una partición; y dichas particiones no necesitan ser
contiguas.
Para hacer este esquema de paginación conveniente, el tamaño de página y por tanto el tamaño
del marco debe ser una potencia de 2. Con el uso de un tamaño de página potencia de 2, es fácil
demostrar que la dirección relativa, que se define con referencia al origen del programa, y la
dirección lógica, expresada como un número de página y un desplazamiento, es lo mismo.
Las consecuencias de utilizar un tamaño de página que es una potencia de 2 son dobles. Primero,
el esquema de direccionamiento lógico es transparente al programador, al ensamblador y al
montador.
Cada dirección lógica (número de página, desplazamiento) de un programa es idéntica a su
dirección relativa. Segundo, es relativamente sencillo implementar una función que ejecute el
hardware para llevar a cabo dinámicamente la traducción de direcciones en tiempo de ejecución.
Paginación
Paginación yy Segmentación
Segmentación simple
simple
Dirección Lógica = Dirección Lógica =
Dirección relativa = 1502 Página#=1, Desplazamiento = 478 Segmento#=1, Desplazamiento = 752
0000010111011110 000001 0111011110 0001 001011110000

Segmento 0
750 bytes
Página 0

752
Proceso de usuario

478
(2700 bytes)
Página 1
Segmento 1
1950 bytes

Página 2
a) Particionado c) Segmentación

b) Paginación
(tamaño página = 1KB)
Segmentación
Segmentación Simple
Simple
Un programa de usuario se puede subdividir utilizando segmentación, en la cual el programa y sus
datos asociados se dividen en un número de segmentos. No se requiere que todos los programas
sean de la misma longitud, aunque hay una longitud máxima de segmento. Como en el caso de la
paginación, una dirección lógica utilizando segmentación está compuesta por dos partes, en este
caso un número de segmento y un desplazamiento.
Debido al uso de segmentos de distinto tamaño, la segmentación es similar al particionamiento
dinámico. En la ausencia de un esquema de overlays o el uso de la memoria virtual, se necesitaría
que todos los segmentos de un programa se cargaran en la memoria para su ejecución. La
diferencia, comparada con el particionamiento dinámico, es que con la segmentación un programa
podría ocupar más de una partición, y estas particiones no necesitan ser contiguas. La
segmentación elimina la fragmentación interna pero, al igual que el particionamiento dinámico,
sufre de fragmentación externa. Sin embargo, debido a que el proceso se divide en varias piezas
más pequeñas, la fragmentación externa debería ser menor.
Mientras que la paginación es invisible al programador, la segmentación es normalmente visible y
se proporciona como una utilidad para organizar programas y datos. Normalmente, el programador
o compilador asignará programas y datos a diferentes segmentos. Para los propósitos de la
programación modular, los programas o datos se pueden dividir posteriormente en múltiples
segmentos.
Segmentación
Segmentación Simple
Simple
El inconveniente principal de este servicio es que el programador debe ser consciente de la
limitación de tamaño de segmento máximo. Otra consecuencia de utilizar segmentos de distinto
tamaño es que no hay una relación simple entre direcciones lógicas y direcciones físicas.
De forma análoga a la paginación, un esquema de segmentación sencillo haría uso de una tabla
de segmentos por cada proceso y una lista de bloques libre de memoria principal. Cada entrada
de la tabla de segmentos tendría que proporcionar la dirección inicial de la memoria principal del
correspondiente segmento. La entrada también debería proporcionar la longitud del segmento,
para asegurar que no se utilizan direcciones no válidas. Cuando un proceso entra en el estado
Ejecutando, la dirección de su tabla de segmentos se carga en un registro especial utilizado por el
hardware de gestión de la memoria.
Resumiendo, con la segmentación simple, un proceso se divide en un conjunto de segmentos que
no tienen que ser del mismo tamaño. Cuando un proceso se trae a memoria, todos sus segmentos
se cargan en regiones de memoria disponibles, y se crea la tabla de segmentos.
Segmentación
Segmentación Simple
Simple
Dirección lógica de 16bits Dirección lógica de 16bits
Página de 6bits Desplazamiento de 10bits Segmento Desplazamiento de 12bits
4bits
0 0 0 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0

0 000101 Longitud Base


1 000110 0 001011101110 0000010000000000
2 011001 1 011110011110 0010000000100000
+
Tabla de páginas Tabla de segmentos de proceso
de proceso

0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0
Dirección física de 16bits Dirección física de 16bits

paginación Segmentación
Características
Características de
de la
la P
Paginación
aginación
yy la
la Segmentación
Segmentación
Paginación Simple Paginación con Memoria Virtual Segmentación Simple Segmentación con Memoria Virtual
Memoria principal particionada en Memoria principal particionada en Memoria principal no particionada Memoria principal no particionada
fragmentos pequeños de un tamaño fragmentos pequeños de un tamaño
fijo llamados marcos fijo llamados marcos
Programa dividido en paginas por el Programa dividido en paginas por el Los segmentos de programa se Los segmentos de programa se
compilador o el sistema de gestión de compilador o el sistema de gestión de especifican por el programador al especifican por el programador al
memoria memoria compilador compilador
Fragmentación interna en los marcos Fragmentación interna en los marcos Sin fragmentación interna Sin fragmentación interna
Sin fragmentación externa Sin fragmentación externa Fragmentación externa Fragmentación externa
El OS debe mantener una tabla de El OS debe mantener una tabla de El OS debe mantener una tabla de El OS debe mantener una tabla de
paginas por cada proceso mostrando paginas por cada proceso mostrando segmentos por cada proceso segmentos por cada proceso
en el marco que se encuentra cada en el marco que se encuentra cada mostrando la dirección de carga y la mostrando la dirección de carga y la
pagina ocupada pagina ocupada longitud de cada segmento longitud de cada segmento
El OS debe mantener una lista de El OS debe mantener una lista de El OS debe mantener una lista de El OS debe mantener una lista de
marcos libres marcos libres huecos en la memoria principal huecos en la memoria principal
El procesador utiliza el numero de El procesador utiliza el numero de El procesador utiliza el numero de El procesador utiliza el numero de
pagina, desplazamiento para calcular pagina, desplazamiento para calcular segmentos, desplazamiento para segmentos, desplazamiento para
la dirección absoluta la dirección absoluta calcular direcciones absolutas calcular direcciones absolutas
Todas las paginas del proceso deben No se necesitan mantener todas las Todos los segmentos del proceso No se necesitan mantener todos los
encontrarse en la memoria principal paginas del proceso en los marcos de deben encontrarse en la memoria segmentos del proceso en la memoria
para que el proceso se pueda ejecutar, la memoria principal para que se principal para que el proceso se pueda principal para que el proceso se
salvo que se utilice overlays ejecute, se leen bajo demanda ejecutar, salvo que se utilice overlays ejecute. Se pueden leer bajo demanda
La lectura de una pagina a memoria La lectura de un segmento a memoria
principal puede requerir la escritura de principal puede requerir la escritura de
una pagina a disco uno o mas segmentos al disco
Memoria
Memoria Virtual
Virtual
Mientras que los registros base y límite se pueden utilizar para crear la abstracción de los espacios
de direcciones, hay otro problema que se tiene que resolver: la administración del agrandamiento
del software (bloatware). Aunque el tamaño de las memorias se incrementa con cierta rapidez, el
del software aumenta con una mucha mayor. En la década de 1980, muchas universidades
operaban un sistema de tiempo compartido con docenas de usuarios (más o menos satisfechos)
trabajando simultáneamente en una VAX de 4 MB. Ahora Microsoft recomienda tener por lo menos
2 GB para que un sistema Windows 10 de 64bits de un solo usuario ejecute aplicaciones simples.
Como consecuencia de estos desarrollos, existe la necesidad de ejecutar programas que son
demasiado grandes como para caber en la memoria y sin duda existe también la necesidad de
tener sistemas que puedan soportar varios programas ejecutándose al mismo tiempo, cada uno de
los cuales cabe en memoria, pero que en forma colectiva exceden el tamaño de la misma. El
intercambio no es una opción atractiva, ya que un disco SATA 3 ordinario tiene una velocidad de
transferencia pico de 400 MB/s a lo más, lo cual significa que requiere por lo menos 3 segundos
para intercambiar un programa de 1 GB de memoria a disco y otros 3 segundos para intercambiar
un programa de 1 GB del disco a memoria.
El problema de que los programas sean más grandes que la memoria ha estado presente desde
los inicios de la computación, en áreas limitadas como la ciencia y la ingeniería (para simular la
creación del universo o, incluso, para simular una nueva aeronave, se requiere mucha memoria).
Memoria
Memoria Virtual
Virtual
El método ideado (Fotheringham, 1961) se conoce actualmente como memoria virtual. La idea
básica detrás de la memoria virtual es que cada programa tiene su propio espacio de direcciones,
el cual se divide en trozos llamados páginas. Cada página es un rango contiguo de direcciones.
Estas páginas se asocian a la memoria física, pero no todas tienen que estar en la memoria física
para poder ejecutar el programa. Cuando el programa hace referencia a una parte de su espacio
de direcciones que está en la memoria física, el hardware realiza la asociación necesaria al
instante. Cuando el programa hace referencia a una parte de su espacio de direcciones que no
está en la memoria física, el sistema operativo recibe una alerta para buscar la parte faltante y
volver a ejecutar la instrucción que falló.
En cierto sentido, la memoria virtual es una generalización de la idea de los registros base y límite.
El procesador 8088 tenía registros base separados (pero no tenía registros límite) para texto y
datos. Con la memoria virtual, en vez de tener una reubicación por separado para los segmentos
de texto y de datos, todo el espacio de direcciones se puede asociar a la memoria física en
unidades pequeñas equitativas.
La memoria virtual funciona muy bien en un sistema de multiprogramación, con bits y partes de
muchos programas en memoria a la vez. Mientras un programa espera a que una parte del mismo
se lea y coloque en la memoria, la CPU puede otorgarse a otro proceso.
Paginación
Paginación con
con Memoria
Memoria Virtual
Virtual
En las computadoras sin memoria virtual, la dirección física se coloca directamente en el bus de
memoria y hace que se lea o escriba la palabra de memoria física con la misma dirección. Cuando
se utiliza memoria virtual, las direcciones virtuales no van directamente al bus de memoria. En vez
de ello, van a una MMU (Memory Management Unit, Unidad de administración de memoria) que
asocia las direcciones virtuales a las direcciones de memoria físicas.
Para la memoria virtual basada en el esquema de paginación también se necesita una tabla de
páginas. De nuevo, normalmente se asocia una única tabla de páginas a cada proceso. Debido a
que sólo algunas de las páginas de proceso se encuentran en la memoria principal, se necesita
que cada entrada de la tabla de páginas indique si la correspondiente página está presente (P) en
memoria principal o no. Si el bit indica que la página está en memoria, la entrada también debe
indicar el número de marco de dicha página.
La entrada de la tabla de páginas incluye un bit de modificado (M), que indica si los contenidos de
la correspondiente página han sido alterados desde que la página se cargó por última vez en la
memoria principal. Si no había ningún cambio, no es necesario escribir la página cuando llegue el
momento de reemplazarla por otra página en el marco de página que actualmente ocupa.
Pueden existir también otros bits de control en estas entradas. Por ejemplo, si la protección y
compartición se gestiona a nivel de página, se necesitarán también los bits para este propósito.
Paginación
Paginación con
con Memoria
Memoria Virtual
Virtual
Espacio de
direcciones
Como sólo tenemos ocho marcos de página físicos, sólo
virtuales ocho de las páginas virtuales se asocian a la memoria
60K-64K X física. Las demás, que se muestran con una cruz en la
56K-60K X
figura, no están asociadas. En el hardware real, un bit de
52K-56K X Página virtual presente/ausente lleva el registro de cuáles páginas
48K-52K X
están físicamente presentes en la memoria.
44K-48K 7
¿Qué ocurre si el programa hace referencia a direcciones
Dirección no asociadas, por ejemplo, mediante el uso de la
40K-44K X
de memoria instrucción
36K-40K 5 física MOV REG,32780
32K-36K X ... 28K-32K
que es el byte 12 dentro de la página virtual 8
28K-32K X
... 24K-28K (empezando en 32768)? La MMU detecta que la página
24K-28K X
... 20K-24K no está asociada (X) y hace que la CPU haga un TRAP al
20K-24K 3
... 16K-20K OS. A este TRAP se le llama fallo de página. El OS
16K-20K 4
... 12K-16K
selecciona un marco de página que se utilice poco y
12K-16K 0 escribe su contenido de vuelta al disco (si no es que ya
... 8K-12K
8K-12K 6 está ahí). Después obtiene la página que se acaba de
4K-8K 1 ... 4K-8K referenciar en el marco de página que se acaba de
0K-4K 2 ... 0K-4K liberar, cambia la asociación y reinicia la instrucción que
Marco de Página
originó el TRAP.
Paginación
Paginación con
con Memoria
Memoria Virtual
Virtual
Estructura de la tabla de páginas. El mecanismo básico de lectura de una palabra de la memoria
implica la traducción de la dirección virtual, o lógica, consistente en un número de página y un
desplazamiento, a la dirección física, consistente en un número de marco y un desplazamiento,
usando para ello la tabla de páginas. Debido a que la tabla de páginas es de longitud variable
dependiendo del tamaño del proceso, no podemos suponer que se encuentra almacenada en los
registros. En lugar de eso, debe encontrarse en la memoria principal para poder ser accedida.
Número de página Desplazamiento Dirección virtual - Paginación Computadora Tamaño de Página
Atlas 512 48bits words
Otros bits
PM de control Número de marco Entrada de la tabla de páginas Honeywell-Multics 1024 36bits words
IBM 370/XA an 370/ESA 4KB
Segmento Desplazamiento Dirección virtual - Segmentación VAX Family 512 bytes
IBM AS/400 512 bytes
PM
Otros bits
de control Longitud Comienzo de segmento Entrada de la tabla
de segmentos DEC Alpha 8KB
Dirección virtual MIPS 4KB a 16MB
Segmento de página Número de página Desplazamiento Segmentación de
paginas UltraSPARC 8KB a 4MB

Bits de control Longitud Comienzo de segmento Entrada de la tabla Pentium 4KG a 4MB
de segmentos
Intel Itanium 4KB a 256MB
Otros bits Intel Core i7 4KB a 1GB
PM de control Número de marco Entrada de la tabla de páginas
Paginación
Paginación con
con Memoria
Memoria Virtual
Virtual
En la mayoría de sistemas, existe una única tabla de página por proceso. Pero cada proceso
puede ocupar una gran cantidad de memoria virtual. Por ejemplo, en la arquitectura VAX, cada
proceso puede tener hasta 231 = 2 GB de memoria virtual. Usando páginas de 29 = 512 bytes, que
representa un total de 222 entradas de tabla de página por cada proceso. Evidentemente, la
cantidad de memoria demandada por las tablas de página únicamente puede ser
inaceptablemente grande. Para resolver este problema, la mayoría de esquemas de memoria
virtual almacena las tablas de páginas también en la memoria virtual, en lugar de en la memoria
real. Esto representa que las tablas de páginas están sujetas a paginación igual que cualquier otra
página.
Cuando un proceso está en ejecución, al menos parte de su tabla de páginas debe encontrarse en
memoria, incluyendo la entrada de tabla de páginas de la página actualmente en ejecución.
Algunos procesadores utilizan un esquema de dos niveles para organizar las tablas de páginas de
gran tamaño. En este esquema, existe un directorio de páginas, en el cual cada entrada apuntaba
a una tabla de páginas. De esta forma, si la extensión del directorio de páginas es X, y si la
longitud máxima de una tabla de páginas es Y, entonces un proceso consistirá en hasta X ≥ Y
páginas. Normalmente, la longitud máxima de la tabla de páginas se restringe para que sea igual a
una página.
Paginación
Paginación con
con Memoria
Memoria Virtual
Virtual
Dirección Virtual
Nro página Desplazamiento Nro marco Desplazamiento

Registro desplaza
miento
Puntero tabla
de páginas
Marco de
n bits m bits página

Tabla de paginas

Nro. Marco

Programa Mecanismo de paginación Memoria Principal


Aceleración
Aceleración de
de Paginación
Paginación
En cualquier sistema de paginación hay que abordar dos cuestiones principales:
1) La asociación (mapeo) de una dirección virtual a una dirección física debe ser rápida.
2) Si el espacio de direcciones virtuales es grande, la tabla de páginas será grande.
Todas las instrucciones deben provenir de la memoria y muchas de ellas hacen referencias a
operandos en memoria también. En consecuencia, es necesario hacer una, dos o algunas veces
más referencias a la tabla de páginas por instrucción. Si la ejecución de una instrucción tarda, por
ejemplo 1 nseg, la búsqueda en la tabla de páginas debe realizarse en menos de 0.2 nseg para
evitar que la asociación se convierta en un cuello de botella importante.
El segundo punto se deriva del hecho de que todas las computadoras modernas utilizan
direcciones virtuales de por lo menos 32 bits, donde 64 bits ya es más común. Por decir, con un
tamaño de página de 4 KB, un espacio de direcciones de 32 bits tiene 1 millón de páginas y un
espacio de direcciones de 64 bits tiene más de las que desearíamos contemplar. Con 1 millón de
páginas en el espacio de direcciones virtual, la tabla de páginas debe tener 1 millón de entradas.
Ademas, cada proceso necesita su propia tabla de páginas (debido a que tiene su propio espacio
de direcciones virtuales).
Aceleración
Aceleración de
de Paginación
Paginación
La necesidad de una asociación de páginas extensa y rápida es una restricción considerable en
cuanto a la manera en que se construyen las computadoras. El diseño más simple (por lo menos
en concepto) es tener una sola tabla de páginas que consista en un arreglo de registros de
hardware veloces, con una entrada para cada página virtual, indexada por número de página
virtual. Cuando se inicia un proceso, el sistema operativo carga los registros con la tabla de
páginas del proceso, tomada de una copia que se mantiene en la memoria principal.
Durante la ejecución del proceso no se necesitan más referencias a memoria para la tabla de
páginas. Las ventajas de este método son que es simple y no requiere referencias a memoria
durante la asociación. Una desventaja es que es extremadamente costoso que la tabla de páginas
sea extensa; otra es que tener que cargar la tabla de páginas completa en cada conmutación de
contexto ve afectado el rendimiento.
En el otro extremo, toda la tabla de páginas puede estar en la memoria principal. Así, todo lo que
el hardware necesita es un solo registro que apunte al inicio de la tabla de páginas. Este diseño
permite cambiar la asociación de direcciones virtuales a direcciones físicas al momento de una
conmutación de contexto con sólo recargar un registro. Desde luego, tiene la desventaja de
requerir una o más referencias a memoria para leer las entradas en la tabla de páginas durante la
ejecución de cada instrucción, con lo cual se hace muy lenta.
Aceleración
Aceleración de
de Paginación
Paginación
Para solventar este problema, la mayoría de esquemas de la memoria virtual utilizan una cache
especial de alta velocidad para las entradas de la tabla de página, habitualmente denominada
buffer de traducción anticipada (translation lookaside buffer -TLB). Esta cache contiene aquellas
entradas de la tabla de páginas que han sido usadas de forma más reciente.
Dada una dirección virtual, el procesador primero examina la TLB, si la entrada de la tabla de
páginas solicitada está presente (acierto en TLB), entonces se recupera el número de marco y se
construye la dirección real. Si la entrada de la tabla de páginas solicitada no se encuentra (fallo en
la TLB), el procesador utiliza el número de página para indexar la tabla de páginas del proceso y
examinar la correspondiente entrada de la tabla de páginas. Si el bit de presente está puesto a 1,
entonces la página se encuentra en memoria principal, y el procesador puede recuperar el número
de marco desde la entrada de la tabla de páginas para construir la dirección real. El procesador
también autorizará la TLB para incluir esta nueva entrada de tabla de páginas. Finalmente, si el bit
presente no está puesto a 1, entonces la página solicitada no se encuentra en la memoria principal
y se produce un fallo de acceso memoria, llamado fallo de página. En este punto, abandonamos el
dominio del hardware para invocar al sistema operativo, el cual cargará la página necesaria y
actualizada de la tabla de páginas.
Aceleración
Aceleración de
de Paginación
Paginación
El otro problema es cómo lidiar con espacios 1023
Tabla de
.
páginas
de direcciones virtuales muy extensos. .
.
para los
6
4MB
Como primer método, se considera el uso de 5

Tabla de páginas de 4 superior


una tabla de páginas multinivel que evita Tabla de páginas segundo superior 3 es de la
memoria
mantenerlas en memoria todo el tiempo, y en de nivel superior
1023
1023
2

especial, aquellas que no se necesitan. .


.
.
.
. 0

.
6

Por ejemplo, suponga que un proceso 6 5

necesita 12 megabytes: los 4 megabytes


5 4
4 3

inferiores de memoria para el texto del 3 2


2
programa, los siguientes 4 megabytes para 1
1

datos y los 4 megabytes superiores para la 0


1023

pila. Entre la parte superior de los datos y la .


.
.
parte inferior de la pila hay un hueco 6

gigantesco que no se utiliza. 5

4
A las
3

2
páginas
1

0
Aceleración
Aceleración de
de Paginación
Paginación
Para los espacios de direcciones virtuales de 32 bits, la tabla de páginas multinivel funciona
bastante bien. Sin embargo, en computadoras de 64 la situación cambia de manera drástica. Si el
espacio de direcciones es de 264 bytes, con páginas de 4 KB, necesitamos una tabla de páginas
con 252 entradas. Si cada entrada es de 8 bytes, la tabla es de más de 30 millones de gigabyes (30
PB). En consecuencia, se necesita una solución diferente para los espacios de direcciones
virtuales paginados de 64 bits.
Una de esas soluciones es la tabla de páginas invertida. En este diseño hay una entrada por
cada marco de página en la memoria real, en vez de tener una entrada por página de espacio de
direcciones virtuales. Por ejemplo, con direcciones virtuales de 64 bits, una página de 4 KB y 4 GB
de RAM, una tabla de páginas invertida sólo requiere 1,048,576 entradas. La entrada lleva el
registro de quién (proceso, página virtual) se encuentra en el marco de página.
Aunque las tablas de página invertidas ahorran grandes cantidades de espacio, al menos cuando
el espacio de direcciones virtuales es mucho mayor que la memoria física, tienen una seria
desventaja: la traducción de dirección virtual a dirección física se hace mucho más difícil. Cuando
el proceso n hace referencia a la página virtual p, el hardware ya no puede buscar la página física
usando p como indice en la tabla de paginas. En vez de ello, debe buscar una entrada (n, p) en
toda la tabla de páginas invertida. Lo que es peor: esta búsqueda se debe realizar en cada
referencia a memoria, no sólo en los fallos de página.
Aceleración
Aceleración de
de Paginación
Paginación
La forma de salir de este dilema es utilizar el TLB. Si el TLB puede contener todas las páginas de
uso frecuente, la traducción puede ocurrir con igual rapidez que con las tablas de páginas
regulares. Sin embargo, en un fallo de TLB la tabla de páginas invertida tiene que buscarse
mediante software. Una manera factible de realizar esta búsqueda es tener una tabla de hash
arreglada según el hash de la dirección virtual. Todas las páginas virtuales que se encuentren en
memoria y tengan el mismo valor de hash se encadenan en conjunto. Si la tabla de hash tiene
tantas ranuras como las páginas físicas de la máquina, la cadena promedio tendrá sólo una
entrada, con lo cual se acelera de manera considerable la asociación. Una vez que se ha
encontrado el número de marco de página, se introduce el nuevo par (virtual, física) en el TLB.
Tabla de páginas
tradicional con una
entrada para cada
La memoria física de Pagina Marco de
una de las 252 páginas
1 GB tiene 218 marcos virtual Pagina
252-1 de páginas de 4KB Tabla de hash
.
.
218-1 218-1
.
. .
. .
6 . .

5 2 Indexada 2 s

4 1 por hash 1
3 0 en página 0 s s
Indexada virtual
2
por página
1
virtual
0
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Cuando ocurre un fallo de página, el sistema operativo tiene que elegir una página para
desalojarla (eliminarla de memoria) y hacer espacio para la página entrante. Si la página a eliminar
se modificó mientras estaba en memoria, debe volver a escribirse en el disco para actualizar la
copia del mismo.
No obstante, si la página no se ha modificado (por ejemplo, si contiene el texto del programa), la
copia ya está actualizada y no se necesita rescribir. La página que se va a leer sólo sobrescribe en
la página que se va a desalojar.
Aunque sería posible elegir una página al azar para desalojarla en cada fallo de página, el
rendimiento del sistema es mucho mayor si se selecciona una página que no sea de uso
frecuente. Si se elimina una página de uso frecuente, tal vez tenga que traerse de vuelta
rápidamente, lo cual produce una sobrecarga adicional.
Al momento en que ocurre un fallo de página, hay cierto conjunto de páginas en memoria y una de
éstas se referenciará en la siguiente instrucción (la página que contiene la instrucción); otras
páginas tal vez no se referencien sino hasta 10, 100 o tal vez 1000 instrucciones después. El
problema es que al momento del fallo de página, el sistema operativo no tiene forma de saber
cuándo será la próxima referencia a cada una de las páginas, este es El algoritmo de reemplazo
de páginas óptimo y es inaplicable.
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Para permitir que el sistema operativo recolecte estadísticas útiles sobre el uso de páginas, la
mayor parte de las computadoras con memoria virtual tienen dos bits de estado asociados a cada
página. R se establece cada vez que se hace referencia a la página (lectura o escritura); M se
establece cuando se escribe en la página (es decir, se modifica). Los bits están contenidos en
cada entrada de la tabla de páginas. Es importante tener en cuenta que estos bits se deben
actualizar en cada referencia a la memoria, por lo que es imprescindible que se establezcan
mediante el hardware. Una vez que se establece un bit en 1, permanece así hasta que el sistema
operativo lo restablece.
Los bits R y M se pueden utilizar para construir un algoritmo simple de paginación de la siguiente
manera. Cuando se inicia un proceso, ambos bits de página para todas sus páginas se establecen
en 0 mediante el OS. El bit R se borra en forma periódica (en cada interrupción de reloj) para
diferenciar las páginas a las que no se ha hecho referencia de las que si se han referenciado.
Cuando ocurre un fallo de página, el sistema operativo inspecciona todas las páginas y las divide
en 4 categorías con base en los valores actuales de sus bits R y M:

Clase 0: no ha sido referenciada, no ha sido modificada.

Clase 1: no ha sido referenciada, ha sido modificada.

Clase 2: ha sido referenciada, no ha sido modificada.

Clase 3: ha sido referenciada, ha sido modificada.
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
El algoritmo NRU (Not Recently Used, No usada recientemente) elimina una página al azar de
la clase de menor numeración que no esté vacía. En este algoritmo está implícita la idea de que es
mejor eliminar una página modificada a la que no se haya hecho referencia en al menos un pulso
de reloj (por lo general, unos 20 mseg) que una página limpia de uso frecuente. La principal
atracción del NRU es que es fácil de comprender, moderadamente eficiente de implementar y
proporciona un rendimiento que, aunque no es óptimo, puede ser adecuado.
Otro algoritmo de paginación con baja sobrecarga es el de Primera en entrar, primera en salir
(First-In, First-Out, FIFO). El sistema operativo mantiene una lista de todas las páginas
actualmente en memoria, en donde la llegada más reciente está en la parte final y la menos
reciente en la parte frontal. En un fallo de página, se elimina la página que está en la parte frontal y
la nueva página se agrega a la parte final de la lista. Este algoritmo no se utiliza ya que la primer
pagina podría ser de un proceso importante o recurrente por mas que halla sido el primero en
encontrarse en la tabla.
Una modificación simple al algoritmo FIFO que evita el problema de descartar una página de uso
frecuente es inspeccionar el bit R de la página más antigua. Si es 0, la página es antigua y no se
ha utilizado, por lo que se sustituye de inmediato. Si el bit R es 1, el bit se borra, la página se pone
al final de la lista de páginas y su tiempo de carga se actualiza, como si acabara de llegar a la
memoria. Después la búsqueda continúa. Se llama 2da oportunidad.
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Aunque el algoritmo segunda oportunidad es razonable, también es innecesariamente ineficiente
debido a que está moviendo constantemente páginas en su lista. Un mejor método sería mantener
todos los marcos de página en una lista circular en forma de reloj. La manecilla apunta a la página
más antigua.
Cuando ocurre un fallo de página, la página a la que apunta la manecilla se inspecciona. Si el bit R
es 0, la página se desaloja, se inserta la nueva página en el reloj en su lugar y la manecilla avanza
una posición. Si R es 1, se borra y la manecilla avanza a la siguiente página. Este proceso se
repite hasta encontrar una página con R = 0. El algoritmo se llama de reloj.
A
L B

KK C Cuando ocurre un fallo de página, la


página a la que apunta la manecilla se
inspecciona. La acción a realizar
JJ D depende del bit R:
R = 0 desaloja la página
R = 1 desactiva R y avanza la manecilla
I E

HH FF
G
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Una buena aproximación al algoritmo óptimo se basa en la observación de que las páginas que se
hayan utilizado con frecuencia en las últimas instrucciones, tal vez se volverán a usar con
frecuencia en las siguientes. Por el contrario, las páginas que no se hayan utilizado por mucho
tiempo probablemente seguirán sin utilizarse por mucho tiempo más. Esta idea sugiere un
algoritmo factible: cuando ocurra un fallo de página, hay que descartar la página que no se haya
utilizado durante la mayor longitud de tiempo. A esta estrategia se le conoce como paginación LRU
(Least Recently Used, Menos usadas recientemente).
Para implementar el LRU por completo, es necesario mantener una lista enlazada de todas las
páginas en memoria, con la página de uso más reciente en la parte frontal y la de uso menos
reciente en la parte final. La dificultad es que la lista debe actualizarse en cada referencia a
memoria. Buscar una página en la lista, eliminarla y después pasarla al frente es una operación
que consume mucho tiempo, incluso mediante hardware (suponiendo que pudiera construirse
dicho hardware).
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
En la forma más pura de paginación, los procesos inician sin ninguna de sus páginas en la
memoria. Tan pronto como la CPU trata de obtener la primera instrucción, recibe un fallo de
página, causando que el OS tenga que traer la página que contiene la primera instrucción. a este
fallo le siguen otros fallos de página por las variables globales y la pila. Después de cierto tiempo,
el proceso tiene la mayoría de las páginas que necesita y se establece para ejecutarse con
relativamente pocos fallos de página. A esta estrategia se le conoce como paginación bajo
demanda, debido a que las páginas se cargan sólo según la demanda, no por adelantado.
La mayoría de los procesos exhiben una localidad de referencia, lo cual significa que el proceso
hace referencia sólo a una fracción relativamente pequeña de sus páginas en fases de ejecución .
El conjunto de páginas que utiliza un proceso en un momento dado se conoce como su conjunto
de trabajo. Si todo el conjunto de trabajo está en memoria, el proceso se ejecutará sin producir
muchos fallos hasta que avance a otra fase de ejecución. Si la memoria disponible es demasiado
pequeña como para contener todo el conjunto de trabajo completo, el proceso producirá muchos
fallos de página y se ejecutará lentamente, ya que para ejecutar una instrucción se requieren unos
cuantos nanosegundos y para leer una página del disco se requieren en general 10 milisegundos.
A una proporción de una o dos instrucciones por cada 10 milisegundos, se requeriría una
eternidad para terminar. Se dice que un programa que produce fallos de página cada pocas
instrucciones está sobrepaginando (thrashing)
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
En un sistema de multiprogramación, los procesos se mueven con frecuencia al disco (es decir,
todas sus páginas se eliminan de la memoria) para dejar que otros procesos tengan oportunidad
de usar la CPU. Aquí surge la pregunta de qué hacer cuando un proceso se regresa una y otra
vez. Técnicamente, no hay que hacer nada. El proceso producirá fallos de página sólo hasta que
se haya cargado su conjunto de trabajo. El problema es que tener 20, 100 o incluso 1000 fallos de
página cada vez que se carga un proceso es algo lento, además de que se desperdicia un tiempo
considerable de la CPU, ya que el sistema operativo tarda unos cuantos milisegundos de tiempo
de la CPU en procesar un fallo de página.
Por lo tanto, muchos sistemas de paginación tratan de llevar la cuenta del conjunto de trabajo de
cada proceso y se aseguran que esté en memoria antes de permitir que el proceso se ejecute.
Este método se conoce como modelo del conjunto de trabajo
Hay que tener en cuenta que el conjunto de trabajo cambia con el tiempo.
Para implementar el modelo del conjunto de trabajo, es necesario que el sistema operativo lleve la
cuenta de cuáles páginas están en el conjunto de trabajo. Tener esta información también conduce
de inmediato a un posible algoritmo de reemplazo de páginas: cuando ocurra un fallo de página,
hay que buscar una página que no se encuentre en el conjunto de trabajo y desalojarla.
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Para implementar dicho . Tiempo virtual actual 2204
.
algoritmo se requiere una .
manera precisa de determinar Información acerca
de una página
cuáles páginas están en el 2084 1 Bit R (referencia)
conjunto de trabajo. Por
definición, el conjunto de trabajo 2003 1
es el conjunto de páginas
utilizadas en las k referencias a Tiempo de último 1980 1 Explora todas las páginas examinando el bit R:
uso
memoria más recientes. Para Si (R == 1)
implementar cualquier algoritmo 1213 0 establece el tiempo del ultimo uso al
de conjunto de trabajo se debe Página referenciada
tiempo virtual actual
elegir por adelantado cierto durante este pulso 2014 1
Si (R == 0 y edad > t)
valor de k. Una vez que se ha elimina esta página
seleccionado cierto valor, 2020 1
Si (R == 0 y edad <= t)
después de cada referencia a recuerda el menor tiempo
memoria, el conjunto de páginas Página no
2032 1

utilizadas por las k referencias a referenciada


memoria más recientes se durante este pulso 1620 0

determina en forma única.


Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Al algoritmo básico del conjunto de trabajo es incómodo ya que exige explorar toda la tabla de
páginas en cada fallo de página hasta localizar un candidato adecuado. Un algoritmo mejorado,
basado en el algoritmo de reloj pero que también utiliza la información del conjunto de trabajo, se
conoce como WSClock
Debido a su simplicidad de implementación y buen rendimiento, es muy utilizado en la práctica. La
estructura de datos necesaria es una lista circular de marcos de página, como en el algoritmo de
reloj. Al principio, esta lista está vacía. Cuando se carga la primera página, se agrega a la lista. A
medida que se agregan más páginas, pasan a la lista para formar un anillo. Cada entrada contiene
el campo Tiempo de último uso del algoritmo básico del conjunto de trabajo, así como el bit R
(mostrado) y el bit M (no mostrado).
Al igual que con el algoritmo de reloj, en cada fallo de página se examina primero la página a la
que apunta la manecilla. Si el bit R es 1, la página se ha utilizado durante el pulso actual, por lo
que no es candidata ideal para la eliminación. Después el bit R se establece en 0, la manecilla se
avanza a la siguiente página y se repite el algoritmo para esa página.
si la página a la que apunta la manecilla tiene R = 0. Si la edad es mayor que τ y la página está
limpia, significa que no se encuentra en el conjunto de trabajo y existe una copia válida en el disco.
El marco de página simplemente se reclama y la nueva página se coloca ahí.
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Por otro lado, si la página está Tiempo virtual actual 2204
sucia no se puede reclamar de 1620 0 1620 0

inmediato, ya que no hay una 2084 1 2032 1 2084 1 2032 1

copia válida presente en el disco.


Para evitar una conmutación de 2003 1 2020 1 2003 1 2020 1

procesos, la escritura al disco se


planifica pero la manecilla avanza 1980 1 2014 1 1980 1 2014 0

y el algoritmo continúa con la 1213 0 1213 0


Bit R (referencia)
siguiente página. Después de
Tiempo ultimo uso
todo, podría haber una página
antigua y limpia más allá de la 1620 0 1620 0

línea que se pueda utilizar de 2084 1 2032 1 2084 1 2032 1

inmediato.
2003 1 2020 1 2003 1 2020 1

1980 1 2014 0 1980 1 2014 0

1213 0 2204 1
Nueva página
Algoritmos
Algoritmos de
de reemplazo
reemplazo de
de Paginas
Paginas
Algoritmo Comentario

No se puede implementar, pero es útil como punto de


Óptimo
comparación

NRU (No usadas recientemente) Una aproximación muy burda a LRU

FIFO (primera en entrar, primera en salir) Podría descartar paginas importantes

Segunda oportunidad Gran mejora sobre FIFO

Reloj Realista

LRU (menos usadas recientemente) Excelente, pero difícil de implementar con exactitud

NFU (no utilizadas frecuentemente) Aproximación a LRU burda

Envejecimiento Algoritmo eficiente que se aproxima bien a LRU

Conjunto de trabajo Muy costoso de implementar

WSClock Algoritmo eficientemente bueno


El
El OS
OS en
en la
la Paginación
Paginación
Hay cuatro ocasiones en las que el OS tiene que realizar trabajo relacionado con la paginación: al
crear un proceso, al ejecutar un proceso, al ocurrir un fallo de página y al terminar un proceso.
Cuando se crea un proceso el OS tiene que determinar qué tan grandes serán el programa y los
datos (al principio), y crear una tabla de páginas para ellos. Se debe asignar espacio en memoria
para la tabla de páginas y se tiene que inicializar. La tabla de páginas no necesita estar residente
cuando el proceso se intercambia hacia fuera, pero tiene que estar en memoria cuando el proceso
se está ejecutando. Además, se debe asignar espacio en el área de intercambio en el disco, para
que cuando se intercambie una página, tenga un lugar a donde ir. El área de intercambio también
se tiene que inicializar con el texto del programa y los datos, para que cuando el nuevo proceso
empiece a recibir fallos de página, las páginas se puedan traer. Algunos sistemas paginan el texto
del programa directamente del archivo ejecutable, con lo cual se ahorra espacio en disco y tiempo
de inicialización. Por último, la información acerca de la tabla de páginas y el área de intercambio
en el disco se debe registrar en la tabla de procesos.
Cuando un proceso se planifica para ejecución, la MMU se tiene que restablecer para el nuevo
proceso y el TLB se vacía para deshacerse de los restos del proceso anterior. La tabla de páginas
del nuevo proceso se tiene que actualizar, por lo general copiándola o con un apuntador hacia
cierto(s) registro(s) de hardware. De manera opcional, algunas páginas del proceso se pueden
traer a memoria para reducir el número de fallos de página al principio.
El
El OS
OS en
en la
la Paginación
Paginación
Cuando ocurre un fallo de página, el sistema operativo tiene que leer los registros de hardware
para determinar cuál dirección virtual produjo el fallo. Con base en esta información debe calcular
qué página se necesita y localizarla en el disco. Después debe buscar un marco de página
disponible para colocar la nueva página, desalojando alguna página anterior si es necesario.
Luego debe leer la página necesaria y colocarla en el marco de páginas. Por último, debe
respaldar el contador de programa para hacer que apunte a la instrucción que falló y dejar que la
instrucción se ejecute de nuevo.
Cuando un programa hace referencia a una página que no está en memoria, la instrucción que
produjo el fallo se detiene parcialmente y ocurre un trap al sistema operativo. Una vez que el
sistema operativo obtiene la página necesaria, debe reiniciar la instrucción que produjo el trap.
Cuando un proceso termina, el sistema operativo debe liberar su tabla de páginas, sus páginas y
el espacio en disco que ocupan las páginas cuando están en disco. Si alguna de las páginas están
compartidas con otros procesos, las páginas en memoria y en disco sólo pueden liberarse cuando
el último proceso que las utilice haya terminado.
Manejo
Manejo de
de Fallos
Fallos de
de Pagina
Pagina
Que ocurre en un fallo de página? La secuencia de eventos es la siguiente:
1. El hardware hace un trap al kernel, guardando el contador de programa en la pila. En la mayor
parte de las máquinas, se guarda cierta información acerca del estado de la instrucción actual en
registros especiales de la CPU.
2. Se inicia una rutina en código ensamblador para guardar los registros generales y demás
información volátil, para evitar que el sistema operativo la destruya. Esta rutina llama al sistema
operativo como un procedimiento.
3. El sistema operativo descubre que ha ocurrido un fallo de página y trata de descubrir cuál
página virtual se necesita. A menudo, uno de los registros de hardware contiene esta información.
De no ser así, el sistema operativo debe obtener el contador de programa, obtener la instrucción y
analizarla en software para averiguar lo que estaba haciendo cuando ocurrió el fallo.
4. Una vez que se conoce la dirección virtual que produjo el fallo, el sistema comprueba si esta
dirección es válida y si la protección es consistente con el acceso. De no ser así, el proceso recibe
una señal o es eliminado. Si la dirección es válida y no ha ocurrido un fallo de página, el sistema
comprueba si hay un marco de página disponible. Si no hay marcos disponibles, se ejecuta el
algoritmo de reemplazo de páginas para seleccionar una víctima.
Manejo
Manejo de
de Fallos
Fallos de
de Pagina
Pagina
5. Si el marco de página seleccionado está sucio, la página se planifica para transferirla al disco y
se realiza una conmutación de contexto, suspendiendo el proceso fallido y dejando que se ejecute
otro hasta que se haya completado la transferencia al disco. En cualquier caso, el marco se marca
como ocupado para evitar que se utilice para otro propósito.
6. Tan pronto como el marco de página esté limpio (ya sea de inmediato, o después de escribirlo
en el disco), el sistema operativo busca la dirección de disco en donde se encuentra la página
necesaria, y planifica una operación de disco para llevarla a memoria. Mientras se está cargando
la página, el proceso fallido sigue suspendido y se ejecuta otro proceso de usuario, si hay uno
disponible.
7. Cuando la interrupción de disco indica que la página ha llegado, las tablas de páginas se
actualizan para reflejar su posición y el marco se marca como en estado normal.
8. La instrucción fallida se respalda al estado en que tenía cuando empezó, y el contador de
programa se restablece para apuntar a esa instrucción.
9. El proceso fallido se planifica y el Os regresa a la rutina (en ensamblador) que lo llamó.
10. Esta rutina recarga los registros y demás información de estado, regresando al espacio de
usuario para continuar la ejecución, como si no hubiera ocurrido el fallo.
Almacén
Almacén de
de respaldo
respaldo
Cuando se pagina hacia fuera de la memoria existen algoritmos con respecto a dónde se coloca
en el disco
El algoritmo más simple para asignar espacio de página en el disco es tener una partición de
intercambio especial en el disco o aún mejor es tenerla en un disco separado del sistema
operativo (para balancear la carga de I/O). La mayor parte de los sistemas UNIX funcionan así.
Esta partición no tiene un sistema de archivos normal, lo cual elimina la sobrecarga de convertir
desplazamientos en archivos a direcciones de bloque. En vez de ello, se utilizan números de
bloque relativos al inicio de la partición.
Cuando se inicia el sistema, esta partición de intercambio está vacía y se representa en memoria
como una sola entrada que proporciona su origen y tamaño. En el esquema más simple, cuando
se inicia el primer proceso, se reserva un trozo del área de la partición del tamaño del primer
proceso y se reduce el área restante por esa cantidad. A medida que se inician nuevos procesos,
se les asigna trozos de la partición de intercambio con un tamaño equivalente al de sus imágenes
de núcleo. Al terminar, se libera su espacio en disco. La partición de intercambio se administra
como una lista de trozos libres.
Con cada proceso está asociada la dirección de disco de su área de intercambio; es decir, en qué
rte de la partición de intercambio se mantiene su imagen.
Almacén
Almacén de
de respaldo
respaldo
El cálculo de la dirección en la que se va a escribir una página es simple: sólo se suma el
desplazamiento de la página dentro del espacio de direcciones virtual al inicio del área de
intercambio. Sin embargo, antes de que un proceso pueda empezar se debe inicializar el área de
intercambio. Una forma de hacerlo es copiar toda la imagen del proceso al área de intercambio, de
manera que se pueda traer y colocar en la memoria según sea necesario. La otra es cargar todo el
proceso en memoria y dejar que se pagine hacia fuera según sea necesario.
Sin embargo, este simple modelo tiene un problema: los procesos pueden incrementar su tamaño
antes de empezar. Aunque el texto del programa por lo general es fijo, el área de los datos puede
crecer algunas veces, y la pila siempre puede crecer. En consecuencia, podría ser mejor reservar
áreas de intercambio separadas para el texto, los datos y la pila, permitiendo que cada una de
estas áreas consista de más de un trozo en el disco.
El otro extremo es no asignar nada por adelantado y asignar espacio en el disco para cada página
cuando ésta se intercambie hacia fuera de la memoria y desasignarlo cuando se vuelva a
intercambiar hacia la memoria. De esta forma, los procesos en memoria no acaparan espacio de
intercambio. La desventaja es que se necesita una dirección de disco en la memoria para llevar la
cuenta de cada página en el disco. En otras palabras, debe haber una tabla por cada proceso que
indique en dónde se encuentra cada página en el disco.
Almacén
Almacén de
de respaldo
respaldo
El área de intercambio en el disco es tan grande como el espacio de direcciones virtuales del
proceso (ocho páginas), donde cada página tiene una ubicación fija a la cual se escribe cuando se
desaloja de la memoria principal. Para calcular esta dirección sólo se requiere saber dónde
empieza el área de paginación del proceso, ya que las páginas se almacenan en ella de manera
contigua, ordenadas por su número de página virtual. Una página que está en memoria siempre
tiene una copia sombra en el disco, pero esta copia puede estar obsoleta si la página se modificó
después de haberla cargado.
No siempre es posible tener una partición de intercambio fija. Por ejemplo, tal vez no haya
particiones de disco disponibles. En este caso se pueden utilizar uno o más archivos previamente
asignados dentro del sistema de archivos normal. MS Windows utiliza este método. Sin embargo,
aquí se puede utilizar una optimización para reducir la cantidad de espacio en disco necesaria.
Como el texto del programa de cada proceso proviene de algún archivo (ejecutable) en el sistema
de archivos, este archivo ejecutable se puede utilizar como el área de intercambio. Mejor aún, ya
que el texto del programa generalmente es de sólo lectura, cuando la memoria es escasa y se
tienen que desalojar páginas del programa de la memoria, sólo se descartan y se vuelven a leer
del archivo ejecutable cuando se necesiten. Las bibliotecas compartidas también pueden trabajar
de esta forma.
Segmentación
Segmentación con
con Memoria
Memoria Virtual
Virtual
La segmentación permite al programador ver la memoria como si se tratase de diferentes espacios
de direcciones o segmentos. Los segmentos pueden ser de tamaños diferentes, en realidad de
tamaño dinámico. Una referencia a la memoria consiste en un formato de dirección del tipo
(número de segmento, desplazamiento).
Esta organización tiene un gran número de ventajas para el programador sobre los espacios de
direcciones no segmentados:
1) Simplifica el tratamiento de estructuras de datos que pueden crecer. Si el programador no
conoce a priori el tamaño que una estructura de datos en particular puede alcanzar es necesario
hacer una estimación salvo que se utilicen tamaños de segmento dinámicos. Con la memoria
virtual segmentada, a una estructura de datos se le puede asignar su propio segmento, y el OS
expandirá o reducirá el segmento bajo demanda. Si un segmento que necesita expandirse se
encuentre en la memoria principal y no hay suficiente tamaño, el OS podrá mover el segmento a
un área de la memoria principal mayor, si se encuentra disponible, o enviarlo a swap. En este
último caso el segmento al que se ha incrementado el tamaño volverá a la memoria principal en
la siguiente oportunidad que tenga.
2) Permite programas que se modifican o recopilan de forma independiente, sin requerir que el
conjunto completo de programas se re-enlacen y se vuelvan a cargar. De nuevo, esta posibilidad
se puede articular por medio de la utilización de múltiples segmentos.
Segmentación
Segmentación con
con Memoria
Memoria Virtual
Virtual
3) Da soporte a la compartición entre procesos. El programador puede situar un programa de
utilidad o una tabla de datos que resulte útil en un segmento al que pueda hacerse referencia
desde otros procesos.
4) Soporta los mecanismos de protección. Esto es debido a que un segmento puede definirse para
contener un conjunto de programas o datos bien descritos, el programador o el administrador de
sistemas puede asignar privilegios de acceso de una forma apropiada.
Cada proceso tiene su propia tabla de segmentos, y cuando todos estos segmentos se han
cargado en la memoria principal, la tabla de segmentos del proceso se crea y se carga también en
la memoria principal. Cada entrada de la tabla de segmentos contiene la dirección de comienzo
del correspondiente segmento en la memoria principal, así como la longitud del mismo.
Debido a que sólo algunos de los segmentos del proceso pueden encontrarse en la memoria
principal, se necesita un bit en cada entrada de la tabla de segmentos para indicar si el
correspondiente segmento se encuentra presente en la memoria principal o no.
Otro bit de control es el bit de modificado, que indica si los contenidos del segmento
correspondiente se han modificado desde que se cargó por última vez en la memoria principal. Si
no hay ningún cambio, no es necesario escribir el segmento cuando se reemplace de la memoria
principal. También pueden darse otros bits de control. Por ejemplo, si la gestión de protección y
compartición se gestiona a nivel de segmento.
Segmentación
Segmentación con
con Memoria
Memoria Virtual
Virtual
El mecanismo básico para la lectura de una palabra de memoria implica la traducción de una dirección virtual, o lógica,
consistente en un número de segmento y un desplazamiento, en una dirección física, usando la tabla de segmentos.
Debido a que la tabla de segmentos es de tamaño variable, dependiendo del tamaño del proceso, no se puede suponer
que se encuentra almacenada en un registro. En su lugar, debe encontrarse en la memoria principal para poder
accederse.
Dirección Virtual Dirección física
Nro segmento Desplazamiento d
1 Base + d

desplaza
Registro miento
Puntero tabla Segmento
de segmentos
n bits

Tabla de segmentos
1

Longitud | Base

Memoria Principal
Programa Mecanismo de segmentación
Bibliografía
Bibliografía &
& Licencia
Licencia
1) Tanenbaum, A. y Bos, H. (2015). Modern Operating Systems, 4th. Ed.​Pearson.
2) Stallings, W. (2018). Operating Systems Internals and Design Principles, 9th Ed. Pearson.
3) Silberschatz, A. Galvin, P. y Gagne G. (2018). Operating System Concepts, 10th Ed. Wiley.
4) Este documento se encuentra bajo Licencia Creative Commons 2.5 Argentina (BY-NC-SA),
por la cual se permite su exhibición, distribución, copia y posibilita hacer obras derivadas a
partir de la misma, siempre y cuando se cite la autoría del Prof. Matías E. García y sólo
podrá distribuir la obra derivada resultante bajo una licencia idéntica a ésta.
5) Autor:

Matías E. García
.
Prof. & Tec. en Informática Aplicada
www.profmatiasgarcia.com.ar
[email protected]

También podría gustarte