Вы находитесь на странице: 1из 46

1 Funciones y operaciones del administrador de memoria

El nico espacio de almacenamiento que el procesador puede utilizar


directamente, ms all de los registros (que si bien le son internos y sumamente
rpidos, pero de capacidad muy escasa) es la memoria fsica. Todas las
arquitecturas de procesador tienen instrucciones para interactuar con la memoria,
pero ninguna lo tiene para hacerlo con medios persistentes de almacenamiento,
como las unidades de disco. Cabe mencionar que cuando veamos en un texto
referencia al almacenamiento primario siempre se referir a la memoria, mientras
que el almacenamiento secundario se refiere a los discos u otros medios de
almacenamiento persistente.
Todos los programas que deseemos ejecutar deben cargarse a la memoria del
sistema antes de ser utilizados. En esta unidad veremos cmo administra el
sistema operativo a la memoria para permitir que varios procesos la compartan
Esta tarea debe preverse desde el proceso de compilacin de nuestros programas
(en particular, la fase de ligado). Hoy en da, adems, casi todos los sistemas
operativos emplean implementaciones que requieren de hardware especializado
La Unidad de Manejo de Memoria (MMU). Hablaremos de cmo se manejaban
los sistemas multitarea antes de la universalizacin de los MMU, y qu rol juegan
hoy en da.
En esta primer seccin, veremos algunos conceptos base que iremos hilando y
empleando en las secciones subsecuentes.
1.1 Espacio de direccionamiento
La memoria est estructurada como un arreglo direccionable de bytes. Esto es, al
solicitar los contenidos de una direccin especfica de memoria, el hardware nos
entregar un byte (8 bits), y no menos. Si queremos hacer una operacin sobre
bits especficos, tenemos que solicitar y almacenar bytes enteros. En algunas
arquitecturas, el tamao de palabra es mayor Por ejemplo, los procesadores
Alpha incurran en fallas de alineacin si se solicitaba una direccin de memoria
no alineada a 64 bits, y toda llamada a direcciones mal alineadas tena que ser
atrapada por el sistema operativo, re-alineada, y entregada.
Un procesador que soporta un espacio de direccionamiento de 16 bits puede
referirse directamente a hasta $2^{16}$ bytes, esto es, a hasta 65,536 bytes (64K).
Estos procesadores fueron comunes en las dcadas de 1970 y 1980 Los ms
conocidos incluyen al Intel 8080 y 8085, Zilog Z80, MOS 6502 y 6510, y Motorola
6800. Hay que recalcar que estos procesadores son reconocidos como
procesadores de 8 bits, pero con espacio de direccionamiento de 16 bits. El
procesador empleado en las primeras PC, el Intel 8086, manejaba un

direccionamiento de 20 bits (hasta 1024KB), pero al ser una arquitectura real de


16 bits requera del empleo de segmentacin para alcanzar toda su memoria.
Hoy en da, los procesadores dominantes son de 32 o 64 bits. Un procesador de
32 bits puede direccionar hasta 4,294,967,296 bytes (4GB), que est ya dentro de
los parmetros de lo esperable hoy en da; una arquitectura de 32 bits sin
extensiones adicionales no puede emplear ms de 4GB RAM; a travs de un
mecanismo llamado PAE (Extensin de Direccines Fsicas, Physical Address
Extension) permite extender esto a rangos de hasta $2^{52}$ a cambio de un nivel
ms de indireccin.
Un procesador de 64 bits podra direccionar hasta 18,446,744,073,709,551,616
bytes (16 Exabytes). Los procesadores comercialmente hoy en da no ofrecen esta
capacidad de direccionamiento principalmente por un criterio econmico: Al
resultar tan poco probable que exista un sistema con estas capacidades, los chips
actuales estn limitados a entre $2^{40}$ y $2^{48}$ bits 1 y 256 terabytes.
Esta restriccin debe seguir teniendo sentido econmico por muchos aos an.
1.2 Hardware: de la unidad de manejo de memoria (MMU)
A lo largo de la historia de las computadoras ha sido necesario emplear ms
memoria de la que est directamente disponible Por un lado, ofrecer a los
procesos ms espacio de lo que puede direccionar la arquitectura (hardware) que
empleamos, por otro lado la abstraccin de un espacio virtualmente ilimitado para
realizar sus operaciones incluso cuando la memoria real es mucho menor a la
solicitada, y por ltimo, la ilusin de tener un bloque contiguo e ininterrumpido de
memoria, cuando en realidad puede haber alta fragmentacin.
Veremos cmo es que el MMU cubre estas necesidades, qu mecanismos emplea
para lograrlo Y qu debemos cuidar, incluso como programadores de
aplicaciones de alto nivel, para aprovechar de la mejor manera estas funciones (y
evitar, por el contrario, que nuestros programas se vuelvan lentos por no saber
manejar la memoria) correctamente.
El MMU es tambin el encargado de verificar que un proceso no tenga acceso a
leer o modificar los datos de otro Si el sistema operativo tuviera que verificar
que ninguna de las instrucciones ejecutadas por un programa resulta en una
violacin de seguridad, la penalizacin en velocidad sera demasiado severa2.
Una primer aproximacin a la proteccin de acceso es a travs de un registro base
y un registro lmite: Si la arquitectura ofrece dos registros del procesador que slo
pueden ser modificados por el sistema operativo (Esto es, el hardware define la
modificacin de dichos registros como una operacin privilegiada que requiere

estar ejecutando en modo supervisor), el MMU puede comparar cada acceso a


memoria para verificar que est en el rango permitido.
Por ejemplo, si a un proceso le fue asignado un espacio de memoria de 64K
(65535 bytes) a partir de la direccin 504214 (492K), el registro base contendra
504214, y el registro lmite 65535. Si hubiera una instruccin por parte de dicho
proceso que solicitara una direccin menor a 504214 o mayor a 569749 (556K), el
MMU lanzara una excepcin o trampa interrumpiendo el procesamiento, e
indicando al sistema operativo que ocurri una violacin de segmento
(segmentation fault)3. El sistema operativo entonces procedera terminando la
ejecucin del proceso, reclamando todos los recursos que tuviera asignados y
notificando a su usuario.

Espacio de direcciones vlidas para el proceso 3 definido por un registro base y un


registro lmite
1.3 La memoria cach
Hay otro proceso que hoy en da asumimos como un hecho: La memoria cach. Si
bien su manejo es (casi) transparente para el sistema operativo, es muy
importante mantenerlo en mente.
Conforme el procesador va avanzando sobre las instrucciones de un programa
(avanzando el registro de conteo de instruccin), se van produciendo accesos a
memoria. Por un lado, tiene que buscar en memoria la siguiente instruccin a
ejecutar. Por otro lado, estas instrucciones pueden requerirle uno o ms
operadores adicionales que deben ser trados de la memoria. Por ltimo, la
instruccin puede requerir guardar su resultado en cierta direccin de memoria.

Hace aos esto no era un problema La velocidad del procesador estaba


bsicamente sincronizada con la del manejador de memoria, y el flujo poda
mantenerse bsicamente estable. Pero conforme los procesadores se fueron
haciendo ms rpido, y conforme se ha popularizado el procesamiento en
paralelo, la memoria no ha podido acelerarse a la misma velocidad. La memoria
de alta velocidad es demasiado cara, e incluso las distancias de unos pocos
centmetros se van volviendo obstculos insalvables por la velocidad mxima de
los electrones viajando por pistas conductoras.
Cuando el procesador solicit el contenido de una direccin de memoria y esta no
est an disponible, tiene que detener su ejecucin (stall) hasta que los datos
estn disponibles. El CPU no puede, a diferencia del sistema operativo, "congelar"
todo y guardar el estado para atender a otro proceso: Para el procesador, la lista
de instrucciones a ejecutar es estrictamente secuencial, y todo tiempo que
requiere esperar a una transferencia de datos es tiempo perdido.
La respuesta para reducir esa espera es la memoria cach. Esta es memoria de
alta velocidad, situada entre la memoria principal y el procesador propiamente,
que guarda copias de las pginas que van siendo accesadas, partiendo del
principio de la localidad de referencia:
Localidad temporal
Es probable que un recurso que fue empleado recientemente vuelva a ser
empleado en un futuro cercano.
Localidad espacial
La probabilidad de que un recurso an no requerido sea accesado es mucho
mayor si fue requerido algn recurso cercano.
Localidad secuencial
Un recurso, y muy particularmente la memoria, tiende a ser requerido de forma
secuencial.

Patrones de acceso a memoria, demostrando la localidad espacial / temporal


(Silberschatz, p.350)
Basndonos en estos conceptos, vemos que cuando el procesador solicita al
hardware determinada direccin de memoria, el hardware no slo transfiere a la
memoria cach el byte o palabra solicitado, sino que un bloque o pgina completo.
Cabe mencionar que hoy en da (particularmente desde que se detuvo la guerra
de los Megahertz parte importante del diferencial en precios de los procesadores
lderes en el mercado es la cantidad de cache de primero y segundo nivel con que
cuentan.
1.4 El espacio en memoria de un proceso

Cuando un sistema operativo inicia un proceso, no se limita a volcar el archivo


ejecutable a memoria, sino que tiene que proveer la estructura para que ste vaya
guardando la informacin de estado relativa a su ejecucin.
Seccin de texto
Es el nombre que recibe la imagen en memoria de las instrucciones a ser
ejecutadas. Tpicamente, la seccin de texto ocupa las direcciones ms bajas del
espacio en memoria.
Seccin de datos
Espacio fijo preasignado para las variables globales. Este espacio es fijado en
tiempo de compilacin, y no puede cambiar (aunque los datos que carga s
cambian en el tiempo de vida del proceso)
Espacio de libres
(Heap) Espacio de memoria que se emplea para la asignacin dinmica de
memoria durante la ejecucin del proceso. Este espacio se ubica por encima de la
seccin de datos, y crece hacia arriba.
Cuando el programa es escrito en lenguajes que requieren manejo manual de la
memoria (como C), esta rea es la que se maneja a travs de las llamadas de la
familia de malloc y free; en lenguajes con gestin automtica, esta rea es
monitoreada por los recolectores de basura (volveremos a estos conceptos ms
adelante).
Pila de llamadas
(Stack) Estructuras representando a la serie de funciones que han sido llamadas
dentro del proceso, con sus parmetros, direcciones de retorno, variables locales,
etc. La pila ocupa la parte ms alta del espacio en memoria, y crece hacia abajo.

Regiones de la memoria para un proceso


1.5 Resolucin de direcciones
Un programa compilado no emplea nombres simblicos para las variables o
funciones que llama4; el compilador, al convertir el programa a lenguaje mquina,
las substituye por la direccin en memoria donde se encuentra.
Ahora bien, en los sistemas actuales, los procesos requieren coexistir con otros,
para lo cual las direcciones indicadas en el texto del programa pueden requerir ser
traducidas al lugar relativo al sitio de inicio del proceso en memoria Esto es,
resueltas. Podemos hablar de las siguientes tres estrategias de resolucin:
En tiempo de compilacin
El texto del programa tiene la direccin absoluta de los datos y funciones. Esto era
muy comn en las computadoras previas al multiprocesamiento; en la arquitectura
compatible con PC, el formato ejecutable .COM es un volcado de memoria directo
de un archivo objeto con las direcciones indicadas de forma absoluta. Esto lo
podemos ver hoy principalmente en sistemas embebidos o de funcin especfica.
En tiempo de carga
Al cargarse a memoria el programa y antes de iniciar su ejecucin, el cargador
(componente del sistema operativo) actualiza las referncias a memoria dentro del
texto para que apunten al lugar correcto Claro est, esto depende de que el
compilador indique dnde estn todas las referencias a variables y funciones.
En tiempo de ejecucin

El programa nunca hace referencia a una ubicacin absoluta de memoria, sino


que lo hace siempre relativo a una base y un desplazamiento (offset). Esto permite
que el proceso sea incluso reubicado en la memoria mientras est siendo
ejecutado sin tener que sufrir cambios, pero requiere de hardware especfico
(como un MMU).
Esto es, los nombres simblicos (por ejemplo, la variable llamada contador) para
ser traducidos ya sea a ubicaciones en la memoria, pueden resolverse en tiempo
de compilacin (y quedar plasmada en el programa en disco con una ubicacin
explcita y definitiva: 510200), en tiempo de carga (sera guardada en el programa
en disco como inicio + 5986 bytes, y el proceso de carga incluira substituirla por la
direccin resuelta a la suma del registro base, 504214, y el desplazamiento, 5986,
esto es, 510200).
Por ltimo, para emplear la resolucin en tiempo de ejecucin, se mantiene en las
instrucciones a ser ejecutadas por el proceso la etiqueta relativa al mdulo actual,
inicio + 5986 bytes, y es resuelta cada vez que sea requerido.

Proceso de compilacin y carga de un programa, indicando el tipo de resolucin


de direcciones (Silberschatz, p.281)

2 Asignacin de memoria contigua


En los sistemas de ejecucin en lotes, as como en las primeras computadoras
personales, slo un programa se ejecutaba a la vez, por lo que, ms all de la
carga del programa y la satisfaccin de alguna eventual llamada al sistema
solicitando recursos, el sistema operativo no tena que ocuparse de la asignacin
de memoria.
Al nacer los primeros sistemas operativos multitarea, se hizo necesario resolver
cmo asignar el espacio en memoria a diferentes procesos.
2.1 Particin de la memoria
La primer respuesta, claro est, es la ms sencilla: Asignar a cada programa a ser
ejecutado un bloque contiguo de memoria de un tamao fijo. En tanto los
programas permitieran la resolucin de direcciones en tiempo de carga o de
ejecucin, podran emplear este esquema.
El sistema operativo empleara una regin especfica de la memoria del sistema
(tpicamente la regin baja Desde la direccin en memoria 0x00000000 hacia
arriba), y una vez terminado el espacio necesario para el ncleo y sus estructuras,
el sistema asigna espacio a cada uno de los procesos. Si la arquitectura en
cuestin permite limitar los segmentos disponibles a cada uno de los procesos
(por ejemplo, con los registros base y lmite discutidos anteriormente), esto sera
suficiente para alojar en memoria a varios procesos y evitar que interfieran entre
s.
Desde la perspectiva del sistema operativo, cada uno de los espacios asignados a
un proceso es una particin. Cuando el sistema operativo inicia, toda la memoria
disponible es vista como un slo bloque, y conforme se van lanzando procesos,
este bloque va siendo subdividido para satisfacer sus requisitos. Cada proceso
debe indicar al sistema operativo cunta memoria va a requerir a lo largo de su
vida prevista.
2.1.1 Fragmentacin
La fragmentacin comienza a aparecer cuando ms procesos van siendo lanzados
y van terminando: Al terminar la ejecucin de un proceso, ya no tenemos slo un
bloque de espacio libre, sino dos. Potencialmente, cada programa que vaya
terminando, ir devolviendo al sistema operativo un bloque de distinto tamao, que
quede entre dos procesos activos.
Si la computadora no tiene hardware especfico que permita que los procesos
resuelvan sus direcciones en tiempo de ejecucin, el sistema operativo no puede

reasignar los bloques existentes, y aunque pudiera hacerlo, mover un proceso


entero en memoria puede resultar una operacin cara en tiempo de
procesamiento.
Al lanzarse un nuevo programa, el sistema operativo tiene tres estrategias segn
las cuales podra asignarle uno de los bloques disponibles:
Primer ajuste
Asigna al nuevo proceso el primer bloque que encuentre donde ste quepa. Este
mecanismo es el ms simple de implementar y el de ms rpida ejecucin.
Mejor ajuste
El sistema busca entre todos los bloques disponibles cul es el que mejor se
ajusta al tamao requerido por el nuevo proceso. Esto requiere la revisin
completa de la lista de bloques; lleva a que los bloques remanentes, una vez que
se ubic al nuevo proceso, sean tan pequeos como sea posible (esto es, que
haya menor desperdicio).
Peor ajuste
El sistema busca cul es el bloque ms grande disponible, y se lo asigna al nuevo
proceso. Empleando una estrucura de datos como un montculo, esta operacin
puede ser incluso ms rpida que la de primer espacio. Con este mecanismo se
busca que los bloques que queden despus de otorgarlos a un proceso sean tan
grandes como sea posible, de cierto modo balanceando su tamao.
La fragmentacin externa se produce cuando hay muchos bloques libres entre
bloques asignados a procesos; la fragmentacin interna se refiere a la cantidad de
memoria perdida por asuntos administrativos Por ejemplo, si el sistema
operativo maneja bloques de 512 bytes y un proceso requiere 768 bytes para su
ejecucin, el sistema le entregar dos bloques (1024 bytes), con lo cual
desperdicia 256. En el peor de los casos, con un bloque de $n$ bytes, un proceso
podra solicitar $kn+1$ bytes de memoria, desperdiciando por fragmentacin
interna $n-1$ bytes.
Segn anlisis estadsticos (Silberschatz, p.289), por cada N bloques asignados,
se perdern del rden de 0.5N bloques por fragmentacin interna y externa.
2.1.2 Compactacin

Un problema importante que va surgiendo como resultado de esta fragmentacin


es que el espacio total libre de memoria puede ser mucho mayor que lo que
requiere un nuevo proceso, pero al estar fragmentada en muchos bloques, ste no
encontrar una particin donde ser cargado.
Si los procesos emplean resolucin de direcciones en tiempo de ejecucin,
cuando el sistema operativo comience a detectar un alto ndice de fragmentacin,
puede lanzar una operacin de compresin o compactacin: Mover los contenidos
en memoria de los procesos en ejecucin para que ocupen espacios contiguos,
permitiendo unificar varios bloques libres en uno solo.

Compactacin de la memoria de procesos en ejecucin


La compactacin tiene un costo alto Involucra mover prcticamente la totalidad
de la memoria (probablemente ms de una vez por bloque).
2.1.3 Intercambio (swap) con el almacenamiento secundario
Siguiendo de cierto modo la lgica requerida por la compactacin encontramos los
sistemas que utilizan intercambio (swap) entre la memoria primaria y secundaria.
En estos sistemas, el sistema operativo puede comprometer ms espacio de
memoria del que tiene fsicamente disponible. Cuando hay ms procesos de los
que caben en memoria, el sistema suspende a uno de ellos y almacena una copia
de su imagen en memoria en almacenamiento secundario.

Hay algunas restricciones a observar previo a suspender un proceso. Un proceso


que tiene abierto alguna operacin de entrada/salida en curso. Una estrategia ante
esto podra ser que todas las operaciones se realicen nicamente a buffers en el
espacio del sistema operativo y ste las transfiera al espacio del proceso
interesado.
Esta tcnica se populariz en los sistemas de escritorio hacia fines de los 1980 y
principios de los 1990, en que las computadoras personales tenan tpicamente
entre 1 y 8MB de memoria.
Recordemos que las unidades de disco son del rden de decenas de miles de
veces ms lentas que la memoria, por lo que este proceso resulta muy caro Por
ejemplo, si la imagen en memoria de un proceso es de 100MB, bastante
conservador hoy en da, y la tasa de transferencia sostenida al disco de 50MB/s,
intercambiar un proceso al disco toma dos segundos. Cargarlo de vuelta a
memoria toma otros dos segundos Y a esto debe sumarse el tiempo de
posicionamiento de la cabeza de lectura/escritura, especialmente si el espacio a
emplear no es secuencial y contiguo. Resulta obvio por qu esta tcnica ha cado
en desuso conforme aumenta el tamao de los procesos.
3 Segmentacin
Al desarrollar un programa, el programador no ve a la memoria como un slo
arreglo plano, en el que todas las direcciones son iguales (si bien est consciente
de que la realidad es as). El uso que damos a la memoria sigue una lgica de
distintos segmentos: En vez de dar una direccin lineal, damos al procesador una
direccin de segmento y un desplazamiento dentro de dicho segmento. Podemos
tener segmentos de distintos tamaos presentes en memoria, y la resolucin de
direcciones de cada uno de ellos se realizar por mecanismos anlogos al descrito
en el apartado anterior (registro base y desplazamiento). Claro est, esto debe
tambin hacerse con apoyo del MMU.

Ejemplo de segmentacin
Una de las implementaciones ms obvias y directas de un espacio de memoria
segmentado es asignar un segmento distinto a cada una de las secciones
mencionadas en la seccin espacio en memoria de un proceso.
La segmentacin tambin ayuda a incrementar la modularidad de un programa: Es
muy comn que las bibliotecas ligadas dinmicamente estn representadas en
segmentos independientes.
3.1 Permisos
Una de las principales ventajas del uso de segmentacin es que nos permite pedir
al MMU que cada uno de los segmentos tenga un distinto juego de permisos para
el proceso en cuestn: El sistema operativo puede indicar, por ejemplo, que el
segmento de texto (el cdigo del programa) sea de lectura y ejecucin, mientras
que la secin de datos es de lectura y escritura. De este modo podemos evitar que
un error en la programacin resulte en que datos proporcionados por el usuario o
por el entorno modifiquen el cdigo que est siendo ejecutado.5 Es ms, Incluso,
dado que el acceso de ejecucin est limitado a slo los segmentos cargados del
disco por el sistema operativo, el atacante no podr introducir cdigo ejecutable
tan fcilmente Tendra que cargarlo como un segmento adicional con los
permisos correspondientes.
3.2 Intercambio parcial

Un uso muy comn de la segmentacin, particularmnete en los sistemas de los


1980s, era el de permitir que slo ciertas regiones de un programa sean
intercambiadas al disco: Si un programa est compuesto por porciones de cdigo
que nunca se ejecutarn aproximadamente al mismo tiempo en sucesin, puede
separar su texto (e incluso los datos correspondientes) en diferentes segmentos.

A lo largo de la ejecucin del programa, algunos de sus segmentos pueden no


emplearse por largos periodos de tiempo. Estas pginas pueden ser enviadas al
espacio de intercambio (swap) ya sea a solicitud del proceso o por iniciativa del
sistema operativo.

3.2.1 Rendimiento
En la seccin donde presentamos el concepto de intercambio mencionamos que
intercambiar un proceso completo resultaba demasaido caro. Cuando hablamos
de un espacio de memoria segmentado, y muy particularmente cuando hablamos
de bibliotecas de carga dinmica, la sobrecarga es mucho menor:
En primer trmino, podemos hablar de la cantidad de informacin que
intercambiaremos: En un sistema que slo maneja regiones contiguas de
memoria, intercambiar un proceso significa mover toda su informacin al disco;
cuando hablamos de intercambio en un sistema con segmentacin, puede
enviarse a disco cada uno de los segmentos por separado, segn el sistema
operativo lo juzgue necesario. Podra sacar de memoria a alguno de los
segmentos, eligiendo no necesariamente al que ms estorbe (esto es, el ms
grande), sino el que ms probablemente no est siendo utilizado: Emplear el
principio de localidad de referencia para intercambiar al segmento menos
recientemente utilizado (LRU, Least Recently Used).
Adems de esto, si hablamos de un segmento de texto (sea el cdigo programa
base o alguna de las bibliotecas) y su acceso es de slo lectura, una vez que ste
fue copiado una vez al disco, ya no hace falta volver a hacerlo: Tenemos la certeza
de que no ser modificado por el proceso en ejecucin, por lo que basta marcarlo
como no presente en las tablas de segmentos en memoria para que cualquier
acceso ocasione que el sistema operativo lo traiga de disco.
Por otro lado, si la biblioteca en cuestin reside en disco (antes de ser cargada)
como una imagen directa de su representacin en memoria, al sistema operativo
le bastar identificar el archivo en cuestin al cargar el proceso; no hace falta

siquiera cargarlo en la memoria principal y guardarlo al rea de intercambio, puede


quedar referido directamente al espacio en disco en que reside el archivo.
Claro est, el acceso a disco sigue siendo una fuerte penalizacin cada vez que
un segmento tiene que ser cargado del disco (sea del sistema de archivos o del
espacio de intercambio), pero este mecanismo reduce dicha penalizacin,
haciendo ms atractiva la flexibilidad del intercambio por segmentos.
3.3 Ejemplificando
A modo de ejemplo (Finkel, p.79), y conjuntando los conceptos presentados en
esta seccin, si un proceso tuviera la siguiente tabla de segmentos:
Segmento

Inicio

Tamao

13426

Permisos

Presente

26 RWX

2309

00 R

1000

23 WX

95 W

no

10000

100 RWX

En la columna de permisos, R se refiere a lectura, W a escritura y X a ejecucin.


Un segmento que ha sido enviado al espacio de intercambio (en este caso, el 3),
deja de estar presente en memoria y, por tanto, no tiene ya direccin de inicio
registrada.
Veamos el resultado de entregar al MMU las siguientes direcciones y tipos de
acceso:
Direccin

Tipo de

Direccin

virtual

acceso

fsica

0-0 R

13426

2-17 W

1017

2-17 R

Atrapada: Violacin de seguridad

2-32 R

Atrapada: Desplazamiento fuera de rango

Direccin

Tipo de

Direccin

virtual

acceso

fsica

3-72 W

Atrapada: Segmento faltante

3-94 R

Atrapada: Segmento faltante;


violacin de seguridad

4-99 X

10099

7-25 X

Atrapada: Segmento invalido

Cuando se atrapa una situacin de excepcin, el sistema operativo debe


intervenir. Por ejemplo, la solicitud de un segmento invlido, de un desplazamiento
mayor al tamao del segmento, o de un tipo de acceso que no est autorizado,
tpicamente llevan a la terminacin del proceso, en tanto que una de segmento
faltante (indicando un segmento que est en el espacio de intercambio) llevara a
la suspensin del proceso, lectura del segmento de disco a memoria, y una vez
que ste estuviera listo, se permitira continuacin de la ejecucin.
En caso de haber ms de una excepcin, como podemos verlo en la solicitud de
lectura de la direccin 3-94, el sistema debe reaccionar primero a la ms severa:
Si como resultado de esa solicitud iniciara el proceso de carga del segmento, slo
para abortar la ejecucin del proceso al detectarse la violacin de tipo de acceso,
sera un desperdicio injustificado de recursos.
4 Paginacin
La fragmentacin externa y, por tanto, la necesidad de compactacin pueden
evitarse por completo empleando la paginacin. Esta consiste en que cada
proceso est compuesto por una serie de pginas, dejando de requerir que la
asignacin sea de un rea contigua de memoria. Claro est, esto requiere de
mayor espacializacin por parte del hardware, y mayor informacin relacionada a
cada uno de los procesos: No nos basta ya con indicar dnde inicia y dnde
termina el rea de memoria de cada proceso, sino que debemos hacer un mapeo
entre la ubicacin real (fsica) y la presentada a cada uno de los procesos (lgica).
La memoria se presentar a cada proceso como si fuera de su uso exclusivo.
La memoria fsica se divide en una serie de marcos (frames), todos ellos del
mismo tamao, y el espacio cada proceso se divide en una serie de pginas
(pages), del mismo tamao que los marcos. El MMU se se encarga del mapeo

entre pginas y marcos a travs de tablas de pginas. Las direcciones que maneja
el CPU ya no son presentadas de forma absoluta, sino que como la combinacin
de un identificador de pgina y un desplazamiento De forma similar a lo que
presentamos al hablar de resolucin de instrucciones en tiempo de ejecucin.
El tamao de los marcos (y, por tanto, las pginas) debe ser una potencia de 2, de
modo que el MMU pueda discernir fcilmente la porcin de una direccin de
memoria que se refiere a la pgina del desplazamiento. El rango vara, segn el
hardware, entre los 512 bytes ($2^9$) y 16MB ($2^{24}$); al ser una potencia de
2, el MMU puede separar la direccin en memoria entre los primeros $m$ bits
(referentes a la pgina) y los ltimos $n$ bits (referentes al desplazamiento).

Pgina y desplazamiento, en un esquema de direccionamiento de 16 bits y


pginas de 512 bytes
Para poder realizar este mapeo, el MMU requiere de una tabla de pginas (page
table), que resuelve la relacin entre pginas y marcos, convirtiendo la direccin
lgica (aquella que conoce el proceso) en la direccin fsica (la ubicacin en que
realmente se encuentra en la memoria del sistema).

Esquema del proceso de paginacin, ilustrando el rol del MMU


Podemos tomar como ejemplo para explicar este mecanismo el esquema
presentado en el libro de Silberschatz, Galvin y Gagn. Este nos presenta un
esquema minsculo: Un espacio de direccionamiento de 32 bytes (5 bits),
organizado en 8 pginas de 4 bytes cada una (esto es, la pgina es representada
con los 3 bits ms significativos de la direccin, y el desplazamiento con los 2 bits
menos significativos).

Ejemplo (minsculo) de paginacin, con un espacio de direccionamiento de 32


bytes y pginas de 4 bytes
El proceso que se nos presenta tiene una visin de la memoria como la columna
del lado izquierdo: Le parece que existen 4 pginas, y tiene sus datos distribuidos
en rden desde la direccin 00000 (0) hasta la 01111 (15), aunque en realidad en
el sistema stas se encuentren desordenadas y desperdigadas.
Cuando el proceso quiere referirse a la letra f, lo hace indicando la direccin 00101
(5). De esta direccin, los tres bits ms significativos (001, 1 Y recordemos que
para la computadora, lo natural es comenzar a contar por el 0) se refieren a la
pgina nmero 1, y los dos bits menos significativos (01, 1) indican al
desplazamiento dentro de sta.

El MMU verifica en la tabla de pginas, y encuentra que la pgina 1 corresponde


al marco nmero 6 (110), por lo que traduce la direccin lgica 00101 (5) a la fsica
11001 (26).
Podemos ver que la paginacin resulta en una suerte de resolucin de direcciones
en tiempo de ejecucin, pero con una base distinta para cada una de las pginas.
4.1 Tamao de la pgina
Ahora, si bien la fragmentacin externa se resuelve al emplear paginacin,
seguiremos enfrentndonos con la fragmentacin interna: Al dividirse la memoria
en bloques de longitud preestablecida de $2^n$ bytes, un proceso en promedio
desperdiciar $\frac{2^n}{2}$ (y, en el peor de los casos, hasta $2^n - 1$).
Multiplicando esto por el nmero de procesos que estn en ejecucin en todo
momento en el sistema, para evitar que una proporcin sensible de la memoria se
pierda en fragmentacin interna, podramos vernos tentados a emplear un tamao
de pgina tan pequeo como fuera posible.
Sin embargo, la sobrecarga administrativa en que incurriramos por gestionar
demasiadas pginas pequeas se vuelve una limitante en sentido opuesto:
Las transferencias entre unidades de disco y memoria son mucho ms eficientes
si pueden mantenerse como trechos contnuos. El controlador de disco puede
responder a solicitudes de acceso directo a memoria (DMA) siempre que tanto los
fragmentos en disco como en memoria sean continuos; fragmentar la memoria
demasiado jugara en contra de la eficiencia de estas solicitudes.
El bloque de control de proceso (PCB) incluye la informacin de memoria. Entre
ms pginas tenga un proceso (aunque estas fueran muy pequeas), ms grande
es su PCB, y ms informacin requerir intercambiar en un cambio de contexto.
Estas consideraciones opuestas apuntan a que debemos mantener el tamao de
pgina ms grande, y se regulan con las primeras expuestas en esta seccin.
Hoy en da, el tamao habitual de las pginas es de 4KB u 8KB ($2^{12}$ o
$2^{13}$ bytes). Hay algunos sistemas operativos que soportan mltiples tamaos
de pgina Por ejemplo, Solaris puede emplear pginas de 8KB y 4MB
($2^{13}$ o $2^{22}$ bytes), dependiendo del tipo de informacin que se declare
que almacenarn.
4.2 Almacenamiento de la tabla de pginas

Algunos de los primeros equipos en manejar memoria paginada empleaban un


conjunto especial de registros para representar la tabla de pginas. Esto era
posible dado que eran sistemas de 16 bits, con pginas de 8KB ($213). Esto
significa que en el sistema haba nicamente 8 pginas posibles ($2^3$), por lo
que resultaba sensato dedicar un registro a cada una.

En los equipos actuales, mantener la tabla de pginas en registros resultara


claramente imposible: Teniendo un procesaador de 32 bits, e incluso si
manejramos un tamao de pgina muy grande (digamos, 4MB), tendramos 1024
pginas posibles6; con un tamao de pginas mucho ms comn (4KB, $2^{12}$
bytes), la tabla de pginas llega a ocupar 5MB.7 Los registros son muy rpidos,
sin embargo, son correspondientemente muy caros. El manejo de pginas ms
pequeas (que es lo normal), y muy especialmente el uso de espacios de
direccionamiento de 64 bits, haran prohibitivo este enfoque. Adems,
nuevamente, cada proceso tiene una tabla de pginas distinta Se hara
necesario hacer una transferencia de informacin muy grande en cada cambio de
contexto.

Otra estrategia para enfrentar esta situacin es almacenar la propia tabla de


pginas en memoria, y apuntar al inicio de la tabla con un juego de registros
especiales: el registro de base de la tabla de pginas (PTBR, Page Table Base
Register) y el registro de longitud de la tabla de pginas (PTLR, Page Table Length
Register),8 De esta manera, en el cambio de contexto slo hay que cambiar dos
registros, y adems tenemos un espacio muy amplio para poder guardar las tablas
de pginas que necesitemos. El problema con este mecanismo es la velocidad:
Estaramos penalizando a cada acceso a memoria con un acceso de memoria
adicional Si para resolver una direccin lgica a su correspondiente direccin
fsica hace fala consultar la tabla de pginas en memoria, el tiempo efectivo de
acceso a memoria se duplica.

4.2.1 El buffer de traduccin adelantada (TLB)

La salida obvia a este dilema es el uso de un cach. Sin embargo, ms que un


cach genrico, el MMU utiliza un cach especializado en el tipo de informacin
que maneja: El buffer de traduccin adelantada o anticipada (Translation
Lookaside Buffer, TLB). El TLB es una tabla asociativa (un hash) en memoria de

alta velocidad, una suerte de registros residentes dentro del MMU, donde las
llaves son las pginas y los valores son los marcos correspondientes. De este
modo, las bsquedas se efectan en tiempo constante.

El TLB tpicamente tiene entre 64 y 1024 entradas. Cuando el procesador efecta


un acceso a memoria, si la pgina solicitada est en el TLB, el MMU tiene la
direccin fsica de inmediato.9 En caso de no encontrarse la pgina en el TLB, el
MMU lanza un fallo de pgina (page fault), con lo cual consulta de la memoria
principal cul es el marco correspondiente. Esta nueva entrada es agregada al
TLB; por las propiedades de localidad de referencia que vimos anteriormente, la
probabilidad de que las regiones ms empleadas de la memoria durante un rea
especfica de ejecucin del programa sean cubiertas por relativamente pocas
entradas del TLB son muy altas.

Como sea, dado que el TLB es limitado, es necesario explicitar un mecanismo que
indique dnde guardar las nuevas entradas una vez que el TLB est lleno y se
produce un fallo de pgina. Uno de los esquemas ms comunes es emplear la
entrada menos recientemente utilizada (LRU, Least Recently Used), nuevamente
apelando a la localidad de referencia; esto tiene como consecuencia necesaria
que debe haber un mecanismo que contabilice los accesos dentro del TLB (lo cual
agrega tanto latencia como costo); otro mecanismo (con obvias desventajas) es el
reemplazar una pgina al azar. Veremos con mayor detalle ms adelante algunos
de los mecanismos ms empleados para este fin, comparando sus puntos a favor
y en contra.
4.2.2 Subdividiendo la tabla de pginas
Incluso empleando TLBs, el espacio empleado por las pginas sigue siendo
demasiado grande. Consideremos un escenario ms frecuente que el propuesto
anteriormente: Empleando un procesador con espacio de direccionamiento de 32
bits, y un tamao de pgina estndar (4KB, $212), hablamos ya de 1,048,576
($2^{20}$) pginas. Si cada entrada de la pgina ocupa 40 bits10 (esto es, 5
bytes), cada proceso requerira de 5MB (5 bytes por cada una de las pginas)
slamente para representar su mapeo de memoria. Esto, especialmente en
procesos pequeos, resultara ms gravoso para el sistema que los beneficios
obtenidos de la paginacin.
Aprovechando que la mayor parte del espacio de direccionamiento de un proceso
est tpicamente vaco, se puede subdividir el identificador de pgina en dos (o

ms) niveles, por ejemplo, separando una direccin de 32 bits en una tabla
externa de 10 bits, una tabla interna de 10 bits, y el desplazamiento de 12 bits.

Paginacin en dos niveles: Una tabla externa de 10 bits, tablas intermedias de 10


bits, y marcos de 12 bits (esquema comn para procesadores de 32 bits)
Este esquema funciona adecuadamente para equipos con direccionamiento de
hasta 32 bits. Sin embargo, recordemos que cada nivel de pginas conlleva un
acceso adicional a memoria en caso de fallo de pgina Emplear paginacin
jerrquica con un nivel externo y uno interno implica que un fallo de pgina triplica
(y no duplica, como sera con un esquema de paginacin directo) el tiempo de
acceso a memoria. Para obtener una tabla de pginas manejable bajo los
parmetros aqu descritos en un sistema de 64 bits, tendramos que septuplicar el
tiempo de acceso (cinco accesos en cascada para fragmentos de 10 bits, y un
tamao de pgina de 14 bits, mas el acceso a la pgina destino).
Otra alternativa es el emplear funciones digestoras (hash functions)11 para
mapear cada una de las pginas a un espacio muestral mucho ms pequeo.
Cada pgina es mapeada a una lista de correspondencias simples12.
Un esquema basado en funciones digestoras nos brinda caractersticas muy
deseables: El tamao de la tabla de pginas puede variar segn crece el uso de
memoria de un proceso (aunque esto requiera recalcular la tabla con diferentes
parmetros) y el nmero de accesos a memoria en espacios tan grandes como el

de un procesador de 64 bits se mantiene mucho ms tratable. Sin embargo, por la


alta frecuencia de accesos a esta tabla, debe elegirse un algoritmo digestor muy
gil para evitar que el tiempo que tome calcular la posicin en la tabla resulte
significativo frente a las alternativas.
4.3 Memoria compartida
Hay muchos escenarios en que diferentes procesos pueden beneficiarse de
compartir reas de su memoria. Uno de ellos es como mecanismo de
comunicacin entre procesos (IPC, Inter Process Communication), en que dos o
ms procesos pueden intercambiar estructuras de datos complejas sin incurrir en
el costo de copiado que implicara copiarlas a travs del sistema operativo. Otro
caso, mucho ms frecuente, es el de compartir cdigo.
Si un mismo programa es ejecutado varias veces, y dicho programa no emplea
mecanismos de cdigo auto-modificable, no tiene sentido que las pginas en que
se representa cada una de dichas instancias ocupe un marco independiente El
sistema operativo puede asignar a pginas de diversos procesos el mismo
conjunto de marcos, con lo cual puede aumentar la capacidad percibida de
memoria.
Y si bien es muy comn compartir los segmentos de texto de los diversos
programas que estn en un momento dado en ejecucin en la computadora, este
mecanismo es todava ms til cuando hablamos de bibliotecas del sistema: Hay
bibliotecas que son empleadas por una gran cantidad de programas13.

Uso de memoria compartida: Tres procesos comparten la memoria ocupada por el


texto del programa (azul), difieren slo en los datos.
Claro est, para ofrecer este modelo, el sistema operativo debe poder garantizar
que las pginas correspondientes a las secciones de texto (el cdigo del
programa) sean de slo lectura.

Un programa que est programado y compilado de forma que permita que todo su
cdigo sea de slo lectura es reentrante, dado que posibilita que diversos
procesos entren a su espacio en memoria sin tener que sincronizarse con otros
procesos que lo estn empleando.
4.3.1 Copiar al escribir (Copy on Write, CoW)
En los sistemas Unix, el mecanismo ms frecuentemente utilizado para crear un
nuevo proceso es el empleo de la llamada al sistema fork(). Cuando es invocado
por un proceso, el sistema operativo crea a un nuevo proceso idntico al que lo
llam, diferencindose nicamente en el valor entregado por la llamada a fork(). Si
ocurre algn error, el sistema entrega un nmero negativo (indicando la causa del
error). En caso de ser exitoso, El proceso nuevo (o proceso hijo) recibe el valor 0,
mientras que el proceso preexistente (o proceso padre) recibe el PID (nmero
identificador de proceso) del hijo. Esto es, es frecuente que veamos:

Este mtodo es incluso utilizado normalmente para crear nuevos procesos,


transfiriendo el ambiente (variables, por ejemplo, que incluyen cul es la entrada y
salida estndar de un proceso, esto es, a qu terminal estn conectados,
indispensable en un sistema multiusuario). Frecuentemente, la primer instruccin
que ejecuta un proceso hijo es execve(), que carga a un nuevo programa sobre
del actual y transfiere la ejecucin a su primer instruccin.
Cuesta trabajo comprender el por qu de esta lgica si no es por el empleo de la
memoria compartida: El costo de fork() en un sistema Unix es muy bajo, se limita a
crear las estructuras necesarias en la memoria del ncleo. Tanto el proceso padre
como el proceso hijo comparten todas sus pginas de memoria Sin embargo,

siendo dos procesos independientes, no deben poder modificarse ms que por los
canales explcitos de comunicacin entre procesos.

Memoria de dos procesos inmediatamente despus de la creacin del proceso hijo


por fork()
Esto ocurre as gracias a un mecanismo llamado Copiar al escribir (Copy on Write
o CoW). Las pginas de memoria de ambos procesos son las mismas mientras
sean slo ledas. Sin embargo, si uno de los procesos modifica a cualquier dato en
una de estas pginas, sta se copia a un nuevo marco, y deja de ser una pgina
compartida. El resto de las pginas seguir siendo compartido.

Cuando el proceso hijo modifica informacin en la primer pgina de su memoria,


se crea como una pgina nueva.

Incluso cuando se ejecutan nuevos programas a travs de execve(), es posible


que una buena parte de la memoria se mantenga compartida, por ejemplo, al
refrirse a copias de bibliotecas de sistema.

5 Memoria virtual
Varios de los aspectos mencionados en la seccin de paginacin van
conformando a lo que conocemos como memoria virtual: Vimos ya que en un
sistema que emplea paginacin, un proceso no conoce su direccin en memoria
relativa a otros procesos, sino que trabajan con una idealizacin de la memoria, en
la cual ocupan el espacio completo de direccionamiento, desde el cero hasta el
lmite lgico de la arquitectura, independientemente del tamao fsico de la
memoria disponible.
Y si bien el modelo mencionado de paginacin nos llev a que los diferentes
procesos pueden compartir regiones de memoria y direccionar ms memoria de la
fsicamente disponible, no abordamos qu estrategia se empleara cuando el total
de pginas solicitadas por todos los procesos activos en el sistema superara el
total de espacio fsico. Es ah donde entra en juego la memoria virtual: Para
ofrecer a los procesos mayor espacio en memoria del que existe fsicamente, el
sistema emplea espacio en almacenamiento secundario (tpicamente, disco duro),
a travs de un esquema de intercambio (swap).

Esquema general de la memoria, incorporando espacio en almacenamiento


secundario, representando la memoria virtual

Es importante apuntar que la memoria virtual es gestionada de forma automtica y


transparente por el sistema operativo. No hablaramos de memoria virtual, por
ejemplo, si un proceso pide explcitamente intercambiar determinadas pginas.
Puesto de otra manera: Del mismo modo que la segmentacin permiti hacer
mucho ms cmodo y til al intercambio a travs del intercambio parcial,
permitiendo que continuara la ejecucin del proceso incluso con ciertos segmentos
intercambiados (swappeados) a disco, la memoria virtual lo hace an ms
conveniente al aumentar la granularidad del intercambio: Ahora ya no slo se
enviarn a disco secciones lgicas completas del proceso (segmentos), sino que
podr hacerse pgina por pgina, aumentando muy fuertemente el rendimiento
resultante. Veremos que, empleando memoria virtual, de cierto modo la memoria
fsica se vuelve slo una proyeccin parcial de la memoria lgica, potencialmente
mucho mayor a sta.
Tcnicamente, cuando hablamos de memoria virtual, no nos referirmos ya a un
intercambiador (swapper), sino que al paginador.
5.1 Paginacin sobre demanda
La memoria virtual entra en juego desde la carga misma del proceso. Tomemos en
cuenta que casi siempre tenemos cdigo durmiente: Cdigo que slo se emplea
eventualmente, como el que responde ante una situacin de excepcin o el que se
emplea slo ante circunstancias particulares (por ejemplo, la exportacin de un
documento a determinados formatos, o la verificacin de que no haya tareas
pendientes antes de cerrar un programa). Y si bien a una computadora le sera
imposible ejecutar cdigo que no est cargado en memoria,14 el cdigo s puede
comenzar ejecutarse sin estar completamente en memoria: Basta con haber
cargado la pgina donde estn las instrucciones que comenzaremos a seguir.
La paginacin sobre demanda significa que, para comenzar a ejecutar un proceso,
el sistema operativo carga slamente la porcin necesaria para comenzar la
ejecucin, y que a lo largo de la ejecucin de cada uno de los procesos, el
paginador es flojo:15 Slo carga a memoria las pginas cuando van a ser
utilizadas. Al emplear un paginador flojo, las pginas que no sean requeridas
nunca sern siquiera cargadas a memoria.
La estructura empleada por el MMU para implementar un paginador flojo es muy
parecida a la descrita al hablar del buffer de traducin adelantada: La tabla de
pginas incluir un bit de validez, indicando para cada pgina del proceso si est
presente o no en memoria. Si el proceso intenta emplear una pgina que est
marcada como no vlida, esto causa un fallo de pgina, que lleva a que el sistema
operativo lo suspenda y traiga a memoria la pgina solicitada:

Pasos que atraviesa la respuesta a un fallo de pgina


1. Verifica en el PCB si esta solicitud corresponde a una pgina que ya ha sido
asignada a este proceso.
2. En caso de que la referencia sea invlida, se termina el proceso.
3. Procede a traer la pgina del disco a la memoria. El primer paso es buscar
un marco disponible (por ejemplo, a travs de una tabla de asignacin de
marcos)
4. Solicita al disco la lectura de la pgina en cuestin hacia el marco
especificado
5. Una vez que finaliza la lectura de disco, modifica tanto al PCB como al TLB
para indicar que la tabla est en memoria.
6. Termina la suspensin del proceso, continuando con la instruccin que
desencaden al fallo. El proceso puede continuar tal como si la pgina
siempre hubiera estado presente en memoria.

Llevando este proceso al extremo, podemos hablar de un sistema de paginacin


puramente sobre demanda (pure demand paging): En un sistema as, ninguna
pgina llegar al espacio de un proceso si no es a travs de un fallo de pgina; un
proceso, al iniciarse, comienza su ejecucin sin ninguna pgina en memoria, y con
el apuntador de siguiente instruccin del procesador apuntando a una direccin
que no est en memoria. El sistema operativo responde cargando esta primer
pgina, y conforme avanza el flujo del programa, el proceso ir ocupando el
espacio real que emplear.
5.2 Rendimiento
La paginacin sobre demanda puede impactar fuertemente el rendimiento de un
proceso. Hemos visto ya que un acceso a disco es varios miles de veces ms
lento que el acceso a memoria; podemos calcular el tiempo de acceso efectivo a
memoria ($t_e$) a partir de la probabilidad que en un proceso se presente un fallo
de pgina ($0 \le p \le 1$), conociendo el tiempo de acceso a memoria ($t_a$) y el
tiempo que toma atender a un fallo de pgina ($t_f$):
$t_e = (1-p)t_a + pt_f$
Ahora bien, dado que $t_a$ ronda hoy en da entre los 10 y 200ns, mientras que
$t_f$ est ms bien cerca de los 8ms (la latencia tpica de un disco duro es de
3ms, el tiempo de posicionamiento de cabeza de 5ms, y el tiempo de transferencia
es de 0.05ms), para propsitos prcticos ignorar a $t_a$. Con los valores
presentados, seleccionando el mayor de los $t_a$ presentados, si slo un acceso
a memoria de cada 1000 ocasiona un fallo de pgina (esto es, $p=\frac{1}
{1000}$):

$t_e = (1-\frac{1}{1000}) \times 200ns + \frac{1}{1000} \times 8,000,000ns$

$t_e = 199.8ns + 8000ns = 8199.8ns$


Esto es, en promedio, tendemos un tiempo efectivo de acceso a memoria 40
veces mayor a que si no empleramos este mecanismo. Con estos mismos
nmeros, para mantener la degradacin de rendimiento por acceso a memoria por
debajo del 10%, tendramos que reducir la probabiliad de fallos de pgina a
$\frac{1}{399,990}$.
Cabe mencionar que este impacto al rendimiento no necesariamente significa que
una proporcin relativamente alta de fallos de pgina para un proceso impacte

negativamente a todo el sistema El mecanismo de paginacin sobre demanda


permite, al no requerir que se tengan en memoria todas las pginas de un
proceso, que haya ms procesos activos en el mismo espacio en memoria,
aumentando el grado de multiprogramacin del equipo. De este modo, si un
proceso se ve obligado a esperar por 8ms a que se resuelva un fallo de pgina,
durante ese tiempo pueden seguirse ejecutando los dems procesos.
5.2.1 Acomodo de las pginas en disco
El clculo recin presentado, adems, asume que el acomodo de las pginas en
disco es ptimo. Sin embargo, si para llegar a una pgina hay que resolver la
direccin que ocupa en un sistema de archivos (posiblemente navegar una
estructura de directorio), y si el espacio asignado a la memoria virtual es
compartido con los archivos en disco, el rendimiento sufrir adicionalmente.
Una de las principales deficiencias estructurales en este sentido de los sistemas
de la familia Windows es que el espacio de almacenamiento se asigna en el
espacio libre del sistema de archivos. Esto lleva a que, conforme crece la
fragmentacin del disco, la memoria virtual quede esparcida por todo el disco
duro.
La generalidad de sistemas tipo Unix, en contraposicin, reservan una particin de
disco exclusivamente para la memoria virtual.
5.3 Reemplazo de pginas
Si aprovechamos las caractersticas de la memoria virtual para aumentar el grado
de multiprogramacin, como vimos en la seccin anterior, se nos presenta un
problema: Al sobre-comprometer memoria, en determinado momento, los
procesos que estn en ejecucin pueden caer en un patrn que requiera cargarse
a memoria fsica pginas por un mayor uso de memoria que el que hay
fsicamente disponible.
Y si recordamos que uno de los objetivos del sistema operativo es otorgar a los
usuarios la ilusin de una computadora dedicada a sus procesos, no sera
aceptable terminar la ejecucin de un proceso ya aceptado y cuyos requisitos han
sido aprobados porque nos quedamos sin recursos. Se hace necesario encontrar
una forma justa y adecuada de llevar a cabo un reemplazo de pginas que nos
permita continuar satisfaciendo sus necesidades.
El reemplazo de pginas es una parte fundamental de la paginacin sobre
demanda, es la pieza que posibilita una verdadera separacin entre memoria
lgica y fsica.

El mecanismo bsico a ejecutar es simple: Si todos los marcos estn ocupados,


debemos encontrar una pgina que podamos liberar (una pgina vctima) y
grabarla al espacio de intercambio en el disco. Una vez que lo hayamos hecho,
podemos emplear el espacio liberado para cargar una pgina nueva, y continuar
con la ejecucin del proceso.
Esto nos lleva a una doble transferencia al disco (una para grabar la pgina
vctima y una para traer la pgina de reemplazo), y por tanto, a una doble demora.
Podemos, con un mnimo de burocracia adicional (aunque requiere de apoyo del
MMU): implementar un mecanismo que disminuya la probabilidad de que
tengamos que realizar esta doble transferencia: Agregar un bit de modificacin o
bit de pgina sucia (dirty bit) a la tabla de pginas. Este bit se marca como
apagado siempre que se carga una pgina a memoria, y es automticamente
encendido cuando se realiza un acceso de escritura a dicha pgina.
Cuando el sistema operativo elige una pgina vctima, si su bit de pgina sucia
est encendido, es necesario grabarla al disco, pero si est apagada, sabemos
que la informacin en disco es idntica a la que tenemos en memoria, y permite
ahorrar la mitad del tiempo de transferencia.
Ahora bien, cmo decidimos qu pginas remplazar marcndolas como vctimas
cuando hace falta? Para esto tenemos que elegir un algoritmo de reemplazo de
pginas. La caracterstica que buscamos en este algoritmo es que, para una
patrn de accesos dado, nos d el menor nmero de fallos de pgina.
Esta seccin est basada en los ejemplos presentados en los presentados en el
libro Operating Systems Concepts Essentials (Silberschatz, Galvin y Gagn,
2011).
Al igual que como lo hicimos al describir los algoritmos de planificacin de
procesos, para analizar los que aqu presentaremos lo haremos sobre una cadena
de referencia, esto es, sobre una representacin de accesos solicitados. Estas
cadenas modelan el comportamiento de un conjunto de procesos en el sistema, y,
obviamente, diferentes comportamientos nos llevarn a diferentes resultados.
Hacer un volcado y trazado de ejecucin en un sistema real puede dar una
enorme cantidad de informacin, del rden de un milln de accesos por segundo.
Para reducir esta informacin en un nmero ms tratable, se puede simplificar
basado en que no nos interesa el acceso independiente a cada direccin de
memoria, sino que a cada pgina.
Adems, varios accesos a direcciones de memoria en la misma pgina no causan
efecto en el estado. Podemos tomar como un slo acceso a todos aquellos que

ocurren de forma consecutiva (esto es, sin llamar a ninguna otra pgina, no es
necesario que sean en instrucciones consecutivas) a una misma pgina.
Para analizar a un algoritmo de reemplazo, si lo que buscamos es la cantidad de
fallos de pgina producidos, adems de la cadena de referencia, necesitamos
saber cuntos marcos tiene nuestra computadora hipottica. Por ejemplo, si
tuviramos la cadena:
1, 4, 3, 4, 1, 2, 4, 2, 1, 3, 1, 4
Al recorrer esta cadena en una computadora con cuatro o ms marcos, slo nos
encontraramos con cuatro fallos (el fallo inicial que hace que se cargue por
primera vez cada una de las pginas). Si, en el otro extremo, tuviramos slo un
marco, nos encontraramos con 12 fallos, dado que a cada solicitud tendramos
que reemplazar el nico marco disponible. El rendimiento que evaluaramos sera
en los casos de que tuviramos dos o tres marcos.
Un fenmeno interesante que se presenta con algunos algoritmos es la anomala
de Belady: Si bien la lgica indica que a mayor nmero de marcos disponibles
tendremos una menor cantidad de fallos de pgina, con algunas de cadenas de
referencia y bajo ciertos algoritmos puede haber una regresin, en que aumentar
la cantidad de marcos tambin aumenta la cantidad de fallos.

Comportamiento del algoritmo FIFO que exhibe la anomala de Belady al pasar de


3 a 4 marcos
Para los algoritmos que veremos a continuacin, asumiremos una memoria con
tres marcos, y con la siguiente cadena de referencia:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
5.3.1 Primero en entrar, primero en salir (FIFO)

El algoritmo de ms simple y obvia implementacin es, nuevamente, el FIFO: Al


cargar una pgina en memoria, se toma nota de en qu momento fue cargada, y
cuando llegue el momento de reemplazar una pgina vieja, se elige la que haya
sido cargada hace ms tiempo.
Partiendo de un estado inicial en que nuestras tres pginas estn vacas,
necesariamente las tres primeras referencias a distintas pginas de memoria (7, 0,
1) causarn fallos de pgina. La siguiente (2) causar uno, pero la quinta
referencia (0) puede ser satisfecha sin requerir una nueva transferencia.

Algoritmo FIFO de reemplazo de pginas


La principal ventaja de este algoritmo es, como ya lo hemos mencionado, la
simplicidad, tanto para programarlo como para comprenderlo. Su implementacin
puede ser tan simple como una lista ligada circular, cada elemento que va
recibiendo se agrega en el ltimo elemento de la lista, y se "empuja" el apuntador
para convertirlo en la cabeza. Su desventaja, claro est, es que no toma en cuenta
a la historia de las ltimas solicitudes, por lo que puede causar un bajo
rendimiento. Todas las pginas tienen la misma probabilidad de ser reemplazadas,
sin importar su frecuencia de uso.
Con las condiciones aqu presentadas, un esquema FIFO nos lleva a 15 fallos de
pgina en un total de 20 accesos requeridos.
El algoritmo FIFO es vulnerable a la anomala de Belady. Esto puede ilustrarse al
pasar de 3 a 4 marcos con la cadena de referencia:

1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5
La prevalencia de cadenas que desencadenan la anomala de Belady fue uno de
los factores principales que llevaron al diseo de nuevos algoritmos de reemplazo
de pginas.
5.3.2 Reemplazo de pginas ptimo (OPT, MIN)
Un segundo algoritmo, de inters casi puramente terico, fue propuesto, y es
tpicamente conocido como OPT o MIN. Bajo este algoritmo, el enunciado ser
elegir como pgina vctima a aquella pgina que no vaya a ser utilizada por un
tiempo mximo.

Algoritmo ptimo de reemplazo de pginas (OPT)


Si bien este algoritmo est demostrado como ptimo o mnimo, se mantiene como
curiosidad terica porque requiere conocimiento a priori de las necesidades del
sistema Y si esto es impracticable ya en los algoritmos que revisamos de
despachadores, lo ser mucho ms con un recurso de reemplazo tan dinmico
como la memoria.

Su principal utilidad reside en que nos brinda una cota mnima: Calculando el
nmero de fallos que se presentan al seguir OPT, podemos ver qu tan cercano
resulta otro algoritmo respecto al caso ptimo. Para esta cadena de referencia, y
con tres pginas, tenemos un total de nueve fallos.
5.3.3 Menos recientemente utilizado (LRU)

Hemos visto este esquema en diversos mecanismos relacionados con la


administracin de memoria. Busca acercarse a OPT prediciendo cundo ser la
prxima vez en que se emplee cada una de las pginas que tiene en memoria
basado en la historia reciente de su ejecucin.
Cuando necesita elegir una pgina vctima, LRU elige la pgina que no ha sido
empleada hace ms tiempo

Algoritmo reemplazo de pginas menos recientemente utilizadas (LRU)


Para nuestra cadena de referencia, LRU genera 12 fallos, en el punto medio entre
OPT y FIFO.
Una observacin interesante puede ser que para una cadena $S$ y su cadena
espejo (invertida) $R^S$, el resultado de evaluar $S$ por LRU es igual al de
evaluar $R^S$ por OPT, y viceversa.
La principal debilidad de LRU es que para su implementacin requiere apoyo en
hardware16 sensiblemente ms complejo que FIFO. Una implementacin podra
ser agregar un contador a cada uno de los marcos, actualizarlo siempre al hacer
una referenciar a dicha pgina, y elegir como vctima a la pgina con un menor
conteo. Este mecanismo tiene la desventaja de que, en presencia de una gran
cantidad de pginas, tiene que recorrerlas a todas para buscar a la ms
envejecida.
Otro mecanismo es emplear una lista doblemente ligada con dos mtodos de
acceso: Lista y stack. Cada vez que se haga referencia a una pgina, se mueve a
la cabeza del stack, y cada vez que se busque a una pgina vctima, se selecciona
a aquella que est en el extremo inferior del stack. Este mecanismo hace un poco

ms cara la actualizacin (pueden requerirse hasta seis modificaciones), pero


encuentra a la pgina vctima en tiempo constante.
Se ha demostrado que LRU y OPT estn libres de la anomala de Belady, dado
que, para $n$ marcos, las pginas que estaran en memoria son un subconjunto
estricto de las que estaran con $n+1$ marcos.
5.3.4 Ms frecuentemente utilizada (MFU) / Menos frecuentemente utilizada
(LFU)
Estos dos algoritmos se basan en mantener un contador, como lo hace LRU, pero
en vez de medir el tiempo, miden la cantidad de referencias que se han hecho a
cada pgina.
MFU parte de la lgica que, si una pgina fue empleada muchas veces,
probablemente vuelva a ser empleada muchas veces ms; LFU parte de que una
pgina que ha sido empleada pocas veces es probablemente una pgina recin
cargada, y va a ser empleada en el futuro cercano.
Estos dos algoritmos son tan caros de implementar como LRU, y su rendimiento
respecto a OPT no es tan cercana, por lo cual casi no son empleados.
5.3.5 Aproximaciones a LRU
Dada la complejidad que presenta la implementacin de LRU en hardware,
algunos sistemas implementan una aproximacin a ste.
Bit de referencia
Esta es una aproximacin bastante comn. Consiste en que todas las entradas de
la tabla de pginas tengan un bit adicional, al que llamaremos de referencia. Al
iniciar la ejecucin, todos los bits de referencia estn apagados (0). Cada vez que
se referencia a un marco, su bit de referencia se enciende.
El sistema operativo invoca peridicamente a que se apaguen nuevamente todos
los bits de referencia. En caso de presentarse un fallo de pgina, se elige por FIFO
sobre el subconjunto de marcos que no hayan sido referenciados en el periodo
actual (esto es, entre todos aquellos para los cuales el bit de referencia sea 0).
Columna de referencia
Una mejora casi trivial sobre la anterior consiste en agregar varios bits de
referencia, conformndose como una columna: En vez de descartar su valor cada
vez que transcurre el periodo determinado, el valor de la columna de referencia es
recorrido a la derecha, descartando el bit ms bajo. Por ejemplo, si nuestra

implementacin tuviera 4 bits, un marco que no ha sido empleado en los ltimos 4


periodos tendra el valor 0000, mientras que un marco que s ha sido referenciado
los ltimos cuatro periodos tendra 1111. Un marco que fue empleado hace cuatro
y tres periodos, pero desde entonces no, tendra el 0011.
Cuando el sistema tenga que elegir a una nueva pgina vctima, lo har de entre
el conjunto que tenga un nmero ms bajo.
La parte de mantenimiento de este algoritmo es muy simple; recorrer una serie de
bits es una operacin muy sencillo. Seleccionar el nmero ms pequeo requiere
una pequea bsqueda, pero sigue resultando mucho ms sencillo que LRU.
Segunda oportunidad (o reloj)
El algoritmo de la segunda oportunidad trabaja tambin basado en un bit de
referencia y un recorrido tipo FIFO. La diferencia en este caso es que, al igual que
hay eventos que encienden a este bit (efectuar una referencia al marco), tambin
hay eventos que lo apagan:
Se mantiene un apuntador a la prxima vctima, y cuando el sistema requiera
efectuar un reemplazo, ste verificar si el marco al que apunta tiene el bit de
referencia encendido o apagado. En caso de estar apagado, el marco es
seleccionado como vctima, pero en caso de estar encendido (indicando que fue
utilizado recientemente), se le da una segunda oportunidad: El bit de referencia se
apaga, el apuntador de vctima potencial avanza una posicin, y vuelve a
intentarlo.
A este algoritmo se le llama tambin de reloj porque puede implementarse como
una lista ligada circular, y el apuntador puede ser visto como una manecilla. La
manecilla avanza sobre la lista de marcos buscando uno con el bit de referencia
apagado, y apagando a todos a su paso.
En el peor caso, el algoritmo de segunda oportunidad degenera en FIFO.

Segunda oportunidad mejorada


El bit de referencia puede amplairse con un bit de modificacin, dndonos las
siguientes combinaciones, en rden de preferencia:
(0, 0)
No ha sido utilizado ni modificado recientemente. Candidato ideal para su
reemplazo.

(0,1)
No ha sido utilizada recientemente, pero est modificada. No es tan buena opcin,
porque es necesario escribir la pgina a disco antes de reemplazarla, pero puede
se elegida.
(1,0)
El marco est limpio, pero fue empleado recientemente, por lo que probablemente
se vuelva a requerir pronto
(1,1)
Empleada recientemente y sucia Sera necesario escribir la pgina a disco
antes de reemplazar, y probablemente vuelva a ser requerida pronto. Hay que
evitar reemplazarla.
La lgica para encontrar una pgina vctima es similar a la segunda oportunidad,
pero busca reducir el costo de E/S. Esto puede requerir, sin embargo, dar hasta
cuatro vueltas (por cada una de las listas) para elegir la pgina vctima.
5.3.6 Algoritmos con manejo de buffers
Un mecanismo que se emplea con cada vez mayor frecuencia es que el sistema
no espere a enfrentarse a la necesidad de reemplazar un marco, sino que
proactivamente busque tener siempre espacio vaco en memoria. Para hacerlo,
conforme la carga lo permite, el sistema operativo busca las pginas sucias ms
proclives a ser paginadas a disco y va actualizando el disco (y marcndolas
nuevamente como limpias). De este modo, cuando tenga que traer una pgina
nueva del disco, siempre habr espacio donde ubicarla sin tener que esperar a
que se transfiera una para liberarla.
5.4 Asignacin de marcos
Abordando el problema prcticamente por el lado opuesto al del reemplazo de
pginas, cmo se asignan los marcos existentes a los procesos del sistema?
Esto es, qu esquemas podemos encontrar para que la asignacin inicial (y, de
ser posible, en el transcurso de la ejecucin) sea adecuada?
Consideremos en primer trmino un esquema sencillo: Un sistema con 1024KB de
memoria, compuesta de 256 pginas de 4096 bytes cada una, y basado en
paginacin puramente sobre demanda.

Si el sistema operativo ocupa 248KB, el primer paso ser reservar las 62 pginas
que ste requiere, y destinar las 194 pginas restantes para los procesos a
ejecutar.
Conforme se van lanzando y comienzan a ejecutar los procesos, cada vez que
uno de ellos genere un fallo de pgina, se le ir asignando uno de los marcos
disponibles hasta ocupar que la memoria entera est ocupada; claro est, cuando
un proceso termine su ejecucin, todos los marcos que tena asignados volvern a
la lista de marcos libres.
Una vez que la memoria est completamente ocupada (esto es, que haya 194
pginas ocupadas por procesos), el siguiente fallo de pgina invocar a un
algoritmo de reemplazo de pgina, que elegir una de las 194.17
Este esquema, si bien es simple, al requerir una gran cantidad de fallos de pgina
explcitos puede penalizar el rendimiento del sistema El esquema puede
resultar demasiado flojo, no le vendra mal ser un poco ms ansioso y asignar, de
inicio, un nmero determinado como mnimo utilizable de marcos.
5.4.1 Mnimo de marcos
Si un proceso tiene asignados demasiado pocos marcos, su rendimiento
indudablemente se ver afectado. Hasta ahora hemos supuesto que cada
instruccin puede causar un slo fallo de pgina, pero la realidad es ms
compleja. Cada instruccin del procesador puede, dependiendo de la arquitectura,
desencadenar varias solicitudes.
Todas las arquitecturas proporcionan instrucciones de referencia directa a
memoria (instrucciones que permiten especificar una direccin de memoria para
leer o escribir) Esto significa que todas requerirn que, para que un proceso
funcione adecuadamente, tenga por lo menos dos marcos asignados: En caso de
que se le permitiera solo uno, si la instruccin ubicada en 0x00A2C8 solicita la
carga de 0x043F00, esta causara dos fallos: El primero, cargar al marco la pgina
0x043, y el segundo, cargar nuevamente la pgina 0x00A, necesario para leer la
siguiente instruccin a ejecutar del programa (0x00A2CC, asumiendo palabras de
32 bits).
Algunas arquitecturas, adems, permiten referencias indirectas a memoria, esto
es, nuestra instruccin de carga puede solicitar la direccin que est referenciada
en 0x043F00. El procesador tendra que recuperar esta direccin, y podra
encontrarse con que hace referencia a una direccin en otra pgina (digamos,
0x010F80). Cada nivel de indireccin que se permite aumenta en uno el nmero
de pginas que debemos reservar como mnimo por proceso.

Algunas arquitecturas, particularmente las ms antiguas,18, permiten que tanto los


operandos de algunas instrucciones aritmticas como su resultado sean
direcciones de memoria (y no operan estrictamente sobre los registros, como las
arquitecturas RISC). En dichas arquitecturas, el mnimo debe tambin tener este
factor en cuenta: Si en una sola instruccin podemos sumar dos direcciones de
memoria y guardar el resultado en una adicional, el mnimo a reservar es de
cuatro marcos: Uno para el flujo del programa, uno para el primer operando, uno
para el segundo operando, y uno para el resultado.
5.4.2 Esquemas de asignacin
Ahora, una vez establecido el nmero mnimo de marcos por proceso, cmo
podemos determinar el nivel deseable?
Partiendo de que el rendimiento de un proceso ser mejor entre menos fallos de
paginacin cause, podramos intentar otorgar a cada proceso el total de marcos
que solicita Pero esto tendra como resultado disminuir el grado de
multiprogramacin, y por tanto, reducir el uso efectivo total del procesador.
Otra alternativa es la asignacin igualitaria: Se divide el total de espacio en
memoria fsica entre todos los procesos en ejecucin, en partes iguales. Esto es,
volviendo a la computadora hipottica que presentamos al inicio de esta seccin,
si tenemos 4 procesos que requieren ser ejecutados, de los 194 marcos
disponibles, el sistema asignar 48 marcos (192KB) a dos de los procesos y 49
(196KB) a los otros dos (es imposible asignar fracciones de marcos). De este
modo, el espacio ser compartido por igual.
La asignacin igualitaria resulta ser un esquema deficiente para casi todas las
distribuciones de procesos: Bajo este esquema, si $P_1$ es un gestor de bases
de datos que puede estar empleando 2048KB (512 pginas) de memoria virtual (a
pesar de que el sistema tiene slo 1MB de memoria fsica) y $P_2$ es un lector de
texto que est empleando un usuario, requiriendo apenas 112KB (28 pginas), con
lo cual incluso dejara algunos de sus marcos sin utilizar.
Un segundo esquema, que resuelve mejor esta situacin, es la asignacin
proporcional: Dar a cada proceso una porcin del espacio de memoria fsica
proporcional a su uso de memoria virtual.
De tal suerte, si adems de los procesos anteriores tenemos a $P_3$ empleando
560KB (140 pginas) y a $P_4$ con 320KB (80 pginas) de memoria virtual, el
uso total de memoria virtual sera de $V_T = 512 +
28 + 140 + 80 = 760$ pginas, esto es, el sistema tendra comprometido a travs
de la memoria virtual un sobreuso cercano a 4:1 sobre la memoria fsica19.

Cada proceso recibir entonces $F_P = \frac{V_P}{V_T} \times m$, donde $F_P$
indica el espacio de memoria fsica que el proceso recibir, $V_P$ la cantidad de
memoria virtual que est empleando, y $m$ la cantidad total de marcos de
memoria disponibles. De este modo, $P_1$ recibir 130 marcos, $P_2$ 7, $P_3$
35 y $P_4$ 20, proporcionalmente a su uso de memoria virtual.
Cabe apuntar que este mecanismo debe observar ciertos parmetros mnimos:
Por un lado, si el mnimo de marcos definido para esta arquitectura es de 4, por
ms que entrara en ejecucin un proceso de 32KB (8 pginas) o aumentara al
doble el grado de multiprocesamiento, ningn proceso debe tener asignado menos
del mnimo definido.
La asignacin proporcional tambin debe cuidar no sobre-asignar recursos a un
proceso obeso: $P_1$ es ya mucho ms grande que todos los procesos del
sistema. En caso de que esta creciera mucho ms, por ejemplo, si multiplicara por
4 su uso de memoria virtual, esto llevara a que se castigara
desproporcionadamente a todos los dems procesos del sistema.
Por otro lado, este esquema ignora por completo las prioridades que hoy en da
manejan todos los sistemas operativos; si quisiramos que las consideraran,
podra incluirse como factor la prioridad, multiplicando junto con $V_P$.
El esquema de asignacin proporcional sufre, sin embargo, cuando cambia el nivel
de multiprogramacin Esto es, cuando se inicia un nuevo proceso o finaliza un
proceso en ejecucin, deben recalcularse los espacios en memoria fsica
asignados a cada uno de los procesos restantes. Si finaliza un proceso, el
problema es menor, pues slo se asignan los marcos y puede esperarse a que se
vayan poblando por paginacin sobre demanda, pero si inicia uno nuevo, es
necesario reducir de golpe la asignacin de todos los dems procesos hasta abrir
suficiente espacio para que quepa.
Por ltimo, el esquema de la asignacin proporcional tambin tiende a
desperdiciar recursos: Si bien hay procesos que mantienen un patrn estable de
actividad a lo largo de su ejecucin, muchos otros pueden tener periodos de
mucho menor requisitos. Por ejemplo, un proceso servidor de documentos pasa la
mayor parte de su tiempo simplemente esperando solicitudes, y podra reducirse a
un uso mnimo de memoria fsica, sin embargo, al solicitrsele un documento, se
le deberan poder asignar ms marcos (para trabajar en una rfaga) hasta que
termine con su tarea. Veremos este punto en breve, al hablar del conjunto activo
5.4.3 mbitos del algoritmo de reemplazo de pginas

Para responder a los problemas que la anterior seccin nos deja abiertos, se
puede discutir el mbito en que operar el algoritmo de reemplazo de pginas.
Reemplazo local
Mantenemos tan estable como sea posible el clculo hecho por el esquema de
asignacin que estemos empleando. Esto significa que cuando se presente un
fallo de pgina, las pginas que sern consideradas para su intercambio sern
nicamente aquellas pertenecientes al mismo proceso que el que caus el fallo.
Un proceso tiene asignado su espacio de memoria fsica, y se mantendr estable
mientras el sistema operativo no tome alguna decisin por cambiarlo.
Reemplazo global
Los algoritmos de asignacin determinan el espacio asignado a los procesos al ser
inicializados, e influyen a los algoritmos de reemplazo (por ejemplo, dando mayor
peso para ser elegidas como pginas vctima a aquellas que pertenezcan a un
proceso que excede de su asignacin en memoria fsica).
Los algoritmos de reemplazo de pginas operan sobre el espacio completo de
memoria, y la asignacin fsica de cada proceso puede variar segn el estado del
sistema momento a momento.
Reemplazo global con prioridad
Es un esquema mixto, en el que un proceso puede sobrepasar su lmite siempre
que le robe espacio en memoria fsica exclusivamente a procesos de prioridad
inferior a l. Esto es consistente con el comportamiento de los algoritmos
planificadores, que siempre dan preferencia a un proceso de mayor prioridad por
sobre de uno de prioridad ms baja.
El reemplazo local es ms rgido y no permite aprovechar para mejorar el
rendimiento los periodos de inactividad de algunos de los procesos. En
contraposicin, los esquemas basados en reemplazo global puede llevar a
rendimiento inconsistente: Dado que la asignacin de memoria fsica sale del
control de cada proceso, puede que la misma seccin de cdigo presente tiempos
de ejecucin muy distintos si porciones importantes de su memoria fueron
paginadas a disco.
5.5 Hiperpaginacin
Cuando (bajo un esquema de reemplazo local) un proceso tiene asignadas
demasiado pocas pginas para llevar a cabo su trabajo y genera fallos de pgina
con tal frecuencia que le imposibilita realizar trabajo real, o (bajo un esquema de

reemplazo global) hay demasiados procesos en ejecucin en el sistema y los


constantes fallos y reemplazos hacen imposible a todos los procesos involucrados
avanzar, se dice que estamos en estado de hiperpaginacin.20
Hay varios escenarios que pueden llevarnos a la hiperpaginacin, y su impacto es
tan claro e identificable que prcticamente cualquier usuario de cmputo lo sabr
reconocer. Presentemos, pues, un escenario ejemplo en que las malas decisiones
del sistema operativo pueden conducirlo a este estado.
Comencemos con un sistema que est con una carga media normal, con un
esquema de reemplazo global de marcos. Se lanza un nuevo proceso, que como
parte de su inicializacin requiere poblar diversas estructuras a lo largo de su
espacio de memoria virtual. Para hacerlo, lanza una serie de fallos de pgina, a
las que el sistema operativo responde reemplazando a varios marcos
pertenecientes a otros procesos.
Casualmente, a lo largo del periodo que toma esta inicializacin (recordemos que
puede parecer una eternidad: El disco es entre miles y millones de veces ms
lento que la memoria) algunos de estos procesos solicitan los espacios de
memoria que acaban de ser enviados a disco, por lo cual lanzan nuevos fallos de
pgina.
Cuando el sistema detecta que la utilizacin del procesador decrece, el sistema
operativo puede aprovechar la situacin para lanzar procesos de mantenimiento.
Se lanzan estos procesos, reduciendo an ms el espacio de memoria fsica
disponible para cada uno de los procesos preexistentes.
Se ha formado ya toda una cola de solicitudes de paginacin, algunas veces
contradictorias. El procesador tiene que comenzar a ejecutar NOOP (esto es, no
tiene trabajo que ejecutar), porque la mayor parte del tiempo lo pasa en espera de
un nuevo marco por parte del disco duro. El sistema completo avanza cada vez
ms lento.

Al aumentar demasiado el grado de multiprogramacin, el uso del CPU cae


abruptamente y caemos en la hiperpaginacin (Silberschatz, p.349)
Los sntomas de la hiperpaginacin son muy claros, y no son difciles de detectar.
Qu estrategia puede emplear el sistema operativo una vez que se da cuenta
que se present esta situacin?
Una salida sera reducir el nivel de multiprogramacin Si la paginacin se
present debido a que los requisitos de memoria de los procesos actualmente en
ejecucin no pueden ser satisfechos con la memoria fsica disponible, el sistema
puede seleccionar a uno (o ms) de los procesos y suspenderlos por completo
hasta que el sistema vuelva a un estado normal. Podra seleccionarse, por
ejemplo, al proceso con menor prioridad, al que est causando ms cantidad de
fallos, o al que est ocupando ms memoria.
5.5.1 Modelando el conjunto activo
Un pico en la cantidad de fallos de pgina no necesariamente significa que
estamos cayendo en una situacin de hiperpaginacin Muchas veces indica
que el proceso cambi su atencin de un conjunto de pginas a otro, o dicho de
otro modo, que cambi el conjunto activo del proceso Y resulta natural que, al
cambiar el conjunto activo, el proceso accese de golpe una serie de pginas que
no haba tocado en cierto tiempo.

Los picos y valles en la cantidad de fallos de pgina de un proceso definen a su


conjunto activo (Silberschatz, p.349)
El conjunto activo es, pues, la aproximacin ms clara a la localidad de referencia
de un proceso dado: El conjunto de pginas sobre los que est iterando en un
momento dado.
Idealmente, para evitar los problemas relacionados con la hiperpaginacin,
debemos asignar a cada proceso suficientes pginas como para que mantenga en
memoria fsica su conjunto activo Y si no nos es posible hacerlo, el proceso es
un buen candidato para ser suspendido. Sin embargo, detectar con suficiente
claridad como para efectuar este diagnstico los cul es el conjunto activo es una
tarea muy compleja, que tpicamente implica rastrear y verificar del rden de los
ltimos miles a decenas de miles de accesos a memoria.