Vous êtes sur la page 1sur 78

 *HVWLyQ GH 0HPRULD

Para ejecutar un proceso, ste debe encontrarse en memoria principal. Como


hemos visto en el captulo anterior, para mejorar el aprovechamiento de la CPU,
sta se reparte entre varios procesos, por lo tanto, tambin habr que repartir la
memoria principal.
A la parte del sistema operativo que se ocupa de gestionar la memoria se le
denomina Gestor de Memoria. Su cometido consiste en llevar la cuenta de las
partes de memoria que se estn utilizando y las que estn libres, as como de
gestionar el trasvase de informacin entre la memoria principal y la secundaria
cuando la memoria RAM no sea suficientemente grande para acoger a todos los
procesos.
En este captulo trataremos los distintos enfoques que hay en la gestin de
memoria. Los algoritmos varan desde el correspondiente a una simple mquina
desnuda, hasta las estrategias de paginacin y segmentacin.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

 ,QWURGXFFLyQ \ 2EMHWLYRV


En la evolucin de la arquitectura de ordenadores, la cantidad de memoria principal
ha ido creciendo. Pero el tamao de los programas crece an ms rpido que la
memoria disponible. El primer intento para resolver el problema de la limitacin de
memoria fue la utilizacin de una tcnica denominada RYHUOD\V (solapamientos). Un
programa con solapamientos se divida en varias partes. Una de estas partes
siempre estaba presente en memoria principal y controlaba la carga sucesiva de las
dems partes (RYHUOD\V) desde la memoria secundaria a la principal. Estas otras
partes se cargaban en memoria de tal forma que ocupaban la misma regin de
memoria en la que haba residido otra parte previamente utilizada, sobreescribiendo
as (solapando) a la parte anterior. Los programadores pasaron mucho tiempo
dividiendo un programa en trozos, en lugar de concentrarse simplemente en la
escritura del programa. Posteriormente, la necesidad de repartir la memoria entre
varios usuarios redujo la cantidad de memoria para cada uno, e hizo necesaria la
introduccin de algn mecanismo de proteccin para aislar entre s las actividades
de los programas.
As, tenemos que en la gestin de memoria se deben perseguir los siguientes
objetivos:
3URWHFFLyQ
Si varios procesos comparten la memoria principal, se debe asegurar que
ninguno de ellos pueda modificar posiciones de memoria de otro proceso.
Aunque la escritura de memoria tiene efectos ms desastrosos, la lectura de
memoria ajena tampoco debe estar permitida, pues cada proceso debe mantener
su privacidad. Ya que muchos lenguajes de programacin disponen de punteros
dinmicos e indexacin de vectores o matrices, las comprobaciones en tiempo de
compilacin no son suficientes y se requiere que el sistema de gestin de
memoria realice chequeos adicionales durante la ejecucin. Debe disponerse de
un sistema de permisos de acceso que especifique los derechos que tiene cada
proceso en el acceso a zonas de memoria de otros procesos.
&RPSDUWLPLHQWR
El compartimiento de la memoria parece estar en contradiccin con la proteccin,
pero es que a menudo tambin es necesario que varios procesos puedan
compartir y actualizar estructuras de datos comunes, por ejemplo, en un sistema
de bases de datos. En otras ocasiones, lo que se requiere es compartir zonas de
cdigo, por ejemplo, en rutinas de biblioteca, para no tener en memoria distintas
copias de la misma rutina. En este caso, se hace necesaria alguna proteccin
para que un proceso no modifique inadvertidamente el cdigo de las rutinas.
5HXELFDFLyQ
La multiprogramacin requiere que varios procesos residan simultneamente en
memoria. Lo que no se puede saber antes de llevarlo a memoria es la direccin
absoluta en la que se va a cargar el proceso, por lo que no es prctico utilizar
direcciones absolutas en el programa. En su lugar, es preferible realizar
direccionamientos relativos para permitir que un programa pueda ser cargado y
ejecutado en cualquier parte de la memoria.


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

2UJDQL]DFLyQ GH OD PHPRULD
La memoria se debe organizar tanto fsica como lgicamente.
Debido al coste de la rpida memoria RAM, normalmente se necesita ampliarla
con memoria secundaria ms barata (y ms lenta), utilizando para ello
dispositivos tales como discos o cintas magnticas. Por el contrario, tambin
puede resultar conveniente aadir memoria de acceso ms rpido que la RAM
principal, como es el caso de la memoria cach, en la que se mantienen los datos
de acceso ms frecuente. Esta jerarqua fsica de memorias hace necesario un
sistema que controle el flujo de informacin entre los distintos dispositivos de
almacenamiento. Esta tarea la realizaba el programador utilizando RYHUOD\V, pero
consume una gran cantidad de tiempo y, debido a la reubicacin dinmica, el
programador no siempre sabe la cantidad y lugar de la memoria que se va a
necesitar. Por esto, parece conveniente que sea el gestor de memoria el que se
ocupe de esta labor.
Aunque la mayora de las memorias estn organizadas como un nico espacio
lineal de direcciones secuenciales, que van desde 0 hasta un mximo, esto no
refleja la estructura lgica de los programas, que utilizan estructuras lgicas de
instrucciones y datos, tales como mdulos, rutinas o procedimientos, matrices,
registros, etc. Si una gestin de memoria pudiera proporcionar varios espacios de
direcciones, cada estructura lgica podra ser una entidad independiente: un
VHJPHQWR. Esto sera ventajoso por varias razones, pues los segmentos pueden
compilarse y cargarse de forma independiente, teniendo cada uno de ellos sus
propios derechos de acceso (lectura, escritura, ejecucin). Un sistema simple de
segmentacin puede constar de slo dos segmentos: uno para cdigo (con
permiso de ejecucin) y otro para datos (con permiso de lectura y escritura). Una
segmentacin ms sofisticada podra utilizar un segmento para cada estructura
lgica.

Los sistemas de gestin de memoria pueden dividirse en dos clases: los que
mueven los procesos entre memoria principal y secundaria (intercambio y
paginacin), y los que no lo hacen. Tanto el intercambio como la paginacin son
mecanismos originados por la insuficiencia de memoria principal para contener
todos los procesos en memoria simultneamente. A medida que la memoria se vaya
haciendo ms barata, puede que los argumentos en favor de unos u otros tipos de
gestin vayan cambiando, aunque teniendo en cuenta la ley de Parkinson: Los
programas tienden a expandirse hasta llenar la memoria que los contiene, parece
difcil que puedan cambiar radicalmente.
Pasemos a ver, en los siguientes apartados, las distintas tcnicas de gestin de
memoria.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

,QWURGXFFLyQ \ 2EMHWLYRV
+D\ TXH WHQHU HQ FXHQWD TXH

+ /RV SURJUDPDV FUHFHQ PXFKR


6H QHFHVLWD
PXFKD PHPRULD

+ /RV VLVWHPDV VXHOHQ PXOWLXVXDULR

/D *HVWLyQ GH 0HPRULD GHEH SURSRUFLRQDU


3 3527(&&,1 3HUPLVRV GH $FFHVR
3 &203$57,0,(172 GH OD LQIRUPDFLyQ
3 5(8%,&$&,1 SDUD VLVWHPDV PXOWLSURJUDPDGRV
3 25*$1,=$&,1 '( /$ 0(025,$ )tVLFD -HUDUTXtDV
/yJLFD 6HJPHQWDFLyQ
23&,21(6

6LQ ,QWHUFDPELR
0RQRSURJUDPDFLyQ
0XOWLSURJUDPDFLyQ
FRQ 3DUWLFLRQHV )LMDV

&RQ ,QWHUFDPELR
0XOWLSURJU FRQ
3DUWLFLRQHV 9DULDEOHV
0HPRULD 9LUWXDO
3DJLQDFLyQ

TvrhPrhvD



6HJPHQWDFLyQ

BrvyqrHrvh!

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

 *HVWLyQ GH 0HPRULD VLQ ,QWHUFDPELR


En los sistemas de gestin de memoria sin intercambio, la idea bsica consiste en
cargar el programa a ejecutar en algn lugar de la memoria principal, donde
permanece hasta que finaliza su ejecucin, momento en el que abandona el espacio
de memoria utilizado.
Veamos a continuacin las tcnicas ms habituales para los diferentes modelos de
programacin sin intercambio de memoria.

 0RQRSURJUDPDFLyQ
El esquema de memoria ms simple consiste en mantener la memoria ocupada con
un nico proceso. Cuando se carga un programa que se hace cargo de toda la
memoria y del control completo de la mquina, se dice que el programa se carga
sobre una PiTXLQD GHVQXGD, es decir, una mquina en la que solamente se ofrece
el hardware puro, sin ninguna ayuda software que lo recubra. Las mquinas
desnudas se utilizaron de forma general hasta principios de los aos 60, y
actualmente se suelen utilizar en sistemas empotrados de control.
Ms tarde, a las mquinas desnudas se les aadi una especie de sistema
operativo muy rudimentario al que se le denomin PRQLWRU. Las funciones que
ofreca el monitor eran las estrictamente necesarias para cargar un programa en
memoria y controlar su ejecucin, todo de forma muy manual y con una completa
supervisin del usuario.
La tcnica actual ms utilizada en los pequeos ordenadores es la que se muestra
en la parte inferior de la Figura 3. La memoria est ocupada por el sistema
operativo, que suele estar en RAM, y por el cargador inicial del sistema operativo
(IPL) y los GULYHUV de dispositivos, que suelen estar en memoria ROM. El resto de la
memoria RAM queda disponible como rea de usuario.
Cuando el sistema est organizado de esta manera (por ejemplo MS-DOS), slo se
ejecuta un proceso a la vez. El usuario teclea un comando en el terminal, y el
sistema operativo carga el programa correspondiente de disco a memoria principal y
lo ejecuta. Cuando el programa termina, el sistema queda a la espera de que el
usuario escriba otro comando, para cargar otro programa en la misma zona de
memoria que el anterior.

 0XOWLSURJUDPDFLyQ FRQ 3DUWLFLRQHV )LMDV


Ya que, en general, es deseable que haya varios procesos de usuario residiendo en
memoria al mismo tiempo, se hace necesario considerar el problema de cmo
asignar memoria disponible a varios de los procesos que estn en la cola de espera
para ser trados a memoria principal. Lo ms inmediato y simple es dividir la

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

*HVWLyQ GH 0HPRULD VLQ ,QWHUFDPELR


1R KD\ WUDVLHJR GH SURFHVRV
HQWUH PHPRULD SULQFLSDO \ VHFXQGDULD
0212352*5$0$&,1
8Q 8VXDULR

8Q 3URFHVR

3URJUDPDV
3HTXHxRV

0iTXLQD 'HVQXGD
(O XVXDULR HV UHVSRQVDEOH GH WRGR OR TXH VH FDUJD HQ PHPRULD
5$0

3URJUDPD GH XVXDULR

6LVWHPD 2SHUDWLYR

&RQWURODGRUHV

&RQ 6LVWHPD 2SHUDWLYR 5HVLGHQWH


PiV FRQWURODGRUHV GH GLVSRVLWLYRV

,3/  'ULYHUV
3URJUDPD
GH XVXDULR

3URJUDPD
GH XVXDULR

0RQLWRU

6 2

TvrhPrhvD



520

5$0

BrvyqrHrvh"

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

memoria en Q particiones (posiblemente de distinto tamao), de tal forma que en


cada particin se mete un proceso, donde permanece hasta que finaliza su
ejecucin. Una vez terminado el proceso, la particin queda libre para acoger a un
nuevo trabajo.
Con la llegada de la multiprogramacin y este esquema de memoria aparecen
algunos problemas y cuestiones que deben solventarse, como la planificacin de
procesos a largo plazo, la determinacin del nmero y tamao de las particiones, la
ubicacin de los programas y la proteccin de las particiones de memoria.
3ODQLILFDFLyQ
Un esquema posible para la planificacin de procesos a largo plazo, o sea, para
seleccionar los procesos que van cargarse en memoria para ser ejecutados,
puede consistir en que cada una de las particiones tenga una cola asociada, de
tal manera que en cada una de ellas se van encolando los trabajos o procesos
dependiendo del espacio de memoria requerido.
Cuando hay que cargar un trabajo, se le pone en la cola de entrada de la particin
ms pequea en la que quepa. Ya que en este esquema las particiones son de
tamao fijo preestablecido, cualquier espacio de una particin no utilizado por el
proceso cargado, se desaprovecha.
La desventaja de meter en colas los trabajos segn su tamao se hace patente
cuando la cola de una particin grande est vaca, pero la cola de una particin
pequea tiene muchos trabajos. Una solucin consiste en tener una nica cola
(Ver la Figura 4-inferior). Cuando una particin se queda libre, el primer trabajo de
la cola que quepa en esa particin, se carga en ella y se ejecuta. Ya que no es
deseable malgastar una particin grande con un trabajo pequeo, una alternativa
puede ser el recorrer la cola entera y elegir el trabajo ms grande que se pueda
cargar en la particin que acaba de quedar libre. No obstante, esto supone una
discriminacin de los trabajos con pocos requisitos de memoria, que no son
merecedores de tener una particin grande, mientras que normalmente a los
trabajos pequeos se les suele dar el mejor servicio, no el peor.
Para solucionarlo, se suele disponer siempre de alguna particin de poco tamao,
para permitir que los pequeos trabajos tambin se ejecuten sin necesidad de
asignarles grandes particiones de memoria. No obstante, debe tenerse en cuenta
que un proceso que requiera poca memoria y mucha CPU puede entonces formar
una larga cola de espera por su particin.
7DPDxR GH ODV SDUWLFLRQHV
El tamao de cada una de las particiones lo puede establecer el operador en el
momento de arranque del sistema o figurar en algn fichero de configuracin del
sistema.
Como se puede ver, el grado de multiprogramacin est directamente ligado al
nmero de particiones del sistema. A ms particiones, ms procesos cargados y,

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

6LQ ,QWHUFDPELR

0XOWLSURJ FRQ 3DUWLFLRQHV )LMDV

5HVXOWD ~WLO WHQHU YDULRV SURFHVRV


VLPXOWiQHDPHQWH HQ PHPRULD

5$0
 .E

6H GLYLGH OD PHPRULD
HQ Q SDUWLFLRQHV
 .E
 .E
6 2
3HUR VH GHEHQ WHQHU HQ
FXHQWD DOJXQDV FXHVWLRQHV

3 3ODQLILFDFLyQ GH SURFHVRV
3 7DPDxR GH OD SDUWLFLyQ
3 5HXELFDFLyQ
3 3URWHFFLyQ

TvrhPrhvD



BrvyqrHrvh#

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

3ODQLILFDFLyQ GH 3URFHVRV

3DUWLFLRQHV )LMDV

+ 0~OWLSOHV &RODV GH (QWUDGD



4

 .E

4

 .E

4

 .E
6 2

(O 3UREOHPD GH ODV &RODV 9DFtDV

+ 8QD QLFD &ROD GH (QWUDGD

 .E

 .E
 .E
6 2

TvrhPrhvD

$SXQWHV GH 62 ,

BrvyqrHrvh$



*HVWLyQ GH 0HPRULD

por lo tanto, mayor aprovechamiento de la CPU. As, cuanta ms memoria se


desperdicie, menos procesos se podrn tener en memoria.
Para lograr el mayor aprovechamiento de la memoria los procesos deberan
cargarse en particiones cuyo tamao se ajuste lo ms posible (por exceso) al del
proceso. Por una parte tenemos que si dividimos la memoria del sistema en
muchas particiones pequeas, puede dar lugar a que algunos programas grandes
no puedan cargarse en memoria aunque haya suficiente memoria disponible, si
sta no se encuentra adyacente en una nica particin, dando lugar, en este
caso, a una IUDJPHQWDFLyQ H[WHUQD de la memoria. Si por el contrario, se
dispone de unas pocas particiones grandes, los programas pequeos
desaprovecharn la memoria sobrante de la particin que ocupen, lo que da lugar
a una IUDJPHQWDFLyQ LQWHUQD.
Los tamaos de las particiones suelen establecerse despus de un estudio sobre
los tamaos habituales de los programas que se ejecutan en cada mquina.

7 D P D x R G H OD 3 D U W LF Ly Q

Q h vp v r A vw h

& X i Q W D V 3 D U W LF LR Q H V "
' H TXp 7 DP DxR"

I v r yq r
y v t h h p vy

6 r p u h vr
q r yh 8 Q V

6 h ~ r q r

H h v r yq r

p r r r vh

y v t h h p vy

6 i r vh

H r p r

q r r q vp vh q h

r r vh

Q h vp vy Q r r x h

A h t r h p vy @ r h

Q h vp vy B h q r

A h t r h p vy D r h

@ y h h x q r yh h vp v r q r r q r
q r y r v v q r y t h h u h i v h yr

T v r h P r h v D



1 R U P D OP H Q W H

B r vy q r H r v h  %

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

5HXELFDFLyQ GH SURJUDPDV
Cuando se monta o enlaza un programa compuesto por diferentes mdulos,
todos ellos se combinan en un nico mdulo cargable, en el que las referencias a
sus objetos locales (rutinas o datos) son direcciones que van desde cero hasta la
correspondiente al tamao del mdulo. As, si el mdulo se carga en la direccin
cero de memoria principal, se ejecutar correctamente, pero no si se carga en
cualquier otra direccin. Segn esto, habra que decirle al montador en qu
direccin se va a cargar ese programa. Pero observando cualquiera de los
esquemas de la Figura 7, se puede ver que cada proceso se puede cargar en
cualquier direccin de memoria, y no hay forma de conocerla hasta llegar el
momento de su ejecucin.
Supongamos que la primera instruccin de un programa es una llamada a un
procedimiento en la direccin 100 dentro del fichero binario producido por el
montador. Si este programa se carga en la particin 1, esa instruccin saltar a la
direccin absoluta 100, la cual, muy posiblemente, corresponder a un rea del
sistema operativo. Lo que se necesita es que la instruccin salte a la direccin
Base_Particin + 100. As, siempre se realizar la llamada correcta,
independientemente de la particin en la que se cargue el programa.
Una posible solucin consiste en modificar las direcciones del programa a medida
que se carga en memoria. O sea, que a los programas que se carguen en la
particin 1 se les aadir Base_Particin_1 a todas las direcciones a las que
haga referencia, Base_Particin_2 a los que se carguen en la particin 2, etc.;
siendo la base de la particin, su direccin de comienzo. Para realizar esto, el
montador debe incluir en el mdulo cargable una lista con las direcciones
relativas del programa en las que hay bytes o palabras cuyo contenido son
referencias a memoria, de tal forma que puedan ser reubicadas en la carga.
Con esta solucin se consiguen programas HVWiWLFDPHQWH UHXELFDEOHV
(reubicables en tiempo de carga), pero tienen una pega:
No permite que un programa cargado en una particin pueda moverse
a otra distinta antes de finalizar su ejecucin, lo cual resulta de gran
utilidad, como veremos posteriormente.
Este problema se solventan con un poco de ayuda del hardware, tal como se
describe en la parte superior de la Figura 7. Consiste en equipar al procesador
con un nuevo registro: el 5HJLVWUR %DVH. Cuando un proceso es seleccionado
para pasar a ejecucin, el registro base se carga con la direccin de la particin
que contiene al proceso en cuestin. Una vez que el proceso est en ejecucin, a
cada referencia a memoria se le aade automticamente el contenido del registro
base, generando as la direccin definitiva, sin necesidad de modificar el
contenido del mdulo ejecutable, ni en la carga ni durante la ejecucin. A este
sistema en el que ya s se permite ejecutar programas en cualquier particin de
memoria e incluso cambiarlos de particin durante su ejecucin, se le conoce
como sistema de UHXELFDFLyQ GLQiPLFD.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

Solucionado el asunto de la reubicacin, debemos afrontar un ltimo problema, pues


el sistema de gestin de memoria que hemos visto hasta ahora no asegura que un
programa no pueda construir una instruccin en la que referencie cualquier direccin
de memoria y acceda ilegalmente a datos de reas no autorizadas. Esto se resuelve
con un sistema de proteccin.
3URWHFFLyQ
El sistema de proteccin se encarga de evitar el acceso indiscriminado a
cualquier rea de memoria. A partir del sistema de reubicacin dinmica resulta
fcil limitar las referencias a memoria que puedan hacerse desde un programa.
Para ello aadimos un registro ms al procesador: el 5HJLVWUR /tPLWH.
En la parte inferior de la Figura 7 vemos que para evitar un acceso indiscriminado
o por error a cualquier direccin de memoria, lo que se hace es cargar el registro
lmite al mismo tiempo que el registro base. El registro lmite expresa el tamao
del programa en ejecucin. Cada direccin virtual (relativa) a la que se hace
referencia en el proceso se compara con el valor del registro lmite, de tal forma
que si tal direccin es menor que el registro lmite, quiere decir que hace
referencia a una posicin dentro del programa, por lo que simplemente hay que
aadirle el contenido del registro base para obtener la direccin efectiva.
(Tambin puede realizarse la comprobacin del registro lmite paralelamente a la
suma del registro base). Si por el contrario, la direccin virtual excede al valor del
registro lmite, indica que se intenta un acceso a una posicin de memoria fuera
del rea ocupada por el programa, en cuyo caso habr que generar la
correspondiente excepcin de (UURU GH 'LUHFFLRQDPLHQWR para darle el tratamiento
pertinente.
El tamao que ocupa un proceso suele venir indicado en el mdulo cargable, y
puede guardarse en el BCP de cada proceso.
El uso de las particiones fijas es prcticamente nulo hoy da. Como ejemplo de un
sistema operativo con esta gestin de memoria tenemos al antiguo OS/MFT,
utilizado por los grandes ordenadores de IBM.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

5HXELFDFLyQ \ 3URWHFFLyQ

3DUWLFLRQHV )LMDV

+5(8%,&$&,1
/DV GLUHFFLRQHV GH XQ SURJUDPD VXHOHQ VHU
UHODWLYDV D VX GLUHFFLyQ GH FRPLHQ]R
3(52  DO PRQWDU XQ SURJUDPD QR VH VDEH
GyQGH VH YD D HMHFXWDU
62/8&,21(6

3 0RGLILFDFLyQ GH GLUHFFLRQHV GXUDQWH OD FDUJD


3 5HJLVWUR GH 5HXELFDFLyQ R UHJLVWUR EDVH
SHUPLWH UHXELFDFLyQ GLQiPLFD
6000

1345

'LU
9LUWXDO

4418

'LUHFFLyQ
5HDO

4200

747

5HJLVWUR GH
5HXELFDFLyQ
5D 
5E 
5F 

5166

A
2854

2341
0

512

(VSDFLR
9LUWXDO

(VSDFLR
5HDO

+3527(&&,1

'LUHFFLyQ
9LUWXDO

TvrhPrhvD

$SXQWHV GH 62 ,

5HJLVWUR
/tPLWH

5HJLVWUR
%DVH

5$0

(5525 GH
GLUHFFLRQDPLHQWR
BrvyqrHrvh&



*HVWLyQ GH 0HPRULD

 ,QWHUFDPELR GH 0HPRULD


En un sistema batch, la organizacin de la memoria en particiones fijas resulta
simple y efectiva. Siempre que se puedan mantener en memoria suficientes trabajos
como para mantener la CPU ocupada, no hay razn para complicar la organizacin.
En cambio, en un sistema de tiempo compartido la situacin es diferente, pues
normalmente hay ms usuarios que memoria para contener sus procesos, por lo
que se hace necesario llevar a disco los procesos en exceso. En cualquier caso,
debe quedar claro que para que pase a ejecucin alguno de estos procesos que se
han llevado a disco, antes hay que traerlo a memoria. Cuando al proceso en
ejecucin se le acabe su porcin de tiempo, es posible que se le vuelva a llevar a
memoria secundaria para dejar espacio al proceso que haya seleccionado el
planificador. Al trasiego de procesos que se llevan de memoria a disco y de disco a
memoria se le denomina LQWHUFDPELR (VZDSSLQJ).
El intercambio de memoria requiere un dispositivo de memoria secundaria.
Normalmente, ste suele ser un disco rpido, debe tener suficiente capacidad para
acoger las copias de todas las imgenes de memoria de todos los procesos y debe
proporcionar un acceso rpido y directo a estas imgenes. El rea del disco que
contiene este espacio de memoria virtual con el que se realiza el intercambio desde
memoria principal, recibe el nombre de iUHD GH LQWHUFDPELR o rea de VZDSSLQJ.
En la cola de Preparados se mantienen todos BCPs de los procesos dispuestos a
ejecutarse (cuyas imgenes de memoria se encuentran en memoria principal o
secundaria). Cuando el planificador elige un proceso para pasar a ejecucin, llama
al dispatcher, el cual, a su vez, comprueba si el proceso seleccionado se encuentra
en memoria principal o no. Si no lo est y no hay memoria libre, el GLVSDWFKHU saca a
un proceso de memoria a disco y trae a memoria el proceso seleccionado.
Seguidamente realiza el cambio de contexto.
Est claro que el tiempo de cambio de contexto en un sistema con intercambio es
bastante alto. Para obtener un buen aprovechamiento de la CPU, la porcin de
tiempo de los procesos deber ser alto en comparacin con el tiempo dedicado al
cambio completo de proceso, es decir, incluyendo el tiempo de intercambio. Pero
por otra parte, tenemos que en un sistema de tiempo compartido si la porcin de
tiempo es muy alta, el tiempo de espera de los procesos preparados sube mucho, lo
cual no es en absoluto deseable. Por lo tanto, lo que se debe conseguir es minimizar
lo ms posible el tiempo de intercambio. Para ello hay dos estrategias claras:
Utilizar una memoria secundaria muy rpida.
Intercambiar solamente la memoria necesaria.
La necesidad del primero de estos puntos es obvia. El segundo quiere decir que si
en un sistema hay un rea de usuario de 900 Kbytes, por ejemplo, y hay que sacar
un proceso que ocupa 100 Kbytes, no hay por qu mover a disco un rea de 900
Kbytes, sino solamente los 100 Kbytes ocupados, ya que el tiempo de intercambio
es prcticamente proporcional al tiempo de transferencia, que a su vez es
proporcional al tamao del bloque que se lee o escribe en el disco. Esto obliga a



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

,QWHUFDPELR GH 0HPRULD
%DWFK

7LHPSR
&RPSDUWLGR

6H DFHSWDQ WDQWRV WUDEDMRV FRPR TXHSDQ HQ


PHPRULD
6XHOH KDEHU PiV SURFHVRV GH XVXDULR GH ORV
TXH FDEHQ HQ PHPRULD
\ KD\ TXH DWHQGHUORV D WRGRV

$OJXQRV KD\ TXH OOHYDUORV D GLVFR


 \ SDUD HMHFXWDUORV KD\ TXH OOHYDUORV GH YXHOWD D OD PHPRULD
,17(5&$0%,2 '( 0(025,$
&XDQGR VH GHYXHOYH XQ SURFHVR D
PHPRULD SULQFLSDO
9XHOYH D VX SDUWLFLyQ RULJLQDO"
62/8&,1

2-2 DO VDFDU GH PHPRULD


SURFHVRV HQ HVSHUD GH (6

1R VDFDUORV QXQFD GH PHPRULD SULQFLSDO


5HDOL]DU (6 VREUH EXIIHUV GHO 62

3DUD XWLOL]DFLyQ HILFLHQWH GH OD &38 6L SRUFLyQ GH WLHPSR JUDQGH


7LQWHUFDPELR  3RUFLyQ GH 7LHPSR

+D\ TXH PLQLPL]DU HO


7LQWHUFDPELR

TvrhPrhvD

$SXQWHV GH 62 ,

7HVSHUD DOWR GH ORV SURFHVRV


SUHSDUDGRV

8WLOL]DQGR PHPRULD VHFXQGDULD


PX\ UiSLGD
8WLOL]DQGR VROR OD PHPRULD
QHFHVDULD
BrvyqrHrvh'



*HVWLyQ GH 0HPRULD

que el sistema operativo conozca la ocupacin de memoria de cada proceso y a que


lleve la cuenta de cada peticin o devolucin de memoria.
Cuando un proceso es sacado a disco, y posteriormente se le vuelve a traer a
memoria principal, es posible que no se le instale en la misma particin de memoria
que ocupaba la ltima vez que estuvo en RAM. Esto puede traer complicaciones si
el proceso est realizando operaciones de E/S. Supongamos que un proceso en
ejecucin realiza una operacin de E/S, con lo que el sistema operativo lo pone en
espera y lo expulsa a memoria secundaria para liberar su rea de memoria. Sin
embargo, es posible que el dispositivo de E/S acceda asncronamente a los EXIIHUV
que el proceso le indic, para dejar/recoger los datos a leer/escribir. Estos EXIIHUV se
encontraban en el rea de memoria que ocupaba el proceso cuando se estaba
ejecutando, pero cuando pas a espera y se le expuls al disco, este rea de
memoria pas a estar ocupada por otro proceso. As, es posible que el dispositivo
de E/S ahora est leyendo o escribiendo en un rea de memoria que pertenece a
otro proceso distinto del que solicito la operacin de E/S.
Este problema tiene dos soluciones:
No sacar nunca de memoria a un proceso que espera por una operacin de E/S.
Que los dispositivos de E/S realicen las operaciones sobre EXIIHUV del sistema
operativo. De esta manera, una vez finalizada la operacin de E/S solicitada,
cuando el planificador selecciona al proceso para continuar, se le trae a
memoria principal y se transfiere la informacin solicitada (si es que era una
lectura) del buffer del sistema al buffer del proceso. Por ltimo se le cede el
control del procesador.
Conviene recordar que para que un proceso pueda ocupar distintas particiones de
memoria durante una ejecucin completa, se requiere que el mecanismo de
reubicacin sea dinmico.

 0XOWLSURJUDPDFLyQ FRQ 3DUWLFLRQHV 9DULDEOHV


En principio, un sistema de intercambio podra estar basado en particiones de
tamao fijo, de tal forma que cuando un proceso queda bloqueado en espera, se le
puede mover al disco y traer otro a la particin que deja libre. Pero este sistema no
es aconsejable cuando se dispone de poca memoria principal, pues los programas
pequeos desperdician mucha memoria cuando ocupan particiones grandes
(fragmentacin interna). Otro enfoque mejor es el basado en particiones de tamao
variable.
Cuando se utilizan particiones variables, el nmero y tamao de los procesos
cargados en memoria vara con el tiempo, como se puede ver en la parte superior
de la Figura 9. Al principio se carga el proceso $, seguidamente el % y el &. A
continuacin el proceso $ termina (o se le expulsa al disco) y se carga el proceso ';
finaliza el % y se carga el (...


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

,QWHUFDPELR

0XOWLSURJ FRQ 3DUWLFLRQHV 9DULDEOHV

(Q ODV SDUWLFLRQHV GH WDPDxR ILMR


VH GHVSHUGLFLD PXFKD PHPRULD
)UDJPHQWDFLyQ ,QWHUQD

6H SLHUGH WLHPSR HQ UHDOL]DU


HO LQWHUFDPELR GH PHPRUD

3$57,&,21(6 '( 7$0$f2 9$5,$%/(


HO Q WDPDxR \ GLUHFFLyQ YDUtD FRQ HO WLHPSR

6 2

6 2

6 2

6 2
WLHPSR

)UDJPHQWDFLyQ ([WHUQD

D
6 2

D
6 2

D
6 2

&203$&7$&,1

3XHGH FUHFHU GLQiPLFDPHQWH OD PHPRULD GH XQ SURFHVR"


3LOD GH %

3DUD
FUHFLPLHQWR

'DWRV GH %
&yGLJR GH %

(Q XVR

3LOD GH %

3DUD
FUHFLPLHQWR

A
D

6 2

TvrhPrhvD

$SXQWHV GH 62 ,

'DWRV GH %
&yGLJR GH %

(Q XVR

3DUD
FUHFLPLHQWR

3DUD
FUHFLPLHQWR

6 2
BrvyqrHrvh(



*HVWLyQ GH 0HPRULD

La principal diferencia entre las particiones fijas y las de tamao variable es que en
estas ltimas el nmero, la direccin y el tamao de las particiones vara
constantemente a medida que los procesos van y vienen; mientras que en las de
tamao fijo no varan, son fijos.
La flexibilidad de no estar sujeto a un nmero fijo de particiones que resulten
demasiado grandes o demasiado pequeas mejora la utilizacin de la memoria,
pero tambin complica los algoritmos de asignacin, liberacin y contabilidad de la
memoria disponible.
Inicialmente toda la memoria de usuario est disponible, organizada como un nico
y gran bloque de memoria libre, un KXHFR. Cuando un proceso llega y necesita
memoria, se busca un hueco suficientemente grande para el proceso. Si se
encuentra uno, el hueco se parte en dos, asignndole nicamente la memoria
requerida, dejando el resto del hueco como un nuevo hueco ms pequeo y
disponible para futuras peticiones.
A medida que se crean procesos, se les pone en una cola de entrada, anotando sus
requisitos de memoria. Cuando se le asigna memoria a uno de estos procesos, pasa
a la cola de Preparados y puede competir por la CPU. Cuando un proceso termina
libera la memoria utilizada, con lo que el sistema operativo puede utilizarla para
asignrsela a otro proceso de la cola de entrada.
En un momento dado, se tiene una lista de bloques libres de memoria y sus
tamaos. Tambin se dispone de la cola de entrada de procesos. La memoria se va
asignando a los procesos hasta que no haya un hueco suficientemente grande para
el primer proceso de la cola de entrada, o bien se busca en la cola un proceso cuyos
requisitos de memoria sean menores y puedan satisfacerse con alguno de los
bloques disponibles.
En general siempre hay un conjunto de huecos de distintos tamaos dispersos por
toda la memoria. Cuando un proceso llega y necesita memoria, se busca en el
conjunto de huecos uno que sea suficientemente grande. Si el hueco es demasiado
grande, se parte en dos: uno se asigna al proceso, y el otro se devuelve al conjunto
de huecos. Cuando un proceso finaliza, se libera su bloque de memoria, que se
pone de vuelta en el conjunto de huecos. Si este hueco resulta estar adyacente a
otros huecos (a otros bloques libres), se unen los bloques adyacentes en un nico
bloque del tamao total. Ahora hay que comprobar si hay ms procesos esperando
memoria y si este nuevo bloque liberado y recombinado puede satisfacer las
demandas de cualquiera de estos procesos que estn esperando.
En algn momento puede darse el caso de que haya mucha memoria libre, pero
distribuida entre muchos huecos pequeos no adyacentes. Entonces tenemos
IUDJPHQWDFLyQ H[WHUQD. La nica solucin a la fragmentacin externa es la
FRPSDFWDFLyQ, que consiste en mover los bloques asignados, de tal forma que
queden adyacentes, dejando entonces grandes huecos libres que s pueden
asignarse a procesos. Obsrvese que la compactacin es posible gracias a que se
utiliza un sistema de reubicacin dinmica, por lo que todo lo que hay que hacer es



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

mover el programa a su nueva posicin de memoria y actualizar el registro base con


la nueva direccin de comienzo.
La compactacin tambin tiene su coste. Tngase en cuenta que hay que mover
todos los procesos hacia un extremo de la memoria, con lo que los huecos se van
moviendo hacia el extremo opuesto, hasta formar un nico gran bloque. Realizar
este proceso puede resultar bastante costoso en tiempo.
Consideremos ahora la cantidad de memoria que se le debe asignar a un proceso
cuando se le crea o se le lleva a memoria principal. Si los procesos se crean con un
tamao fijo que nunca cambia, la gestin de memoria es simple: se asigna
exactamente lo que necesita, ni ms ni menos. Pero si los procesos pueden crecer,
por ejemplo porque realizan peticiones dinmicas de memoria, se presenta un
problema cuando los procesos intentan crecer (necesitan ms memoria de la
requerida inicialmente). Si hay un hueco libre adyacente al proceso, se le puede
asignar el hueco al proceso y permitirle expandirse. Pero si el proceso est
adyacente a otro proceso, el que pretende expandirse tendr que moverse a otro
hueco ms grande, o bien habr que sacar algn proceso a disco para dejar espacio
libre.
Si se espera que los procesos de un sistema puedan aumentar su tamao a medida
que se ejecutan, es conveniente asignarles inicialmente un poco de memoria extra,
para evitar tener que moverles en caso de que necesite ms memoria durante la
ejecucin (Figura 9, abajo-a). Si el proceso tiene dos segmentos que pueden crecer,
por ejemplo el montculo (KHDS) y la pila, se suele utilizar la alternativa inferior-b de
la Figura 9, en la que se puede ver que cada proceso tiene una pila en la parte
superior de su memoria creciendo hacia direcciones bajas y, justo debajo, una zona
de montculo creciendo hacia las direcciones altas. La memoria entre estas dos
reas puede asignarse a cualquiera de ellas. Si se acaba este espacio (porque
intenten solaparse la pila y el heap), entonces ya no quedar ms remedio que
mover el proceso a otro hueco mayor.
El rea de KHDS es la zona de memoria de donde se sirven las peticiones dinmicas
de memoria, mientras que la pila se utiliza para ubicar datos temporales, como por
ejemplo: las variables locales, resultados intermedios en la evaluacin de
expresiones, parmetros y direcciones de retorno en las llamadas a procedimientos.
OS/MVT es uno de los antiguos e importantes sistemas operativos de IBM que
utilizaba particiones variables.

 *HVWLyQ GH %ORTXHV GH 0HPRULD


En general, hay tres mtodos utilizados por los sistemas operativos para llevar la
cuenta de la memoria utilizada y de los huecos libres:
Mapa de bits
Listas
Sistema EXGG\
$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

Vemoslos en los siguientes apartados.

 0DSDV GH %LWV


Con este mtodo de gestin de memoria, sta se divide en XQLGDGHV GH DVLJQDFLyQ,
cuyo tamao puede ir desde unas cuantas palabras a varios Kbytes. Como se
puede ver en la Figura 10, cada una de estas unidades de asignacin se
corresponde con un bit en el mapa de bits de memoria; la primera unidad con el
primer bit, la segunda con el segundo, etc., de tal forma que si el bit est a 0 indica
que la unidad de asignacin correspondiente se encuentra libre, mientras que si est
a 1 quiere decir que la unidad est ocupada, o sea, asignada a algn proceso.
El tamao de la unidad de asignacin es una cuestin muy importante. Cuanto ms
pequea sea la unidad, mayor ser el mapa de bits. No obstante, obsrvese que
incluso con una unidad de tan solo 4 bytes, tenemos que 32 bits de memoria
requieren solamente 1 bit en el mapa. Si la unidad de asignacin es de gran
tamao, habr pocas unidades, luego el mapa de bits ocupar poco espacio; pero
por contra, tenemos que puede empezar a ser significativo el espacio
correspondiente al 50% de memoria que por trmino medio se desperdicia en la
ltima de las unidades asignadas al proceso.
Este mtodo es simple y sencillo de implementar, pero tiene la desventaja de que
cuando se buscan Q unidades consecutivas de memoria para asignar a algn
proceso, se debe buscar en el mapa de bits hasta encontrar Q bits consecutivos a 0.
Aunque esta operacin es lenta, los procesadores actuales suelen incluir
instrucciones de bsquedas de cadenas de bits, favoreciendo as la utilizacin de los
mapas de bits.

 /LVWDV GH %ORTXHV


Otra forma de llevar la cuenta de la memoria utilizada es manteniendo listas
enlazadas de bloques libres y bloques asignados. En este caso, la memoria se
representa como una lista de bloques (Figura 10 inferior), en la que cada entrada o
elemento de la lista indica un hueco (bloque libre), con su direccin, tamao, y
direccin del siguiente elemento.
La lista de huecos suele mantenerse ordenada por la direccin de estos, pues as se
facilita su actualizacin cuando se lleva un proceso a memoria o termina su
ejecucin. Un proceso que termina tiene dos bloques adyacentes (excepto si est al
principio o al final de la memoria), cada uno de los cuales puede estar libre u
ocupado por otro proceso. Si alguno de estos bloques est libre, debe compactarse
con el bloque del proceso finalizado para formar un nico bloque libre. Esta
compactacin requiere actualizar la lista de huecos, pues habr que modificar, al
menos, la nueva longitud del bloque y, dependiendo de la posicin relativa de los
bloques compactados, su direccin de comienzo.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

*HVWLyQ GH %ORTXHV

0HPRULD FRQ ,QWHUFDPELR

6H GHEH OOHYDU OD FXHQWD


GH OD PHPRULD XWLOL]DGD \
GH ORV KXHFRV OLEUHV

0DSD GH %LWV
/LVWD GH %ORTXHV /LEUHV
6LVWHPD %XGG\

+ 0DSD GH %LWV
$

&

11111000
11111111
11001111
11111000
00111111

'

16

(
24

32

7DPDxR GH OD 8QLGDG GH $VLJQDFLyQ"


3HTXHxR

L 0DSD *UDQGH

*UDQGH

J 0DSD 3HTXHxR
L )UDJPHQWDFLyQ ,QWHUQD

+ /LVWD GH %ORTXHV /LEUHV


&DEH]D


 

 

QLO

&DGD HOHPHQWR FRQWLHQH


OD GLUHFFLyQ \ ORQJLWXG GH
XQ EORTXH OLEUH

&XDQGR VH HOLJH XQ EORTXH VL VREUD HVSDFLR VH SDUWH HQ GRV


IRUPDQGR XQ EORTXH OLEUH FRQ OD SDUWH VREUDQWH
3 (O SULPHUR TXH VLUYD

&yPR VH EXVFD
XQ EORTXH OLEUH

"

3 (O VLJXLHQWH TXH VLUYD


3 (O TXH PHMRU VH DGDSWH
3 (O TXH SHRU VH DGDSWH
3 2UGHQDU SRU WDPDxR

TvrhPrhvD

$SXQWHV GH 62 ,

BrvyqrHrvh



*HVWLyQ GH 0HPRULD

Este sistema de gestin en el que los bloques libres se mantienen en una lista, se
presta muy bien a la implementacin de estos algoritmos:

El primero que sirva (ILUVW ILW)


El siguiente que sirva (QH[W ILW)
El que mejor se adapte (EHVW ILW)
El que peor se adapte (ZRUVW ILW)

El algoritmo ms simple es HO SULPHUR TXH VLUYD. El gestor de memoria recorre la


lista hasta encontrar un hueco que sea suficientemente grande para satisfacer la
peticin. Si el hueco elegido no es exactamente del tamao solicitado, se divide en
dos partes: una (del tamao solicitado) se le asigna al proceso que lo solicit, y la
otra (con la memoria sobrante) se deja como un hueco de menor tamao.
La lista de los huecos libres se mantiene como una cabecera con los nodos de la
lista encolados a partir de ella. Cada vez que se realiza una bsqueda de un bloque,
se comienza por la cabecera, hasta encontrar el primero que sirva. Cuando se
encuentra el bloque, normalmente se parte en dos, uno para asignar al proceso, y
otro que se convierte en un hueco ms pequeo. Pues bien, lo que genera esto, a la
larga, es que cerca de la cabecera de la cola se empiecen a formar una serie de
bloques no contiguos y de pequeo tamao, inservibles para ningn proceso. A
partir de esta situacin, cada vez que se realiza una bsqueda, hay que recorrer
esta serie de bloques pequeos de manera infructuosa, hasta llegar a los bloques
que todava no han sido partidos, o no se han fraccionado demasiado. Esta
fragmentacin externa es inevitable, pero lo malo es la prdida de tiempo que
supone el atravesar reiteradamente la lista de los bloques pequeos agolpados al
comienzo de la lista.
Este problema se soluciona con HO VLJXLHQWH TXH VLUYD. Con este algoritmo, la lista
es circular, es decir, que el ltimo nodo apunta al primero y la cabecera no es
siempre la misma, sino que va rotando por la lista, es decir, que el orden de la lista
va rotando. Comienza por apuntar al primer bloque (en orden creciente de
direccin), pero tras realizar la primera bsqueda de un bloque, la cabecera apunta
ahora al bloque siguiente al asignado y as sucesivamente. Esto hace que los
bloques fraccionados no se amontonen en una parte de la lista sino que se
distribuyan de manera uniforme. As, cada vez que se comienza una bsqueda, no
habr que atravesar todos los bloques pequeos, sino solamente alguno, con la
consecuente ganancia de tiempo.
Si bien en HO SULPHUR TXH VLUYD se amontonaban los huecos pequeos al comienzo
de la lista, dejando al final grandes particiones libres, ahora la fragmentacin de la
memoria es uniforme en el espacio de direcciones, encontrndonos con que, a la
larga, ya no tenemos huecos grandes como en el algoritmo anterior, lo cual es un
problema si llega un proceso con grandes necesidades de memoria.
Otro algoritmo muy conocido es HO TXH PHMRU VH DGDSWH, que recorre la lista
completa para seleccionar el hueco que mejor se adapte, o sea, el menor de los que
sirvan, para no fraccionar un bloque grande que pudiera servir para alguna peticin
posterior.


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Este algoritmo es ms lento que los anteriores, pues tiene que recorrer la lista
entera por cada peticin. Sorprendentemente tambin desperdicia ms memoria,
pues tiende a ir rellenando la memoria con huecos tan pequeos que resultan
inservibles. En cambio, HO SULPHUR TXH VLUYD y HO VLJXLHQWH TXH VLUYD, al ir
fraccionando bloques, por termino medio generan bloques ms grandes que s
pueden ser aprovechables.
Para solucionar el problema de HO TXH PHMRU VH DGDSWH, se pens en utilizar la
poltica opuesta, es decir, elegir HO TXH SHRU VH DGDSWH; o sea, que se selecciona el
bloque ms grande de la lista y se parte en dos, generando as un nuevo bloque
libre que, aunque ms pequeo, seguramente tendr un tamao significativo,
evitando as la generacin de huecos pequeos. Sin embargo, la simulacin ha
demostrado que tampoco ha resultado ser una buena idea.
Para acelerar las bsquedas, puede ordenarse la lista por orden creciente de los
tamaos de los bloques. En este caso, los algoritmos HO SULPHUR TXH VLUYD y HO TXH
PHMRU VH DGDSWH coinciden, y HO VLJXLHQWH TXH VLUYD no tiene sentido, pues la lista
tiene un orden fijo no circular. El inconveniente que aparece con esta ordenacin es
la sobrecarga que se genera para mantener la lista ordenada cada vez que se pide
o se libera un bloque.
Para acelerar la bsqueda de los bloques se ha desarrollado otro algoritmo conocido
como 4XLFN )LW, que mantiene listas separadas de bloques para los tamaos ms
usuales, por ejemplo, una lista para bloques de 4 Kbytes, otra para los de 8 Kbytes,
12 Kbytes, etc. As, encontrar un bloque del tamao requerido es extremadamente
rpido. Su desventaja es la de todos los esquemas basados en el orden de bloques
por su tamao, o sea, la sobrecarga que se produce a la hora de liberar un bloque,
pues resulta difcil encontrar a sus vecinos para comprobar si se pueden compactar
con l.
En cuanto a la implementacin, conviene observar que los nodos de la lista no
tienen por que ser estructuras de datos que contienen la direccin y el tamao de
los bloques correspondientes. Cada nodo puede ser el propio bloque de memoria,
tal que los primeros y los ltimos bytes del bloque estn reservados (no son
utilizables por los procesos) e indican el tamao del bloque y la direccin del
siguiente bloque libre. Todos los bloques, los libres y los asignados tienen en el rea
reservada un campo booleano indicador de si dicho bloque est libre u ocupado,
facilitando as la tarea de la compactacin.

 6LVWHPD %XGG\


Como hemos visto, el problema de los algoritmos basados en el orden de los
bloques por su tamao es la lentitud en la fase de liberacin de un bloque. El
sistema %XGG\ (o de los compaeros) es un algoritmo que aprovecha el hecho de
que los ordenadores utilizan nmeros binarios en las direcciones, para as facilitar la
tarea de la compactacin de huecos adyacentes cuando se libera un bloque.
Veamos en qu consiste.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

6LVWHPD %XGG\

Brvyqr7yr

3
3

Giyrrhrrshppvrphhxrrpvhqr!
Trhvrrhhyvhphhxqvvuhhrphqhr

,QLFLDO
6vqr&

!#Fi

$
$
$

!'

9rryr6

!'

9vqr%

!'

%
%
%
%

9rryr7

!'

%#

7vqr"$
8vqr'

9rryr9

!$%

%#
%#
%#

'
'

"

!$%

$ !

!$%

$ !

"

!'

$ !

"

!'

$ !

!'

$ !

"

!'

$ !

$ !

"

&
&
&
&
&

9rryr8

J
J
L

%ORTXHV
OLEUHV

!'
!#Fi

@sipvyrphryrwiyryvir
@sipvypivhiyryvir

Tyuhriphryhyvhprqvrr

Pvtvhpuhshtrhpvyvrh

TvrhPrhvD

BrvyqrHrvh

El gestor de memoria mantiene una serie de listas de bloques libres, una para los de
tamao 1 byte, otra para 2, otra para 4, 8, 16, etc. hasta llegar a Q, siendo Q el
tamao total del rea de memoria libre inicial. Atendiendo al ejemplo de la Figura 11,
vemos que si, por ejemplo, partimos de un rea de memoria de usuario de 1Mbyte,
inicialmente toda ella est libre, se tiene una lista con una nica entrada
correspondiente a un bloque de 1 Mbyte y el resto de las listas estn vacas.
Cuando se recibe una peticin de un proceso $ de un bloque de 70 Kbytes, se
busca un bloque cuyo tamao sea la potencia de 2 que ms se aproxime por exceso
a los 70 K, esto es, 128 K. Pero no hay ningn bloque de 128 K, ni de 256 ni de 512.
Entonces se parte el bloque de 1M en dos bloques de 512 K (a los que se les llama
EXGLHV o compaeros). Uno de estos bloques se divide a su vez en dos nuevos
bloques de 256 K y por ltimo uno de estos se vuelve a partir en otros dos bloques
de 128 K. De estos dos ltimos bloques, uno de ellos se asigna al proceso que
realiz la peticin de los 70 K.
A continuacin, se recibe una peticin % de 35 K, cuya potencia de 2 ms cercana
es la de 64 K, pero no hay ningn bloque de 64 K disponible, as que partimos uno
de los bloques de 128 K en dos de 64, y uno de ellos se le asigna a %. Para servir la
peticin & de 80 K, es necesario partir uno de los bloques de 256 K en dos de 128,
asignando uno de ellos.
Obsrvese que cada vez que se ha dividido un bloque, se generan dos nuevos
bloques DG\DFHQWHV de la mitad del tamao.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Ahora tenemos que el proceso $ libera el bloque de 128 K (de los que slo utilizaba
70). Se acude a la lista de bloques de 128 K para ver si alguno de los bloques de
128 K es el compaero del liberado. En nuestro caso no lo es, por lo que
simplemente se mete el bloque liberado en esta lista de bloques de 128 K.
Seguidamente vuelve a haber una peticin ' de 60 K, y se asigna un bloque de 64
K que haba disponible. Ahora se libera el bloque del proceso %, de 64 K (ocupaba
35), pero como su compaero no est libre, no hay ninguna compactacin. A
continuacin finaliza el proceso ', liberando un bloque de 64 K (ocupaba 60). En
este caso, tenemos que el compaero de este bloque s esta libre, por lo que se
compactan formando un bloque de 128 K. Seguidamente se comprueba que este
nuevo bloque de 128 K tiene su compaero libre, por lo que se vuelven a compactar
para formar un nico bloque de 256 K. Cuando se libera el bloque del proceso &, de
128 K (ocupadas 80) se pueden realizar 3 compactaciones consecutivas dando
lugar al bloque original de 1 Mb de memoria libre.
La ventaja de este algoritmo sobre otros que tambin ordenan conforme al tamao,
k
es que cuando se libera un bloque de tamao 2 bytes, el gestor de memoria
k
solamente tiene que buscar en la lista de huecos de longitud 2 para ver si la
compactacin es posible.
La desventaja es su ineficiencia en el aprovechamiento de la memoria, debido a los
redondeos hasta una potencia de 2 en el tamao de los bloques asignados, dando
lugar, en consecuencia, a una fragmentacin interna.
La gestin de memoria del sistema operativo Linux tiene lugar en dos niveles,
disponiendo de gestin de memoria virtual (a alto nivel) y de gestin de memoria
fsica a bajo nivel. Para la gestin de memoria fsica utiliza este algoritmo %XGG\ o
de los Compaeros.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

 0HPRULD 9LUWXDO


En las distintas estrategias de gestin de memoria vistas hasta ahora, todas tienen
un objetivo comn: mantener muchos procesos en memoria simultneamente para
permitir la multiprogramacin. Y en cualquier caso, siempre hemos visto que se
requiere que un proceso est completamente en memoria principal antes de que se
pueda ejecutar.
Sabemos que para ejecutar las instrucciones de un programa, stas, al igual que
sus operandos, tienen que estar en memoria principal. Esta imposicin parece
necesaria y razonable, pero por desgracia limita el tamao de un programa al
espacio de memoria fsica (RAM).
Sin embargo, el examen de los programas reales nos muestra que en muchos casos
no es necesario que el programa entero permanezca siempre en memoria. Por
ejemplo:
Los programas suelen tener cdigo para manejar condiciones de error
inusuales. Ya que estos errores raramente se producen en la prctica, este
cdigo casi nunca se ejecuta.
A veces, las tablas, listas o matrices se declaran con ms tamao del que luego
realmente necesitan. Una matriz se puede declarar de 100 por 100 aunque
raramente ocupe ms de 10 por 10; o un ensamblador puede tener una tabla
para albergar a 3000 smbolos, aunque la media de los programas no tengan
ms de 200.
Ciertos programas pueden ofrecer ciertas caractersticas que nunca o raramente
se utilizan. Por ejemplo ciertas funcionalidades de programas como editores de
texto, hojas de clculo, bases de datos, etc.
Incluso aunque en algunos casos sea necesario ejecutar o recurrir a todas las partes
de un programa, no se necesita todo al mismo tiempo. Mediante el sistema de los
RYHUOD\V ya se consegua esto, pero se lograba gracias a la intervencin directa del
propio programador. En cambio, mediante la memoria virtual, esto se va a conseguir
de forma transparente al programador.
La memoria virtual es una tcnica que permite la ejecucin de procesos que pueden
no estar completamente en memoria principal. La principal ventaja de este esquema
es que los programas pueden ser mayores que la memoria principal. Esto se debe a
que se crea una abstraccin de la memoria principal, separando la memoria lgica,
tal como la ve el usuario, de la memoria fsica de la que realmente se dispone. Esta
tcnica libera al programador de las preocupaciones concernientes a las limitaciones
de la memoria.
La habilidad de poder ejecutar un programa que slo est parcialmente en memoria
principal acarrea los siguientes beneficios:



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

El tamao de un programa no est limitado por la cantidad de memoria fsica


disponible. Los usuarios escriben programas contando con un espacio de
direcciones virtuales extremadamente grande.
Debido a que cada programa puede necesitar para ejecutarse menos memoria
que la que ocupa su tamao total, se pueden cargar ms programas en
memoria para ejecutarlos al mismo tiempo, con la consiguiente mejora en el
aprovechamiento de la CPU.
Ya que de cada programa solamente hay que cargar la parte necesaria en un
momento dado, a la hora de cargar un proceso o expulsarlo a disco, se
necesitan menos operaciones de E/S debidas al intercambio, por lo que se
consigue una ejecucin global ms rpida.
Hasta ahora hemos dicho que con memoria virtual, el programador tiene a su
disposicin una cantidad de memoria extremadamente grande, y tambin hemos
dicho que para que un programa se ejecute, no tiene por qu estar completamente
en memoria en cada momento de su ejecucin. Va siendo hora de empezar a
aclarar cul es el fundamento de esta tcnica para ofrecer tanta memoria.
Sabemos que para ejecutar una instruccin, sta y sus operandos deben
encontrarse en memoria principal. Por qu no en memoria secundaria?
Simplemente porque el acceso es mucho ms rpido a memoria RAM que a los
discos, y por lo tanto los mecanismos de direccionamiento que se han establecido
en el procesador para hacer obtener los operandos de las instrucciones
convencionales saben hacer referencia directa a memoria principal, no a los
dispositivos perifricos.
Pues bien, se trata de tener cargada en el disco la imagen del proceso en ejecucin,
y en memoria principal solamente la parte necesaria para la ejecucin de la seccin
del programa que se est ejecutando en cada momento.
El ancho del bus de direcciones establece el rango de direcciones que puede
generar la CPU (GLUHFFLRQHV YLUWXDOHV). Por otra parte tenemos la memoria fsica,
es decir, los transistores que forman bytes o palabras, tal que cada uno de los bytes
tiene una direccin (GLUHFFLyQ UHDO). Normalmente pensamos que a cada direccin
que sale del procesador le corresponde una direccin fsica, pero claro, puede
suceder que haya instalada menos memoria de la permitida por el bus de
direcciones.
As, el procesador va alimentndose de instrucciones y datos que estn en RAM,
hasta que en un momento dado hace referencia a una direccin de memoria que
realmente no existe, es decir, que no tiene su correspondiente memoria fsica. Sin
embargo, la instruccin o dato que se est referenciando s se encuentra en la
imagen del proceso que reside en el disco duro, por lo tanto, lo que hay que hacer
es traerlo a memoria principal para permitir que la CPU termine de obtener el dato
solicitado a la memoria.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

0HPRULD 9LUWXDO
(Q PXFKRV FDVRV QR VH HMHFXWD HO SURJUDPD FRPSOHWR
3 &yGLJR SDUD JHVWLyQ GH HUURUHV LQXVXDOHV
3 7DEODV \ OLVWDV VREUHGLPHQVLRQDGDV
3 2SFLRQHV \ FDUDFWHUtVWLFDV UDUDPHQWH XWLOL]DGDV
+ $XQTXH VH HMHFXWH HO SURJUDPD FRPSOHWR
QR HV QHFHVDULR WHQHUOR FRPSOHWDPHQWH FDUJDGR HQ PHPRULD
J 6H SRGUtDQ HMHFXWDU SURJUDPDV PD\RUHV TXH OD 5$0
J 6H SRGUtDQ WHQHU PiV SURFHVRV HQ PHPRULD SULQFLSDO
J 0HQRV (6 SRU LQWHUFDPELR
0iV YHORFLGDG
/D 0HPRULD 9LUWXDO SHUPLWH OD HMHFXFLyQ GH
SURFHVRV TXH SXHGHQ QR HVWDU FDUJDGRV
FRPSOHWDPHQWH HQ PHPRULD SULQFLSDO
75$163$5(17( $/ 352*5$0$'25

6H RFXSD GH WHQHU OD PHPRULD GH XQ SURFHVR SDULGD HQ


WUR]RV H LU FDUJDQGR HQ PHPRULD SULQFLSDO HO WUR]R TXH
HV QHFHVDULR SDUD SRGHU FRQWLQXDU VX HMHFXFLyQ

7UR]RV ,JXDOHV

7UR]RV GH
WDPDxR YDULDEOH

3$*,1$&,1

6(*0(17$&,1

TvrhPrhvD



BrvyqrHrvh !

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Esto es lo que realizaba el programador mediante la tcnica de los RYHUOD\V o


solapamientos, pero con la memoria virtual, ahora se realiza de forma transparente
al programador, mediante software del sistema operativo, y soportado por la ayuda
del hardware que proporciona la MMU (0HPRU\ 0DQDJHU 8QLW).
En la memoria virtual vamos a tener que separar muy bien el conjunto de las
direcciones virtuales (las que salen de la CPU) de las direcciones fsicas o reales
(las que corresponden a memoria fsica instalada) y mediante los mecanismos
software y hardware pertinentes habr que traducir cada direccin virtual en su
correspondiente direccin real. Lo que puede pasar es que la direccin real de un
dato no corresponda a memoria principal, sino a memoria secundaria, por lo que
entonces habr que traer dicho dato a memoria principal para que la CPU pueda
continuar su ejecucin.
Para implementar los sistemas de memoria virtual, normalmente se utiliza la
SDJLQDFLyQ, que la veremos en el siguiente apartado. Tambin se puede
implementar mediante VHJPHQWDFLyQ, como lo hace el sistema OS/2 de IBM, pero
los algoritmos son bastante ms complejos que los de la paginacin, pues a
diferencia de las pginas, los segmentos son de tamao variable.

 3DJLQDFLyQ
En la gestin de memoria con intercambio, cuando haba que pasar un proceso a
ejecucin, era necesario traer el proceso entero de disco a memoria principal. Con
memoria virtual hemos dicho que no se trae todo el proceso, sino que cuando se
hace referencia a una direccin de memoria virtual cuya correspondiente memoria
fsica reside en disco, se trae el contenido de disco a RAM. Quiere esto decir que
la unidad de intercambio de memoria es el byte? Si lo fuera, dara lugar a que
continuamente se estuviesen generando operaciones de E/S, lo cual sera poco
eficaz. Claramente, parece ms conveniente utilizar bloques ms grandes, para
aprovechar de manera ms eficiente cada operacin de E/S.
Si el tamao de los bloques de intercambio es variable, por ejemplo de 1, 2, 3 y 4
Kb, podra fcilmente darse el caso de que sea necesario traer de disco a memoria
un bloque de 3 Kb y en memoria tener dos huecos libres de 1 Kb y 2 Kb, pero no
contiguos, con lo que a primera vista no podramos traer el bloque de 3 Kb a pesar
de disponer de 3 Kb libres en memoria principal, debido a la fragmentacin externa
existente. Para eliminar el problema de la fragmentacin externa, lo que se hace es
utilizar bloques de intercambio de tamao nico y dividir la memoria principal en
trozos del mismo tamao (de 512 bytes a 8 Kb), con lo cual a la hora de traer
cualquier bloque de disco a memoria, si hay un hueco libre, seguro que cabe, y
adems no se desperdicia ningn espacio sobrante. A cada uno de los bloques de
intercambio que estn en el disco o en memoria principal le llamaremos SiJLQD y a
cada uno de los huecos en que est dividida la memoria principal (est libre u
ocupado) le denominaremos PDUFR. O sea, que los marcos son espacios de
memoria principal de tamao fijo y de direcciones consecutivas, que pueden
albergar bloques de informacin, exactamente del mismo tamao, denominados
pginas.
$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

3DJLQDFLyQ

HrvhWvhy

Qht

Qht

Qht
Qht!

Qht
Uhiyhqr
Qitvh

Qht"

&38

qv



Hhp

Qht!

Hhp

Qht"

Hhp!

























Hhp



vhy




Qht


LU
G
D
LF
tV
I

Hrvh
Qvpvhy


Qht

@hpvqr

Hrvh

9vrppvrWvhyr

Trpqhvh

TvrhPrhvD

BrvyqrHrvh "

Nos encontramos, entonces, con que el espacio de direccionamiento virtual est


dividido en pginas y el espacio de direccionamiento fsico est dividido en marcos.
As pues, cuando la CPU genera una direccin virtual, sta estar contenida en una
de las pginas. Si tal pgina se encuentra en alguno de los marcos de memoria
fsica, se accede al dato; si no, habr que cargar esa pgina, residente en el disco
duro, en alguno de los marcos de memoria principal, y a continuacin acceder al
dato.
En un sistema sin memoria virtual, la direccin virtual 1 se corresponde con la
direccin fsica 1, la 2 con la 2, etc. Sigue siendo esto vlido con la memoria
virtual? Pues no. Si fuese as, en un sistema con una espacio de direccionamiento
virtual de 24 Mb y una memoria fsica de 4 Mb, por ejemplo, esto querra decir que
una referencia a una direccin comprendida en el rango de los 4 primeros
megabytes de memoria, siempre encontrara la pgina correspondiente en memoria
principal, pero qu pasara al hacer referencia a una direccin superior? habra que
traerla a memoria principal, pero a dnde? si no existen las direcciones fsicas
correspondientes.
Esto nos lleva a que hay que desligar la correspondencia directa y esttica entre
direcciones fsicas y virtuales, o lo que es lo mismo, hay que desligar una relacin
esttica entre pginas y marcos, y hacer que su relacin se establezca dinmica e
indirectamente mediante una tabla, a la que llamaremos WDEOD GH SiJLQDV. Esta
tabla, adems de guardar la correspondencia entre pginas y marcos, mantiene ms
informacin de control, como por ejemplo, el denominado ELW GH SUHVHQFLD, que
indica si una pgina dada se encuentra en un marco de memoria o no. El resto de la
informacin de control la iremos comentando a lo largo de este captulo.


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

As pues, veamos a grandes rasgos y con ayuda de la Figura 13, qu pasos se


suceden a partir de una referencia generada por la CPU:
1. La CPU hace referencia a una direccin virtual de memoria.
2. Se calcula a qu pgina corresponde tal direccin.
3. Mediante la tabla de pginas se comprueba si la pgina se encuentra en algn marco de memoria
fsica o en disco.
4. Si se encuentra en un marco, se traduce la direccin virtual a la direccin fsica que ocupa la
pgina.
5. Si no se encuentra en un marco, hay que traer la pgina desde disco a un marco libre de
memoria. Posteriormente habr que traducir la direccin virtual a la direccin fsica,
dependiendo del marco asignado a la pgina.
6. Por ltimo, se realiza la operacin de L/E sobre memoria principal solicitada por la CPU.

Ahora empezaremos a ver con detalle cada uno de estos pasos.


Comencemos con el FiOFXOR GH OD SiJLQD D SDUWLU GH XQD GLUHFFLyQ YLUWXDO. Para
saber a qu pgina corresponde una direccin, simplemente hay que dividir la
direccin dada entre el tamao de las pginas. El cociente es la pgina
correspondiente; el resto es el desplazamiento dentro de la pgina.
Este clculo se puede facilitar mucho si el tamao de la pgina es una potencia de
dos. Sabemos que con nmeros binarios, las multiplicaciones por 2, 4, 8, 16, etc., se
consiguen con 1, 2, 3, 4, etc. desplazamientos a la izquierda, y una divisin se
realiza con los correspondientes desplazamientos a la derecha. Esto quiere decir
que si, por ejemplo, se tiene un espacio de direccionamiento virtual de 1 Mb (220) y
12
20 12
8
un tamao de pgina de 4 Kb (2 ), habr 2 /2 = 2 = 256 pginas de 4 Kb cada
una. O sea, que de los 20 bits que ocupa una direccin virtual, el nmero de pgina
se obtiene desplazando la direccin 12 bits a la derecha, lo cual es lo mismo que
tomar directamente los 8 bits de mayor peso. Para cada una de las pginas, los
12
desplazamientos posibles van a ir variando de 0 a 2 . Ahora, seguramente, no
resulta difcil ver que, en nuestro ejemplo, el nmero de pgina de una direccin
virtual viene indicado por los 8 bits de mayor peso y el desplazamiento que ocupa
dicha direccin dentro de la pgina viene indicada por los 12 bits de menor peso de
la direccin.
As pues, habiendo elegido un tamao de pgina que sea potencia de 2, con ayuda
de un hardware muy elemental se puede conocer directa y rpidamente la pgina y
el desplazamiento de cada direccin.
Una vez descrito el algoritmo para obtener el nmero de la pgina referenciada, nos
interesa saber cmo se realiza la WUDGXFFLyQ GH GLUHFFLRQHV YLUWXDOHV HQ
GLUHFFLRQHV ItVLFDV.
El espacio de direcciones virtuales est dividido en bloques del tamao de una
pgina. Por lo tanto, una direccin virtual est formada por una pagina S y un
desplazamiento G dentro de la pgina, o sea por el par (SG), mientras que el espacio
de direcciones fsicas o reales est dividido en P marcos del mismo tamao de la
pgina, por lo que las direcciones fsicas estarn formadas por un marco m y un
$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

desplazamiento dentro del marco, es decir, por el par (PG). (Ver Figura 14). Por lo
tanto, para realizar la traduccin de direcciones virtuales a reales hay que construir
la funcin de correspondencia (SG) (PG). Recordamos que siendo MN el nmero
de bits de una direccin virtual, S ocupa los M bits de mayor peso de la direccin, y G
viene dado por los N bits de menor peso de la direccin, siendo 2j el nmero de
pginas del sistema y 2k el tamao de la pgina.
Sabemos que una pgina que se encuentre en memoria principal se encuentra en
uno de los marcos. Puesto que el tamao de las pginas y de los marcos es el
mismo, parece obvio que para una direccin virtual (SG) a la que le corresponde la
direccin fsica (PG), el desplazamiento G ser el mismo, tanto dentro de la pgina
como dentro del marco asignado. As, nicamente ser necesario realizar la
traduccin de pgina a marco (S P), por lo que la tabla de traduccin (tabla de
pginas) solamente tendr que tener tantas entradas como pginas, no tantas como
direcciones virtuales.
Pues bien, a partir de una direccin virtual (SG), se comprueba en la tabla de
pginas si la pgina S se encuentra en alguno de los marcos de memoria. Si es as,
se obtiene de la tabla el marco P que contiene la pgina. La direccin fsica es
entonces (PG).

7UDGXFFLyQ GH 'LUHFFLRQHV

3DJLQDFLyQ

0HPRULD
3ULQFLSDO

&38

'LU
9LUWXDO

P G

'LU
)tVLFD

7DEOD GH
3iJLQDV

TvrhPrhvD



BrvyqrHrvh #

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Obsrvese que, dado que el nmero de pginas puede ser mayor que el nmero de
marcos de memoria fsica, el nmero de bits de la direccin virtual puede ser mayor
que el de la direccin fsica.
Conviene saber que en el bus de direcciones, que se dirige desde la CPU a la
memoria principal, se encuentra interceptado por el hardware que nos ayuda a
realizar el proceso de traduccin, o sea, la Unidad de Gestin de Memoria (0HPRU\
0DQDJHPHQW 8QLW o MMU). sta recibe las direcciones virtuales y con ayuda de la
tabla de pginas genera las direcciones fsicas correspondientes, sin necesidad de
software adicional. (No obstante, hoy da la MMU suele estar integrada dentro de la
propia CPU).
Cuando en la referencia a una direccin virtual, la pgina correspondiente no se
encuentra en memoria principal, entonces decimos que se produce una IDOWD GH
SiJLQD. En este caso, las acciones a realizar son, como se indica en la Figura 15,
las siguientes:
1. La CPU genera una direccin virtual.
2. La MMU consulta el bit de presencia de la tabla de pginas y se comprueba que
la pgina de la direccin referenciada no se encuentra en memoria principal.
3. La MMU pone la CPU en espera y genera una interrupcin (que suele ser (UURU
GH %XV) que es capturada por el sistema operativo.
4. Las rutinas de carga de pginas del sistema operativo se encargan de localizar la
pgina referenciada en el disco y cargarla en un marco libre de la memoria
principal.
5. Se actualiza la tabla de pginas indicando que est presente y el marco en el que
ha sido cargada.
6. Termina el tratamiento de la excepcin.
7. La MMU indica a la CPU que debe rearrancar la instruccin que provoc la falta
de pgina.
8. Se continua la ejecucin de la instruccin a partir del direccionamiento que
produjo la falta de pgina. Esta vez ya no se producir la falta de pgina.
Obsrvese que en el intercambio de memoria se traan y llevaban procesos enteros
si haba un rea de memoria contigua suficientemente grande; con pginacin basta
con que se disponga de la memoria necesaria, aunque no sea contigua, pues el
proceso puede estar repartido entre varias pginas.
En principio, parece que cuando se produce una falta de pgina, son necesarias dos
transferencias entre memoria y disco: una para llevar la vctima al rea de
intercambio y otra para traer la pgina referenciada al marco que se acaba de
liberar. Esto duplica el tiempo de servicio de una falta de pgina, incrementando, por
lo tanto, el tiempo medio de acceso a memoria. Esta sobrecarga en tiempo puede
aliviarse utilizando el ELW GH HQVXFLDGR o bit de pgina modificada. En cada entrada
de la tabla de pginas hay un bit de ensuciado que se pone a falso cuando se
carga la pgina en memoria. Este bit permanece as hasta que se produzca una
$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

)DOWD GH 3iJLQD

Qhtvhpvy

6 2

Ahyhqritvh
@prpvy

Qthh

...
...
MOVE A,B
...
...

3DJ Q

Srsrrpvh

Hrvh


Srhhph

Qvpvhy

vppvy

7DEOD GH
3iJLQDV

6phyvhUQ

Hhp
Gvir

Gyrhitvhh

rvhvpvhy

TvrhPrhvD

BrvyqrHrvh $

escritura en la pgina, en cuyo momento el hardware lo pone a cierto, indicando


que la pgina ha sido modificada desde que se trajo de disco. De este modo, si en
algn momento esta pgina es elegida como vctima en una sustitucin, se
consultar el bit de ensuciado; si la pgina no ha sido modificada quiere decir que la
copia en memoria es idntica a la copia en disco, luego no hay motivo para escribirla
de nuevo en el disco. Si por el contrario ha sido modificada, habr que actualizarla
en el rea de intercambio. Con esta tcnica, el tiempo de sustitucin de pginas se
reduce a la mitad en el caso de que la vctima no haya sido modificada.
Una pregunta que nos podemos hacer es: Cuando en un sistema paginado, un
proceso va a pasar a ejecucin cuntas pginas se cargan? Si se carga un cierto
nmero de las pginas del proceso que va a pasar a ejecucin, decimos que es un
sistema de SDJLQDFLyQ FRQ SUHDOLPHQWDFLyQ. Esto tiene la ventaja de que evita los
retardos debidos a las faltas de pgina, pues ya no se producen; pero por contra,
cada cambio de contexto implica la carga de muchas pginas, de las que la mayora
quizs no se van a referenciar en su porcin de tiempo, y sin embargo va a conllevar
un gran tiempo en operaciones de E/S para cargar tales pginas. Por esto, la
mayora de los sistemas van cargando cada pgina a medida que se referencia,
bien para alimentar una instruccin o para obtener un operando, es decir, realizan
una SDJLQDFLyQ SRU GHPDQGD.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

(VWUXFWXUD GH OD 7DEOD GH 3iJLQDV


Ya dijimos que la funcin de correspondencia entre las direcciones virtuales y las
fsicas o reales se realiza mediante una tabla de pginas. Esta tabla tiene tantas
entradas como pginas existentes y cada entrada contiene informacin que, aunque
vara de unos sistemas a otros, suele estar compuesta de los siguientes campos:
3URWHFFLyQ. Expresa los permisos de acceso del proceso. En caso de tener
permiso para la operacin de lectura/escritura que se va a realizar, se consulta
el resto de los campos.
%LW GH SUHVHQFLD. Indica si la pgina est presente en memoria principal o no. Si
se encuentra en RAM, tambin tienen sentido los siguientes campos.
0DUFR RFXSDGR. Si la pgina se encuentra en memoria principal, este campo
expresa el marco que la contiene.
0RGLILFDGD ELW GH HQVXFLDGR . Este campo indica si el contenido de la pgina
ha sido modificado desde que se trajo de la memoria secundaria.
5HIHUHQFLDGD. Este campo booleano se pone a cierto cada vez que se hace
referencia a cualquier direccin de la pgina. Lo utiliza el sistema operativo para
ayudar a los algoritmos de sustitucin de pginas.
En caso de que la pgina referenciada no est cargada en memoria, sabemos que
se encuentra en el rea de intercambio del disco, pero en qu lugar concreto? La
direccin concreta de cada pgina virtual en el disco (cilindro, pista, sector), no se
indica explcitamente en ningn campo de la tabla de pginas. En su lugar, lo que se
hace es calcular la direccin. Esto se puede realizar fcilmente ya que el rea de
intercambio ocupa una porcin contigua del disco, o sea, que no est fragmentada,
bien sea por estar en una particin reservada para ello (caso de Unix y Linux), o por
estar en un fichero creado en por el sistema operativo en la generacin del sistema
(caso de Windows: Pagefile.sys) y que tampoco est fragmentado. Conociendo
la direccin de comienzo del rea de intercambio y el tamao de la pgina, el clculo
de la direccin de cada pgina es inmediato. De esta forma se ahorra mucho
espacio en la tabla de pginas.
Suele haber una tabla de pginas para cada proceso, en la que se expresan los
permisos de acceso que tiene a cada pgina. As, se consigue que un proceso no
pueda acceder o realizar operaciones indebidas con informacin que no le
pertenece o que no comparte con otros procesos.
Ya que puede haber varias tablas de pginas, los procesadores suelen disponer de
un registro denominado RBTP (Registro Base de la Tabla de Pginas) que apunta
en todo momento a la direccin de comienzo de la tabla activa. De esta manera, la
direccin de la entrada correspondiente a una pgina dada se obtiene as:
Dir. Entrada = [RBTP] + (N_pgina x Tamao_de_entrada)
En los sistemas de hoy da, dado su amplio espectro de direccionamiento, las tablas
de pginas pueden tener miles o millones de entradas, por lo que normalmente se

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

tendr cargada en memoria principal solamente una parte de una tabla de pginas
(la correspondiente al proceso en ejecucin), el resto se mantendr en disco. El
cambio de contexto tendr que incluir por tanto la carga y actualizacin de la tabla
de pginas del proceso que pasa a ejecucin, lo que viene a incrementar el tiempo
necesitado para realizar dicho cambio.
Dado el enorme rango de direccionamiento del que se dispone en los ordenadores
actuales, y teniendo en cuenta que los procesos suelen referenciar slo unas pocas
pginas durante su ejecucin, normalmente se utilizan unas pocas de los miles o
millones de entradas que contiene la tabla de pginas, con el consiguiente
desperdicio del espacio de memoria utilizado por las entradas de las pginas no
correspondientes al proceso. Para evitar esto, otra posible organizacin de la tabla
es la llamada WDEOD GH SiJLQDV LQYHUWLGD. En esta tabla, hay una entrada por cada
marco de memoria, conteniendo la direccin virtual de la pgina cargada en cada
marco.
Ahora solamente hay una tabla de pginas en el sistema, y cuando se genera una
direccin virtual (SG), hay que buscar en la tabla para ver si alguna de las entradas
contiene el nmero S de la pgina referenciada. Si la entrada i-sima contiene el
nmero de pgina referenciado, se forma la direccin real como (LG), siendo L el
nmero del marco, y G el desplazamiento.
Ya que solamente hay una tabla de pginas, antes de realizar el acceso, se debe
comprobar en el campo de proteccin si el proceso en curso tiene permiso para
realizar la operacin de lectura/escritura de esa pgina.
Ahora bien, ya que la tabla de pginas invertida solamente contiene informacin de
las pginas en memoria, que pasa cuando hay una referencia a una pgina que no
est cargada en memoria principal? Para esto se debe mantener una tabla de
pginas convencional completa. Ya que la tabla completa solamente es necesaria
cuando se produce una falta de pgina, no necesita estar disponible con la mxima
celeridad y, como puede ser muy voluminosa, suele estar ubicada en el disco duro,
paginada como una parte ms de la memoria.
Aunque las tablas invertidas reducen radicalmente la cantidad de memoria utilizada
para almacenar la tabla de pginas, tambin aumentan el tiempo de bsqueda de
una pgina en la tabla, ya que la tabla est ordenada por direcciones fsicas
(marcos) y hay que buscar en el contenido de cada entrada para encontrar la pgina
o direccin virtual buscada, por lo que puede llegar a ser necesario recorrer incluso
la tabla entera, lo cual puede suponer demasiado tiempo. Para mejorar esta
situacin, se pueden utilizar algoritmos KDVK o aleatorios para limitar esta bsqueda
a unas pocas entradas. Tambin se suele recurrir a la ayuda del hardware,
utilizando memoria asociativa para mantener la tabla invertida, o al menos, para
contener las entradas ms recientemente referenciadas.
Otra forma de organizar la informacin de control de las pginas consiste en
estructurarla en varios niveles de jerarqua, en lugar de tener una nica tabla muy
grande, dando lugar a las llamadas WDEODV PXOWLQLYHO, cuya organizacin la
trataremos en la descripcin del procesador Pentium de Intel.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

6RSRUWH +DUGZDUH
Como acabamos de ver, uno de los soportes para la tabla de pginas puede ser un
conjunto de registros dedicados a los que la CPU puede acceder con la misma
rapidez que a los registros generales. En los cambios de contexto, el GLVSDWFKHU
tendra que actualizar estos registros como el resto de los registros generales.
As era en el PDP-11, con direcciones de 16 bits y pginas de 8 Kb, por lo que la
tabla de pginas constaba de 8 entradas mantenidas en registros de acceso rpido.
Para otros pequeos ordenadores, la tabla de pginas puede llegar a tener hasta
256 entradas, por ejemplo; pero en la actualidad, la mayora de los ordenadores
permiten tablas que pueden tener millones de entradas, con lo que el uso de
registros rpidos no es factible. En su lugar, la tabla de pginas se mantiene
simplemente en memoria principal, y su direccin, cargada en un registro
denominado 5%73 (Registro Base de la Tabla de Pginas). Como ya vimos
anteriormente, para realizar una referencia a la pgina Q hay que acceder a la
ensima entrada de la tabla, obtener el marco P y formar la direccin como ya
sabemos. Pero segn esto, para cada referencia de la CPU a una direccin de RAM
se requieren dos accesos a memoria, uno para calcular la direccin real y otro para
acceder a la direccin calculada y realizar la operacin de lectura/escritura.
Claramente, esto ralentiza los accesos a memoria en un factor de 2, lo cual puede
resultar intolerable en ciertas circunstancias.
La solucin habitual a este problema consiste en utilizar una pequea memoria
asociativa de acceso muy rpido conocida como TLB (7UDQVODWLRQ /RRNDVLGH %XIIHU)
que contiene las entradas de los ltimos accesos a la tabla (de 8 a 2048). De este
modo se consigue un tiempo medio de acceso slo ligeramente mayor que en los
accesos directos a memoria.
El procesador Pentium de Intel cuenta con una memoria asociativa de 32 registros y
consigue una tasa de aciertos del 98%.
Para finalizar con la ayuda que se recibe del hardware en toda la operacin de
traduccin, solamente recordar que todo el proceso de conversin de direcciones
virtuales en reales se realiza bajo la direccin no de la CPU, sino de un procesador
especializado en este trabajo denominado MMU (0HPRU\ 0DQDJHU 8QLW), que se
sita entre la CPU y la memoria principal, recibiendo como entrada la direccin
virtual que viene por el bus de direcciones y generando a su vez, como salida, una
direccin real que va dirigida a la memoria. La utilizacin de memoria virtual es tan
comn hoy da, que los procesadores actuales suelen incluir la MMU en la misma
pastilla de la CPU.

 6XVWLWXFLyQ GH 3iJLQDV


Segn hemos visto hasta ahora, el tratamiento de una falta de pgina es como el
descrito en la Figura 15, esto es, simplemente hay que traer la pgina referenciada
desde disco a un marco libre de la memoria principal y rearrancar la instruccin que
origin la falta de pgina. Pero qu pasa si no hay ningn marco libre?

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

6XVWLWXFLyQ GH 3iJLQDV

3DJLQDFLyQ

&XDQGR QR KD\ PHPRULD SULQFLSDO SDUD WRGRV ORV SURFHVRV


QR KD\ QLQJ~Q PDUFR OLEUH
6DFDU XQ SURFHVR
GH PHPRULD

0 3 (
3iJ
HOHJLGD
1XHYD
SDJ

  
  

6867,78,5
81$ 3*,1$

(OHJLU YtFWLPD

6DFDU YtFWLPD
D GLVFR

3iJLQD QR
SUHVHQWH

$FWXDOL]DU QXHYD
SDJ (Q 73

&RPR HOHJLU OD SiJLQD D VXVWLWXLU"

YtFWLPD

7UDHU SiJLQD
UHIHUHQFLDGD

$/*25,702 '(
6867,78&,1

+ 6H GHVHD HO TXH JHQHUH OD PHQRU WDVD GH IDOWDV GH SiJLQD

3 3DUD HYDOXDUORV VH FRQVLGHUD  6HULHV GH 5HIHUHQFLD



 1 GH PDUFRV GLVSRQLEOHV

TvrhPrhvD



BrvyqrHrvh %

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Esta situacin no es extraa; pensemos que la memoria puede estar completamente


ocupada por dos motivos:
Se utilizan muchas pginas del proceso en ejecucin.
Se ha ido incrementando el grado de multiprogramacin hasta ocupar toda la
memoria principal, por lo que sta se encuentra ocupada por pginas de
diversos procesos.
En este ltimo caso, se podra optar por sacar alguno de los procesos
completamente a disco, es decir, todas sus pginas; pero puede que no sea una
buena idea, porque a lo mejor en la siguiente porcin de tiempo hay que volver a
cargar todas esas pginas. Puesto que lo nico que se necesita en este momento
es espacio para una pgina, la mejor salida para cuando se produce una falta de
pgina suele ser la sustitucin de alguna de las pginas que actualmente residen en
memoria principal por la que acaba de ser referenciada. El proceso de sustitucin
tiene los siguientes pasos:
1. Se elige la vctima, es decir, una pgina cargada en memoria principal, para
llevarla a disco y dejar un marco libre. La eleccin se realizar dependiendo de
la poltica de sustitucin de pginas.
2. Se lleva la pgina elegida al rea de intercambio del disco.
3. En la entrada de la tabla de pginas correspondiente a la vctima, se indica que
no est presente.
4. Se trae la pgina referenciada al marco que se acaba de dejar libre.
5. Se actualiza la entrada de la tabla de pginas correspondiente a la pgina que
se acaba de traer a memoria principal, indicando que est presente y
actualizando tanto el nmero de marco que ocupa como los campos de control
que sean necesarios en cada caso.
Nos queda un problema por resolver: cmo elegir la pgina a sustituir cuando no
hay ningn marco libre? Veamos ahora las distintas polticas de sustitucin de
pginas.

 $OJRULWPRV GH 6XVWLWXFLyQ GH 3iJLQDV


Hay muchos algoritmos de sustitucin; posiblemente cada sistema operativo tiene el
suyo particular; pero en cualquier caso todos persiguen lo mismo: seleccionar
pginas que causen la menor tasa posible de faltas de pgina.
La eficacia de los algoritmos de sustitucin se evala ejecutndolos sobre una serie
concreta de referencias a memoria y contabilizando el nmero de faltas de pgina
que se producen. A la serie de referencias a memoria se la denomina VHULH GH
UHIHUHQFLD o cadena de referencia. Las series de referencia se pueden generar
artificialmente (mediante un generador de nmeros aleatorios) o capturando todas
las referencias a memoria que se realizan en la ejecucin de un programa dado.
$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

Esta ltima alternativa produce una gran cantidad de datos, pues cada direccin
completa consta de muchos dgitos, y a nosotros solamente nos interesa el nmero
de pgina. Adems, cuando se hace una referencia a una pgina S, lo que sabemos
con certeza es que las sucesivas referencias a esa misma pgina no causarn una
falta de pgina si se realizan de forma inmediata, pues la pgina S seguro que est
en memoria; por lo tanto no merece la pena considerar referencias sucesivas a la
misma pgina.
Por ejemplo, si se comprueba que las direcciones generadas por un programa son
las siguientes:
0100, 0432, 0101, 0612, 0102, 0103, 0104, 0101, 0611, 0102, 0103
0104, 0101, 0610, 0102, 0103, 0104, 0101, 0609, 0102, 015
Si las pginas fueran de 100 bytes, la serie de referencia ser la siguiente:
1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1, 0
Para determinar el nmero de faltas de pgina que genera un algoritmo de
sustitucin sobre una serie de referencia determinada, tambin se necesita conocer
el nmero de marcos de memoria disponibles. Obviamente, cuanto mayor sea el
nmero de marcos, menor ser el nmero de faltas de pgina. Para la serie de
referencia de nuestro ejemplo, con tres marcos se tendran solamente tres faltas de
pgina, las correspondientes a la primera referencia a cada pgina. Si por el
contrario, solamente hubiera un marco, dara lugar a 11 faltas de pgina.
Para la evaluacin de los algoritmos que veremos a continuacin, utilizaremos la
siguiente serie de referencia:
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1
sobre una memoria con tres marcos.
3ULPHUD HQ (QWUDU  3ULPHUD HQ 6DOLU ),)2
Segn este algoritmo, cuando hay que dejar libre un marco de memoria, se debe
elegir la pgina que lleva ms tiempo en memoria.
En la Figura 17 se puede observar el comportamiento de este algoritmo para
nuestra serie de referencia.
La poltica FIFO es fcil de entender y de implementar, sin embargo su
comportamiento no siempre es bueno. Resulta buena eleccin cuando se descargan
pginas correspondientes a mdulos que no se van a volver a utilizar, por ejemplo,
la parte de inicializacin de un programa; pero resulta psimo cuando se elige una



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

pgina que contiene ciertas constantes que se cargaron al principio y que se utilizan
a lo largo de todo el programa, por lo que enseguida va a ser referenciada. Si
aplicamos este algoritmo a las estanteras de un supermercado, el resultado es
igualmente desastroso. Supongamos que en un supermercado se recibe una nueva
marca de jabn, y como no hay espacio en las estanteras se decide retirar el
producto ms antiguo del supermercado: se elimina el pan del las estanteras!
Hemos comentado anteriormente que, como parece obvio, a mayor nmero de
marcos de memoria, menos faltas de pgina. Sin embargo hay situaciones (como la
descrita en la Figura 17-inferior) en las que utilizando el algoritmo FIFO, al
incrementar el nmero de marcos, aumentan las faltas de pgina. Cuando se
produce esto, tenemos lo que se conoce como $QRPDOtD GH %HODG\.
Para implementar este algoritmo puede bastar con mantener una cola FIFO de las
pginas que entran en memoria principal. Las pginas que entran se van metiendo
al final de la cola, mientras que cuando hay que elegir una pgina para ser
sustituida, simplemente hay que tomar la que est en la cabeza de la cola.

6ytvqrTvpvy

3ULPHUD HQ (QWUDU  3ULPHUD HQ 6DOLU ),)2

Trvryhitvhryyrhivrrrvh
Trvyrrhrqvhrhpyhqritvh

J
L

7vr)8hqrqrphthyqyqrvvpvhyvhpvy
Hhy)8hqrqrphthhitvhpphr

vyvhqh

TrvrqrSrsrrpvh)
&

&

"

"

"

&

&

"

"

"

"

"

"

"

"

&

&

&

&

$AhyhqrQitvh

Qhhyhrvr) !"# !$ !"#$

TvrhPrhvD

$SXQWHV GH 62 ,

8"hp

(shyhqritvh

8#hp

shyh

$QRPDOtD
GH %HODG\
BrvyqrQpr &



*HVWLyQ GH 0HPRULD

$OJRULWPR SWLPR 237


El descubrimiento de la Anomala de Belady fue un incentivo para buscar el
algoritmo ptimo, es decir, el que genera la menor tasa de faltas de pgina. El
algoritmo ptimo dice:
Reemplazar la pgina que ms tiempo
vaya a tardar en ser referenciada.
En la Figura 18 vemos que para nuestra serie de referencia y con tres marcos de
memoria, solamente se producen 9 faltas de pgina, 6 menos que con el algoritmo
FIFO. Si ignoramos las seis faltas de pgina correspondientes a la carga inicial de
cada pgina (pues estas faltas son inevitables en cualquier algoritmo), este
algoritmo triplica en eficacia al FIFO.
Por desgracia, este algoritmo tan bueno resulta difcil de implementar, pues requiere
un conocimiento anticipado de la serie de referencia. Por lo tanto, suele utilizarse
principalmente para realizar estudios comparativos de otros algoritmos cuya
implementacin s es posible.

$OJRULWPR SWLPR

6ytvqrTvpvy

Srryhhyhitvh
rivrhhhqhrvyvhr

TrvrqrSrsrrpvh)
&

&

"

"

"

&

&

&

&

&

&

"

"

"

"

"

"

"

"

(AhyhqrQitvh

Bhhvhyhrhhqrshyhqritvhr

TvrhPrhvD



1R
5HDOL]DEOH

Trvyvhhh
rqvphhv

BrvyqrQpr

'

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

/D 0HQRV 5HFLHQWHPHQWH 8WLOL]DGD /58


Ya que la implementacin del algoritmo ptimo no es factible, se puede intentar
realizar alguna aproximacin que s sea posible.
La diferencia bsica entre el algoritmo OPT y el FIFO es que este ltimo utiliza el
momento en el que la pgina se carg en memoria, mientras que el OPT se sirve del
momento en el que la pgina va a ser utilizada. Puesto que no es posible saber
cundo va a ser referenciada una pgina, quizs se podra utilizar el pasado ms
reciente como una aproximacin al futuro ms cercano, es decir, elegir como vctima
a OD SiJLQD TXH OOHYD PiV WLHPSR VLQ VHU UHIHUHQFLDGD.
La sustitucin mediante LRU asocia a cada pgina la hora a la que fue referenciada
por ltima vez. Cuando hay que reemplazar una pgina, simplemente se elige la que
tiene la hora de referencia ms antigua.
Para la serie de referencia de nuestro ejemplo, el LRU genera 12 faltas de pgina,
que sin llegar a ser el algoritmo ptimo, s mejora bastante al FIFO.
Ya que en general es una buena poltica de sustitucin de pginas, es el algoritmo
ms comnmente utilizado, pues solamente se aprecia un comportamiento errneo
cuando se descarga una pgina que forma parte de un bucle que ocupa varias
pginas. Posiblemente al llegar al final de bucle hay que descargar la pgina que se
carg al comienzo del bucle, por lo que se est eligiendo una pgina que se va a
requerir inmediatamente.
La mayor pega que presenta este algoritmo es su implementacin. Hay dos
enfoques posibles:
Implementarlo con ayuda del hardware
Mediante un algoritmo puramente software
Una de las opciones ms sencillas consiste en utilizar un campo de las entradas de
la tabla de pginas, en el que se indica la hora cada vez que una pgina es
referenciada. Para elegir una vctima, hay que recorrer la tabla de pginas buscando
la entrada con la hora ms antigua. Adems de la sobrecarga que supone el tiempo
de bsqueda en la tabla, hay que aadir la escritura que hay que realizar en la tabla
de pginas cada vez que se referencia una pgina.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

0HQRV 5HFLHQWHPHQWH 8WLOL]DGD /58

6ytvqrTvpvy

Trvryhitvhryyrhivr
vrrsrrpvhqh
@hhvhpvyhy6ytvv

TrvrqrSrsrrpvh)
&

&

"

"

"

&

&

&

"

"

"

"

"

"

"

"

"

&

&

&

!AhyhqrQitvh

J
L

@trrhyrirvrhHvyvhq
Ahyyhphytipyrrphhvhitvh

,PSOHPHQWDFLyQ

8hqr
Qvyh

Srvrrhqhqryu8PTUPTP

$SUR[LPDFLyQ 0HGLDQWH 6RIWZDUH


TvrhPrhvD

BrvyqrQpr (

Una implementacin alternativa consiste en mantener una pila de las pginas en


memoria. Cuando se referencia una pgina, se elimina de la pila y se coloca en la
cima de sta. As, la pgina que est en la cima de la pila es la pgina ms
recientemente referenciada, mientras que la pgina que se encuentra en el fondo de
la pila es la que lleva ms tiempo sin ser utilizada. El mantenimiento de esta pila es
costoso, pues se requiere una lista de doble enlace, aunque al menos no hay que
recorrer la tabla de pginas completa como en el caso anterior. No obstante,
obsrvese que si cada referencia a memoria supone actualizar esta pila, para no
generar una sobrecarga inaceptable, debera ser la propia MMU la que se encargue
del mantenimiento de dicha pila.
Como vemos, para que cualquiera de estos mecanismos sea efectivo, debe
proporcionarse algn soporte hardware, cosa que muy pocas mquinas ofrecen; por
eso se recurre en muchos casos a algoritmos en los que se requiere muy poca o
ninguna ayuda del hardware, en los que se realizan, mediante algoritmos software,
aproximaciones al LRU puro. Veamos a continuacin el algoritmo ms utilizado en
estas aproximaciones.
$OJRULWPR GH OD 6HJXQGD 2SRUWXQLGDG GHO UHORM
Para la implementacin de este algoritmo, la nica asistencia que necesitamos del
hardware es la del ELW GH UHIHUHQFLD. Este bit es un campo ms de la tabla de
pginas, y se pone a 0 al cargar la pgina. Cuando una pgina es referenciada por
la CPU (lectura o escritura), el hardware pone el bit de referencia a 1. As, pasado



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

6XVWLWXFLyQ

$OJRULWPR GH OD  2SRUWXQLGDG GHO UHORM


),)2  %LW GH 5HIHUHQFLDGD
7UDWD GH HYLWDU HO SUREOHPD GHO DOJRULWPR ),)2

+6H WLHQH XQD FROD ),)2 FLUFXODU GH ODV SiJLQDV FDUJDGDV


6H DYDQ]D HO SXQWHUR KDVWD HQFRQWUDU XQD SiJLQD FRQ 5 
SRQLHQGR 5  D PHGLGD TXH DYDQ]D
&XDQGR VH HQFXHQWUD OD YtFWLPD VH VXVWLWX\H OD SiJLQD
LQVHUWDQGR OD QXHYD HQ HVD SRVLFLyQ GH OD FROD










TvrhPrhvD

$SXQWHV GH 62 ,





BrvyqrHrvh!



*HVWLyQ GH 0HPRULD

un tiempo, examinando el bit de referencia se puede determinar qu pginas han


sido accedidas y cules no. De esta forma, ya tenemos una primera aproximacin al
LRU: si una pgina no ha sido referenciada hasta ahora, se puede suponer que
tambin va a tardar en ser accedida; por lo tanto es una aspirante a la sustitucin.
Pero en un corto periodo de tiempo, seguramente todas las pginas en memoria
acabarn siendo referenciadas, y no sabemos en qu orden se ha ido accediendo a
ellas. Por eso se requiere algn refinamiento.
Para ello vamos a mantener una cola FIFO circular de las pginas cargadas (el
ltimo elemento apunta al primero de la cola), como se muestra en la Figura 20.
Este algoritmo sigue los siguientes pasos:
1. La lista FIFO circular se empieza a formar a medida que se empiezan a cargar las
primeras pginas en memoria. Nos serviremos de un puntero que en principio
apunta a la primera pgina.
2. En un momento dado, al ir a cargar una nueva pgina, se detecta que ya no hay
ningn marco libre. Hay que elegir una pgina a sustituir entre las de la lista.
3. Se analiza la pgina indicada por el puntero.
4. Si su bit de referencia est a 0, es la elegida. Se saca de la lista y en su lugar se
inserta la nueva pgina que se trae de disco. Se avanza el puntero al siguiente
elemento de la lista. Finaliza la seleccin.
5. Si est a 1, se pone a 0 y se avanza el puntero al siguiente elemento de la lista.
Vuelta al paso 3.
Aunque pueda ser un poco redundante, vamos a tratar de explicar el algoritmo con
un poco ms de prosa. Cuando haya que sustituir una pgina, comenzamos una
exploracin de la cola con la ayuda de un puntero. Se consulta el bit de referencia
de la pgina apuntada por el puntero; si el bit est a 0, la pgina es elegida como
vctima; si est a 1, suponemos que fue referenciada recientemente, por lo que se le
da otra oportunidad, o sea, se pone el bit de referencia a 0, y se mueve el puntero a
la siguiente pgina de la lista hasta encontrar una cuyo bit de referencia est a 0, y
poniendo tambin a 0 el bit de referencia de las pginas que se van analizando y
que aparecen como accedidas. De esta manera, una pgina que acaba de ser
analizada para ver si es sustituida, que tena el bit de referencia a 1 y se le acaba de
poner a 0, tiene la oportunidad de volver a ser referenciada antes de que el gestor
de memoria de una vuelta completa recorriendo la cola en busca de pginas a
sustituir.
Tngase en cuenta que cuando se empieza a buscar una pgina en la lista circular,
no se empieza siempre desde el mismo punto, sino desde la posicin en la que
termin la bsqueda anterior.
A medida que van siendo necesarias sustituciones de pginas, se va avanzando por
la cola circular hasta encontrar una pgina con el bit de referencia a 0. Una vez que
se elige una pgina, se extrae de la lista y en su lugar se inserta la correspondiente
a la nueva pgina que se trae de disco. Si en dar una vuelta completa a la cola se



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

tarda un tiempo medio 7, esto significa que en un momento dado, si una pgina
tiene su bit de referencia a 1, quiere decir que ha sido accedida por ltima vez en un
espacio de tiempo menor que 7, por lo que no sera una buena eleccin como
pgina a sustituir.
En resumen, este algoritmo indica las pginas que han sido accedidas muy
recientemente, por lo que simplemente hay que elegir cualquiera de las restantes.
Ntese que en el peor de los casos, cuando los bits de referencia de todas las
pginas estn a 1, el gestor de memoria recorre toda la cola, y al empezar la
segunda vuelta ya habr una pgina con el bit a 0. Esto quiere decir que este
sistema degenera en un algoritmo FIFO puro cuando todos los bits de referencia
estn a 1.
Este algoritmo se puede mejorar si entre las pginas que tiene el bit de referencia a
0 se busca alguna que tambin tenga a 0 el bit de ensuciado, pues as no habra
necesidad de escribirla en el disco antes de cargar la nueva pgina.

 &XHVWLRQHV GH 'LVHxR


En los apartados anteriores hemos explicado cmo funciona un sistema de memoria
virtual paginada, as como algoritmos de sustitucin de pginas cuando la memoria
fsica no puede contener todas las pginas necesarias. Pero esto no es suficiente
para hacer que un sistema se comporte de una manera correcta y eficiente. En esta
seccin comentaremos algunas cuestiones que se deben tener en cuenta si se
quiere obtener un buen rendimiento de un sistema de memoria paginada.

 7UDVLHJR
Supongamos que en un momento determinado, sobre un sistema con pocos marcos
de pgina, un proceso que ocupa muchas pginas est ejecutando de forma cclica
una porcin de cdigo que implica a unas cuantas pginas. Vamos a llamar a stas
pginas activas. Si cuando va a cargar una de estas pginas se encuentra que no
hay ningn marco libre, tendr que elegir una vctima entre las pginas activas
cargadas (u otra de otro proceso) para sustituirla por la recin referenciada. Por
desgracia, est eligiendo (irremediablemente) una pgina que va a ser referenciada
muy pronto, por lo que se volver a producir otra falta de pgina, y as
sucesivamente.
Cuando se produce esta situacin, se empieza a dedicar ms tiempo a operaciones
de E/S por la paginacin que a ejecutar las instrucciones propias del programa.
Entonces se dice que se produce WUDVLHJR.
Veamos como se llega a producir el trasiego:

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

1. Se advierte una baja utilizacin de la CPU.


2. Se aumenta el grado de multiprogramacin, es decir, se cargan ms procesos.
3. Se hace necesario utilizar marcos de pgina de otros procesos cargados.
4. Se producen faltas de pgina.
5. Al paginar, los procesos causantes pasan a estado de espera.
6. La cola Preparados se vaca, pues empieza a haber muchos procesos en
espera.
7. Disminuye el aprovechamiento de la CPU. Vuelta al paso 1.
Este ciclo se repite hasta que se produce un colapso, o sea, que los procesos
pierden todo el tiempo en paginar y no ejecutan instrucciones propias.
En general, a medida que el grado de multiprogramacin crece, tambin lo hace el
aprovechamiento de la CPU, aunque no de forma lineal, sino cada vez ms
lentamente, hasta que se alcanza el mximo aprovechamiento posible de la CPU. Si
llegado este punto se incrementa el grado de multiprogramacin, aparece el trasiego
y el rendimiento de la CPU cae drsticamente.
Para evitar el trasiego, a cada proceso se le deben proporcionar los marcos de
memoria que necesita para mantener sus pginas activas, para que cuando
necesite cargar una pgina, sustituya uno de los marcos utilizados por l, no por otro
proceso. Pero cmo saber cuntos marcos ocupan las pginas activas? Esto lo va
a indicar el conjunto de trabajo, que a su vez se basa en el llamado principio de
localidad de los procesos en ejecucin.
Una localidad es el conjunto de pginas que realmente se estn utilizando de forma
activa en un momento determinado. Normalmente un programa est compuesto por
varias localidades diferentes, que adems pueden solaparse. El SULQFLSLR GH
ORFDOLGDG dice que a medida que un proceso se ejecuta, se mueve de localidad en
localidad.
Por ejemplo, cuando se llama a un subprograma, ste define una nueva localidad.
En esta localidad las referencias a memoria se realizan a instrucciones y datos
locales del subprograma, y posiblemente a algunas de las variables globales.
Cuando se sale del subprograma, el proceso abandona esta localidad, pues las
variables locales y las instrucciones que lo componen ya no van a estar en uso
activo, aunque quizs posteriormente se vuelva a esta localidad. As vemos que las
localidades vienen determinadas por la estructura del programa y por sus
estructuras de datos.
Supongamos que le asignamos a un proceso suficientes marcos para acomodar su
localidad actual. Se producirn faltas de pgina de esta localidad hasta que se
carguen todas ellas en memoria; despus, no se volvern a producir faltas de
pgina hasta que se cambie de localidad. Si no se le asignan suficientes marcos, se
producir trasiego, pues no podr mantener en memoria todas las pginas que est
utilizando de forma activa.


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

7UDVLHJR

&XHVWLRQHV GH 'LVHxR

6L XQ SURFHVR QR WLHQH PDUFRV SDUD ODV SiJLQDV DFWLYDV


)DOWD GH 3iJLQD

75$6,(*2

6XVWLWXFLyQ SRU RWUD TXH


QHFHVLWDUi HQVHJXLGD

6H GHGLFD PiV WLHPSR


D SDJLQDU TXH D
HMHFXWDU HO SURJUDPD

25,*(1

%DMD XWLOL]DFLyQ GH OD &38


6H DXPHQWD HO JUDGR GH PXOWLSURJUDPDFLyQ
6H XWLOL]DQ PDUFRV GH RWURV SURFHVRV
6H SURGXFHQ IDOWDV GH SiJLQD
$O SDJLQDU ORV SURFHVRV SDVDQ D HVSHUD
/D FROD GH 3UHSDUDGRV VH YDFtD
'LVPLQX\H OD XWLOL]DFLyQ GH OD &38

&RODSVR

/RV SURFHVRV SLHUGHQ WRGR HO WLHPSR HQ SDJLQDU


3DUD (YLWDU HO 7UDVLHJR
3 6XVWLWXFLyQ GH SiJLQDV ORFDOHV
3 $VLJQDU HO &RQMXQWR GH 7UDEDMR
3 )UHFXHQFLD GH IDOWD GH SiJLQD
3 6XVSHQGHU HO SURFHVR

TvrhPrhvD

$SXQWHV GH 62 ,

BrvyqrHrvh!



*HVWLyQ GH 0HPRULD

Por tanto, tenemos que las referencias a memoria que realiza un proceso, no estn
uniformemente distribuidas por el espacio de memoria, sino concentradas sobre la
localidad en ejecucin.
El PRGHOR GHO FRQMXQWR GH WUDEDMR est basado en el principio de localidad, y utiliza
un parmetro, , para definir la YHQWDQD GHO FRQMXQWR GH WUDEDMR. La idea es
examinar las referencias a pginas ms recientes. El conjunto de pginas
accedidas en estas ltimas referencias, forman el conjunto de trabajo. As, si una
pgina est en uso activo, estar en el conjunto de trabajo, si deja de utilizarse,
posiblemente dejar de formar parte de l unidades de tiempo despus de su
ltima referencia. As es cmo el conjunto de trabajo es una aproximacin de la
localidad del programa.
Por ejemplo, dada la siguiente secuencia de referencias a pginas de memoria,
. . .2 6 1 5 7 7 7 7 5 1 6 2 3 4 1 2 3 4 4 4 3 4 3 4 4 4 1 3 2 3 4 4 4 1 3 . . .

t2
t1
para un tamao de ventana =10, es decir que tiene en cuenta las ltimas 10
referencias a memoria, tenemos que el conjunto de trabajo en el momento t1 es
CT (t1, 10) = {1, 2, 5, 6, 7}
mientras que para el momento t2, habr cambiado a
CT (t2, 10) = {3, 4}
El tamao del conjunto de trabajo en un momento dado para un proceso L lo
podemos llamar TCTi, pues bien, la demanda total de marcos (D) de todos los
procesos del sistema en un momento determinado ser:

D = TCTi
Si el nmero de marcos necesarios es mayor que el nmero de marcos existentes,
se producir trasiego, pues algn proceso no tendr suficientes marcos para su
conjunto de trabajo.
Si el tamao de la ventana es igual a todas las referencias a memoria realizadas
por el programa, el conjunto de trabajo a su terminacin tendr el lmite mximo, es
decir, todas las pginas utilizadas por el programa; sin embargo, puesto que se ha
observado que el conjunto de trabajo vara muy lentamente, se puede elegir un
tamao mucho ms pequeo, para el que la tasa de faltas de pgina sea razonable
en relacin a la memoria disponible.
Lo que al sistema operativo le resulta difcil en la prctica, es llevar la cuenta del
conjunto de trabajo de cada proceso para asignarle ese nmero de marcos. Si



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

mediante algn mecanismo se pudiera conocer, a la estrategia planificacin de


procesos y de sustitucin de pginas se le debera aadir la siguiente condicin:
1R UHHPSOD]DU QXQFD XQD SiJLQD TXH IRUPH SDUWH GHO FRQMXQWR GH WUDEDMR GH
DOJ~Q SURFHVR QL SDVDU DO HVWDGR GH HMHFXFLyQ D XQ SURFHVR FX\R FRQMXQWR
GH WUDEDMR QR SXHGD FDUJDUVH FRPSOHWDPHQWH HQ PHPRULD

 7DPDxR GH 3iJLQD


Al disear un sistema operativo se debe tener en cuenta el tamao de las pginas
de memoria, y no existe un tamao perfecto, sino que ste depende de una serie de
factores que se deben tener en cuenta. Lo que s es invariable es que el tamao es
una potencia de 2, y suele estar entre 512 bytes y 4 u 8 Kb.
A los programas se les asigna un nmero entero de pginas, por ello, normalmente,
en la ltima de ellas queda espacio sin utilizar; es decir, que se produce
fragmentacin interna. Por trmino medio, se suele desaprovechar media pgina por
cada programa cargado, por lo que parece que cuanto ms pequea fuese la
pgina, menor sera el espacio desperdiciado.
Sin embargo, parece obvio que para un espacio virtual dado, cuanto ms pequeas
sean las pginas, mayor ser el nmero de ellas. Por ejemplo, para una memoria de
4 Mb (222) se pueden tener 4096 pginas de 1024 bytes, o 512 pginas de 8192
bytes.
Entonces, a ms pginas, mayor tamao de la tabla de pginas. Teniendo en
cuenta que en algunos sistemas hay una tabla de pginas por cada proceso, vemos
que una pgina pequea puede dar lugar a un espacio muy voluminoso dedicado a
tablas de pginas.
Otro problema que radica en el tamao de la pgina es el tiempo dedicado a las
operaciones de E/S para la carga y descarga de pginas. Para cualquier operacin
con el disco, sabemos que el tiempo de posicionamiento del brazo y el tiempo de
latencia (o retardo rotacional) son fijos e independientes del tiempo de transferencia.
Pues bien, puesto que estos dos tiempos son constantes, son preferibles las
pginas grandes, para realizar pocas operaciones de E/S con gran transferencia de
datos, frente a muchas operaciones de poca cantidad, puesto que crece el tiempo
debido a estos dos factores constantes.
Sin embargo hay programas cuyo conjunto de trabajo est formado por un gran
nmero de regiones pequeas y separadas en el espacio de direcciones, por lo que
nos encontramos que para la lectura de un cierto dato se hace necesario leer una
pgina completa, y si sta es muy grande, se pierde mucho tiempo de transferencia
en cargar y descargar informacin que no se va a utilizar.
Como vemos, para determinar el tamao ptimo de la pgina es necesario conocer
el tipo de programas que se suelen ejecutar en un sistema. No obstante, la
tendencia histrica es hacia pginas cada vez ms grandes, probablemente debido

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

a que crece ms deprisa la velocidad y la capacidad en los procesadores y en las


memorias RAM que en los discos magnticos.

7DPDxR GH 3iJLQD

&XHVWLRQHV GH 'LVHxR

HVSDFLR VLQ XWLOL]DU


4XHGD
HQ OD ~OWLPD GH HOODV

6L HO WDPDxR GH XQ SURJUDPD QR
OOHQD XQ Q~PHUR H[DFWR GH SiJLQDV
3URJUDPD
 E\WHV
7DPDxR GH SiJLQD  E\WHV
2FXSD  SiJLQDV FRPSOHWDV [

1HFHVLWD  SiJLQDV


'H OD ~OWLPD SiJLQD RFXSD



'HVDSURYHFKD







)UDJPHQWDFLyQ
,QWHUQD

3DUD XQ WDPDxR GH SiJLQD W


SRU WpUPLQR PHGLR VH GHVDSURYHFKD W SRU SURJUDPD
,QWHUHVDQ SiJLQDV SHTXHxDV
3(52
3iJLQDV SHTXHxDV
0XFKDV SiJLQDV
7DEOD GH 3iJLQDV JUDQGH

3 +Z PiV FDUR


0iTXLQD PiV FDUD
3 0iV WLHPSR GH
WUDQVIHUHQFLD GHVGH PHPRULD
VHFXQGDULD

/D SiJLQD SHTXHxD LQWHUHVD FXDQGR HO FRQMXQWR GH WUDEDMR HVWi


IRUPDGR SRU XQ JUDQ Q~PHUR GH UHJLRQHV SHTXHxDV \ VHSDUDGDV
HQ HO HVSDFLR GH GLUHFFLRQHV YLUWXDOHV

TvrhPrhv D



BrvyqrH rvh!!

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

 6HJPHQWDFLyQ
Un aspecto importante de la gestin de memoria es la separacin que hay entre la
visin que el usuario tiene de la memoria y la memoria fsica que realmente existe.
La visin que el usuario tiene de la memoria no es la misma que la memoria fsica
real, por lo que se requieren las conocidas conversiones entre la memoria lgica y la
memoria fsica.
Sabemos que la memoria fsica se representa mediante un espacio de direcciones
consecutivas, sin otra relacin que la de orden, tal que cada direccin se
corresponde con un byte de memoria fsica, sin mantener ninguna agrupacin lgica
entre ellos, y sin tener propiedades que no sean las caractersticas fsicas de la
memoria (RAM, ROM, tiempo de acceso, etc.).
Para el programador, un programa consta de varios elementos lgicos que son los
que l maneja, tales como el programa principal; un conjunto de procedimientos y
funciones; estructuras de datos, como tablas, registros, pilas, variables elementales,
constantes, etc. Y se refiere a ellos en el programa sin preocuparse de la posicin
real de memoria fsica que van a ocupar.
Algunas partes del programa pueden ser de tamao fijo, como las que contienen
cdigo o instrucciones, pero otras no tienen por qu serlo, sino que estructuras de
datos como las tablas varan de tamao a medida que discurre la ejecucin del
programa. Tambin pueden tener ciertas propiedades dependientes de la estructura
del programa, no de la memoria fsica que ocupan, como por ejemplo: la porcin de
cdigo de un programa puede tener solamente permiso de lectura, al igual que los
datos declarados como constantes, mientras que las estructuras de datos variables
pueden tener permiso de lectura y escritura. Puede haber estructuras de datos
pblicas con permiso de lectura para todos los procesos que deseen acceder a
ellas, mientras que los datos confidenciales pueden tener restringido su acceso a
ciertos procesos.
Para ir introduciendo el concepto de Segmentacin nos serviremos del siguiente
cuadro comparativo, en el que se comentan algunas diferencias bsicas entre la
paginacin y la segmentacin.
3DJLQDFLyQ
Con la paginacin se realiza una organizacin
lgica de la memoria, dividindola en pginas,
y haciendo referencia a los objetos mediante la
tupla (pgina, desplazamiento), pero la divisin
que hace no tiene en cuenta para nada la organizacin de los programas que se ejecutan,
sino que considera solamente caractersticas
del hardware subyacente, como la cantidad de
memoria principal, y peculiaridades del dispositivo de almacenamiento secundario, como
tiempo de acceso, tamao del sector, etc. es
decir, que es transparente al proceso que se
est paginando.

$SXQWHV GH 62 ,

6HJPHQWDFLyQ
Con la segmentacin, la memoria no se divide
en pginas de igual longitud, sino en segmentos de distinto tamao; y las referencias a los
objetos no se realizan mediante el par (pgina,
desplazamiento), sino con (segmento, desplazamiento), donde el segmento se corresponde
directamente con un objeto del programador
(con sus propiedades correspondientes), no
simplemente con una mera porcin de memoria
fsica. Ahora los mecanismos de gestin de
memoria se van a referir a los objetos de una
forma parecida al programador, indicando un
nmero de segmento, y el desplazamiento
dentro de l.



*HVWLyQ GH 0HPRULD

6HJPHQWDFLyQ

0HPRULD 9LUWXDO

&yPR YH HO SURJUDPDGRU OD PHPRULD SULQFLSDO"


                      

(VSDFLR )tVLFR GH 'LUHFFLRQHV


3(52 SDUD HO SURJUDPDGRU XQ SURJUDPD FRQVWD GH
XQ SURJUDPD SULQFLSDO FRQ XQ FRQMXQWR GH SURFHGLPLHQWRV
IXQFLRQHV WDEODV SLODV YDULDEOHV HWF
6,1 (0%$5*2 HO SURJUDPDGRU VH UHILHUH D HVWRV REMHWRV
SRU VX QRPEUH VLQ SUHRFXSDUVH GH OD SRVLFLyQ UHDO TXH
RFXSDQ HQ PD PHPRULD

&DOFXORB[

3
L
O
D

5DL]
FXDGUDGD
7DEOD GH
6tPERORV

9,67$ /*,&$
'( /$
0(025,$

3URJUDPD
3ULQFLSDO

6HUtD ~WLO SHQVDU TXH VH GLVSRQH GH XQD PHPRULD


GLIHUHQWH SDUD FDGD XQR GH ORV REMHWRV R JUXSRV GH
REMHWRV HQ ORV TXH SLHQVD HO SURJUDPDGRU ROYLGiQGRVH
GH VX WDPDxR \ GH VX GLUHFFLyQ

6(*0(1726
TvrhPrhvD



BrvyqrHrvh!"

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

6HJPHQWDFLyQ

0HPRULD 9LUWXDO

(63$&,2 /*,&2
'( ',5(&&,21(6
5DL]
FXDGUDGD

&DOFXORB[
6HJ 
/RQJ 

3
L
O
D
6 
/ 

6HJ 
/RQJ 

7DEOD GH
6tPERORV

6HJ 
/RQJ 

3URJUDPD
3ULQFLSDO
6HJ 
/RQJ 

',5(&&,1 6(*0(17$'$
1 6HJPHQWR
\
'HVSOD]DPLHQWR

/D VHJPHQWDFLyQ HV XQ VLVWHPD GH JHVWLyQ GH PHPRULD


FRQVLGHUiQGROD FRPR OD YH HO XVXDULR
(O 352*5$0$'25

QR VH SUHRFXSD GH UHIHUHQFLDU VHJPHQWRV


VLQR VXV REMHWRV PyGXORV UXWLQDV
YDULDEOHV HWF

(O &203,/$'25
\ HO 0217$'25

VH RFXSDQ GH DJUXSDU FRQYHQLHQWHPHQWH ORV


REMHWRV GHO SURJUDPDGRU HQ VHJPHQWRV \
GH UHIHUHQFLDUORV FRPR
VHJPHQWR GHVSOD]DPLHQWR!

(O &$5*$'25

VH HQFDUJD GH DVLJQDU XQ Q~PHUR D FDGD XQR


GH ORV VHJPHQWRV GH TXH FRQVWD HO SURJUDPD
D HMHFXWDU

TvrhPrhvD

$SXQWHV GH 62 ,

BrvyqrHrvh!#



*HVWLyQ GH 0HPRULD

De todas formas, el programador no tiene que encargarse de definir los segmentos y


las referencias a los objetos que contienen. Los programas se siguen escribiendo
sin preocuparse del mecanismo subyacente de gestin de memoria. As, al compilar
un programa, el compilador construye automticamente los segmentos necesarios
para reflejar la estructura lgica del programa, creando, por ejemplo, un segmento
para las variables globales, otro para la pila y uno para la porcin de cdigo de cada
subprograma; cada tabla de datos podra estar tambin en un segmento distinto. La
estructura en segmentos queda reflejada en el mdulo objeto generado por el
compilador. El cargador es el responsable de tomar el mdulo objeto, identificar
cada segmento con un nmero y situar a cada uno de ellos en una direccin de
memoria libre (Figura 24).

 ,PSOHPHQWDFLyQ
Aunque en un sistema con memoria segmentada se dispone de mltiples espacios
virtuales, y las referencias a los objetos se realizan mediante la tupla (segmento,
desplazamiento), la memoria fsica o real sigue siendo una secuencia
unidimensional de bytes. Por lo tanto se debe implementar un mecanismo que
realice la representacin o proyeccin del espacio de dos dimensiones del usuario
sobre la memoria fsica unidimensional. En la Figura 25 podemos ver un programa
en el espacio de memoria virtual formado por cinco segmentos (0 a 4), as como su
ubicacin en memoria fsica. La representacin de la memoria virtual sobre la fsica
se realiza mediante la WDEOD GH VHJPHQWRV, en la que cada entrada contiene una
EDVH y un OtPLWH de segmento. La base contiene la direccin de la memoria real en
la que reside el segmento, mientras que el lmite indica su longitud.
La utilizacin de la tabla de segmentos se muestra en la Figura 26. La direccin
lgica tiene dos partes: un nmero de segmento y un desplazamiento dentro de
dicho segmento (VG). El nmero de segmento V se utiliza como un ndice para
acceder a la entrada de orden V de la tabla de segmentos; el desplazamiento G debe
ser un valor entre cero y el correspondiente lmite de segmento, si est fuera de ese
rango, se debe producir una excepcin de HUURU GH GLUHFFLRQDPLHQWR, pues significa
que se intenta acceder a un rea de memoria fuera de los lmites del segmento. Si
el desplazamiento es vlido, hay que aadrselo a la base del segmento para
obtener la direccin fsica de memoria donde se encuentra el objeto referenciado.
As, una referencia al byte 48 del segmento 2 del programa de la Figura 25, se
traducir a la direccin fsica 4300+48 = 4348. Un intento de acceso al byte 1227 del
segmento 3 producira un error de direccionamiento, pues ese segmento tiene una
longitud de 1100.
De forma similar a la paginacin, la tabla de segmentos se puede tener en registros
de acceso rpido, de tal forma que, adems, la suma de la base y el
desplazamiento, y la comparacin con el lmite se puede realizar simultneamente
por hardware para ahorrar tiempo. Pero en el caso en que un programa est
compuesto por un gran nmero de segmentos, puede que no resulte factible
mantener la tabla en registros, por lo que habra que recurrir a tenerla en memoria
principal. En tal caso, el Registro Base de la Tabla de Segmentos (RBTS) nos dara


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

,PSOHPHQWDFLyQ

6HJPHQWDFLyQ

$XQTXH ODV UHIHUHQFLDV D ORV REMHWRV GH XQ SURJUDPD VH UHDOLFHQ


PHGLDQWH GLUHFLRQHV GH GRV GLPHQVLRQHV OD PHPRULD ItVLFD VLJXH
VLHQGR XQD VHFXHQFLD XQLGLPHQVLRQDO GH E\WHV
$/*25,702
75$'8&725

'LUHFFLyQ
%LGLPHQVLRQDO
VHJPHQWDGD

7DEOD GH
6HJPHQWRV

'LUHFFLyQ
8QLPHQVLRQDO
UHDO


5DL]
FXDGUDGD

&DOFXORB[
6HJ 

3
L
O
D

6HJ 

6HJ 

7DEOD GH
6tPERORV
6HJ 

6HJ 

3URJUDPD
3ULQFLSDO

6HJ 

%DVH /RQJ






 
 
 
 
 

6HJ 
6HJ 




6HJ 

6HJ 
0HPRULD
)tVLFD

$SXQWHV GH 62 ,





(VSDFLR /yJLFR
GH 'LUHFFLRQHV

TvrhPrhvD






BrvyqrHrvh!$



*HVWLyQ GH 0HPRULD

,PSOHPHQWDFLyQ

6HJPHQWDFLyQ

&yPR VH UHDOL]DQ ODV UHIHUHQFLDV D XQD GLUHFFLyQ ItVLFD"


7DEOD GH
6HJPHQWRV
/tPLWH %DVH

&38

V G

0HPRULD
Vt

)tVLFD

QR

(UURU GH
'LUHFFLRQDPLHQWR

'yQGH 3RQHU OD 7DEOD GH 6HJPHQWRV"


(Q 0HPRULD

(Q 5HJLVWURV

L /HQWR

L /D 7DEOD SXHGH
VHU PX\ JUDQGH
(Q 0HPRULD 3ULQFLSDO  5%76

(O Q~PHUR GH VHJPHQWRV SXHGH VHU YDULDEOH

&DGD UHIHUHQFLD D XQD


GLUHFFLyQ OyJLFD UHTXLHUH GRV
DFFHVRV D PHPRULD SULQFLSDO

TvrhPrhvD



5/76

0HPRULD $VRFLDWLYD
SDUD ODV ~OWLPDV
UHIHUHQFLDV
BrvyqrHrvh!%

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

el comienzo de su posicin en todo momento. Puesto que el nmero de segmentos


es variable (depende de cada programa), se necesita saber tambin el tamao o
nmero de entradas de la tabla de segmentos, lo cual viene expresado por el
contenido del Registro de Longitud de la Tabla de Segmentos (RLTS).
As, cuando hay que calcular una direccin fsica, primero hay que comprobar si el
segmento es vlido (se encuentra en la tabla de segmentos y la longitud de sta es
menor que el contenido del 5/76). Si lo es, se accede a la siguiente direccin:
5%76 + (V x tamao_de_la_entrada)
donde se encuentra la entrada correspondiente al segmento V, y a continuacin se
termina de formar la direccin fsica como ya hemos visto anteriormente.
Al igual que suceda con la paginacin, este mecanismo de traduccin requiere dos
accesos a memoria principal por cada referencia a memoria lgica, generando una
ralentizacin del sistema en un factor de 2. Para aliviar este retardo se suelen utilizar
memorias asociativas intermedias, normalmente embebidas en las MMUs, que
contienen los descriptores de los segmentos referenciados ms recientemente. As,
un pequeo nmero de registros asociativos puede hacer que la ralentizacin del
sistema no suponga ms de un 10% sobre un sistema no segmentado.

 9HQWDMDV H ,QFRQYHQLHQWHV GH OD 6HJPHQWDFLyQ


La segmentacin de memoria presenta dos ventajas principales: proteccin y
compartimiento.
3URWHFFLyQ. Ya que los segmentos representan porciones del programa con
coherencia semntica (por ejemplo, puede haber segmentos de cdigo y
segmentos de datos), es normal que todo el contenido de cada segmento se
utilice de la misma manera; por ejemplo, en las arquitecturas actuales los
programas no son automodificables, por lo que los segmentos de cdigo pueden
definirse como de slo-lectura o slo-ejecucin. El hardware de soporte de la
gestin de memoria se encarga de comprobar los bits de proteccin que figuran
en la tabla de segmentos para prevenir accesos ilegales a memoria, tales como
el intento de escritura en un rea de slo-lectura o la utilizacin de un segmento
de slo-ejecucin como rea de datos. Tambin, poniendo una tabla en un
segmento dedicado, se comprobar automticamente que todos los accesos a
la tabla son vlidos (no exceden el tamao de la tabla). De esta manera,
muchos errores comunes de programacin se pueden detectar por el hardware
antes de que lleguen a causar un dao de consideracin.
&RPSDUWLPLHQWR. La otra ventaja de la segmentacin es la posibilidad de
compartir cdigo o datos. Cada proceso tiene su propia tabla de segmentos,
cuya direccin se mantiene en el BCP de cada proceso, de tal forma que en
cada cambio de contexto, se establece el RBTS correspondiente al proceso que
pasa a ejecucin. En la Figura 27 puede verse cmo dos procesos pueden

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

9HQWDMDV

6HJPHQWDFLyQ

+ )DFLOLWD HO 6LVWHPD GH 3URWHFFLyQ

0
1

/tPLWH

%DVH

3HUPLVRV

25286
8550

43062
90003

ej ej ej
le - -

+ )DFLOLGDG SDUD &RPSDUWLU 'DWRV R &yGLJR

Editor
Seg. 0
'DWRV 3
Seg. 1

/tPLWH
%DVH
0 25286 43062
1 4425 63384
7DEOD GH
VHJPHQWRV GH 3

0HPRULD /yJLFD
GH 3

Editor
Seg. 0


(GLWRU

'DWRV 
/tPLWH
%DVH
0 25286 43062
1 8550 90003
7DEOD GH
VHJPHQWRV GH 3

'DWRV 






'DWRV 3
Seg. 1

0HPRULD /yJLFD
GH 3

TvrhPrhvD



2-2 (O VHJPHQWR GH FyGLJR GHEH WHQHU HO


PLVPR Q~PHUR HQ WRGRV ORV SURFHVRV
TXH OR FRPSDUWHQ
BrvyqrHrvh!&

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

compartir segmentos. Esto es as cuando las entradas de las tablas de


segmentos de los dos procesos apuntan a las mismas direcciones fsicas.
Ya que el mecanismo de compartimiento reside en el nivel de segmentacin,
cualquier informacin puede compartirse si se define en un segmento. Puesto
que los segmentos pueden compartirse, un programa compuesto por varios
segmentos tambin puede compartirse entre varios procesos. Un ejemplo puede
ser el compartimiento de un editor de texto en un sistema multiusuario, donde
en lugar de tener Q copias completas del programa, solamente se requiere una
copia de los segmentos de cdigo. Lo que s se requiere para cada usuario son
segmentos separados (no compartidos) de datos para almacenar la informacin
o texto particular de cada uno.
A la hora de compartir un segmento de cdigo, se debe tener en cuenta la siguiente
sutileza. Los segmentos de cdigo contienen instrucciones que suelen hacer
referencia a otras instrucciones del mismo segmento, por ejemplo, una instruccin
de salto. La direccin de destino del salto estar formada por un nmero de
segmento y un desplazamiento, siendo este nmero de segmento el mismo que el
que contiene la instruccin de salto. Si se quiere compartir este segmento, todos los
procesos que lo compartan deben tener definido ese segmento con el mismo
nmero. Esto no es necesario si las referencias a las direcciones no son absolutas,
es decir si se realiza mediante indirecciones o direccionamientos relativos (respecto
al contador de programa o al registro que contiene el nmero de segmento actual).
El planificador junto con el gestor de memoria deben ocuparse de encontrar y
asignar memoria para todos los segmentos de un programa. Esta situacin es
similar a la paginacin, excepto que los segmentos son de tamao variable,
mientras que las pginas son todas de la misma longitud. As, aqu nos encontramos
con las mismas caractersticas de asignacin de memoria que se tenan en el
modelo de particiones de memoria de tamao variable visto anteriormente; donde la
principal diferencia est en que aqu, los programas pueden ocupar varios
segmentos o particiones.
Uno de los problemas que se tena con las particiones variables (y que aqu se
mantiene) era el de la fragmentacin externa. En este caso, puede hacerse
necesaria una recompactacin de la memoria para aprovechar los pequeos huecos
no adyacentes. La facilidad para poder ubicar mejor o peor los segmentos depende
de su tamao. Si un programa ocupa un solo segmento, puede hacerse difcil su
ubicacin en memoria; por el contrario, si cada byte del programa se mete en un
segmento separado, sern fciles de ubicar, pero se necesitara un registro base
para cada byte, lo cual significa que habra que duplicar la memoria para poder
contener los registros base de todos los segmentos.
Por ltimo, veamos otra pega que se nos puede presentar con la segmentacin.
Puesto que un programa est formado por segmentos, el gestor de memoria puede
ocuparse de cargar en memoria, en cada momento, exclusivamente los segmentos
necesarios para la ejecucin, por lo que no es preciso tener presentes en memoria
todos los segmentos del programa. No obstante, qu pasa si el tamao de un

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

,QFRQYHQLHQWHV

6HJPHQWDFLyQ

3DUD FDUJDU \ HMHFXWDU XQ SURJUDPD VH OH GHEH DVLJQDU PHPRULD


OLEUH SDUD VXV VHJPHQWRV GH PHPRULD
/RV VHJPHQWRV GH PHPRULD VRQ GH WDPDxR YDULDEOH

7LHQHQ ODV PLVPDV FDUDFWHUtVWLFDV TXH ODV SDUWLFLRQHV GH


PHPRULD GH WDPDxR YDULDEOH

/RV PLVPRV PpWRGRV


GH JHVWLyQ

/RV PLVPRV SUREOHPDV

)5$*0(17$&,1
(;7(51$

6ROXFLRQHV D OD )UDJPHQWDFLyQ ([WHUQD


3 (VSHUDU D TXH HVWp GLVSRQLEOH XQ EORTXH GH PHPRULD
VXILFLHQWHPHQWH JUDQGH LQYLDEOH HQ PXFKRV FDVRV
3 &RPSDFWDFLyQ SHULyGLFD GH OD PHPRULD
PX\ FRVWRVR

3XHGH UHVXOWDU PX\ GLItFLO PDQWHQHU WRGRV ORV


VHJPHQWRV FRPSOHWRV GH XQ SURJUDPD HQ
PHPRULD SULQFLSDO

6HJPHQWDFLyQ 3DJLQDGD
TvrhPrhvD



BrvyqrHrvh!'

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

segmento sobrepasa el tamao de la memoria fsica disponible? Pues que no se


podra ejecutar! Este es otro problema de los sistemas segmentados. En los
sistemas paginados, la unidad de carga en memoria es la pgina, y sta siempre es
de un tamao bastante menor que la memoria real disponible, mientras que en los
sistemas segmentados la unidad de carga en memoria es el segmento, que por
definicin es de tamao variable y no tiene lmites preestablecidos.

 6HJPHQWDFLyQ 3DJLQDGD


La solucin al problema de la fragmentacin en el modelo de particiones de tamao
variable fue la paginacin. Por otra parte tenemos que con la segmentacin se
facilita el sistema de proteccin y compartimiento de la informacin, as como una
mayor flexibilidad para variar dinmicamente el tamao de las particiones que
ocupan los procesos.
Entonces, por qu no combinar los dos sistemas, la paginacin y la segmentacin?
En efecto, la solucin ha venido con sistemas hbridos, dando lugar a sistemas de
memoria con paginacin segmentada y a los ms comunes, los de segmentacin
paginada, es decir, un esquema en el que en primer lugar se establece un sistema
de segmentacin de cara al usuario y, a continuacin, acercndonos al hardware, lo
que se hace es paginar los segmentos. Lo que tenemos, por tanto, son programas
formados por segmentos, y estos a su vez, formados por la siguiente unidad de
memoria, es decir, por pginas. Con esta combinacin se consiguen los beneficios
de la segmentacin sin las conocidas desventajas de la fragmentacin externa y con
el consiguiente beneficio de poder no solamente ejecutar programas con segmentos
mayores que la memoria fsica, sino de obtener tambin un mayor grado de
multiprogramacin al no ser obligatorio cargar segmentos completos de procesos,
sino solamente las porciones (pginas) imprescindibles.
Veamos como ejemplo, en el siguiente apartado, el sistema de segmentacin
paginada utilizada por Intel en sus procesadores Pentium.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

 *HVWLyQ GH 0HPRULD HQ HO 3HQWLXP GH ,QWHO


 &DUDFWHUtVWLFDV *HQHUDOHV GH VX $UTXLWHFWXUD
El Pentium de Intel es un procesador de propsito general con el soporte para
gestin de memoria integrado. Ya que una descripcin muy detallada requerira un
seminario en exclusiva, aqu simplemente vamos a intentar dar una visin lo
suficientemente clara como para entender los mecanismos de soporte para la
gestin de memoria que ofrecen estos procesadores.
Puesto que los conceptos de alto nivel de la segmentacin y paginacin ya se han
visto, vamos realizar una descripcin de abajo hacia arriba, es decir, comenzaremos
comentando conceptos bsicos, para irlos agrupando poco a poco hasta llegar al
concepto general.
Para empezar, algunos datos bsicos sobre su arquitectura. Este procesador utiliza
 ELWV para el EXV GH GLUHFFLRQHV y  ELWV para el de GDWRV, lo que significa que
puede direccionar 4 Gigabytes de memoria fsica y puede leer o escribir operandos
de hasta 8 bytes en una sola operacin de lectura/escritura.
Tiene dos modos de funcionamiento: Real y Protegido. El modo Real es el modo
compatible con la arquitectura del 8086. Aqu nosotros vamos a referirnos
exclusivamente al PRGR 3URWHJLGR, que es el modo particular de trabajo del
Pentium y que ofrece la gestin de memoria que nos ocupa.

En la Figura 29 pueden verse los registros accesibles de este procesador. EAX,


EBX, ECX y EDX son registros de uso general; ESI y EDI se utilizan para
direccionamientos indexados; mientras que EBP y ESP estn destinados a la
gestin de la pila y llamadas a subprogramas. El contador de programa es el EIP y
el registro de estado es EFLAGS. De especial inters para nosotros son los registros
de segmento; el CS hace referencia al segmento actual de cdigo y el SS al
segmento de la pila en uso, mientras que DS, ES, FS y GS se utilizan como
segmentos de datos. Por ltimo tenemos 4 registros de control: CR0, CR1, CR2 y
CR3, cuya utilidad iremos viendo ms adelante.
Ahora entraremos ya en conceptos directamente relacionados con el
direccionamiento y la gestin de memoria. Empecemos por los WUHV HVSDFLRV GH
GLUHFFLRQDPLHQWR del Pentium: Virtual, Lineal y Fsico.
La direccin YLUWXDO o lgica esta formada por una GLUHFFLyQ GH VHJPHQWR y un
desplazamiento o GLUHFFLyQ HIHFWLYD. La direccin efectiva se forma a partir de
la informacin sobre el operando que figura en la instruccin mquina. Puede
estar formada por un registro base, uno de ndice, ms un desplazamiento. En
caso de que los operandos a los que haga referencia sean bytes, palabras, o
dobles o cudruples palabras, puede aplicarse un factor de escala al registro de
ndice, por lo que habra que multiplicarlo por 1, 2, 4 u 8. En cuanto a la


$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

,QWHO 3HQWLXP

&DUDFWHUtVWLFDV *HQHUDOHV




'LUHFFLRQHV

 *E\WHV
GH 0HPRULD )tVLFD

'DWRV

'DWRV GH
   \  ELWV

 0RGRV GH
)XQFLRQDPLHQWR
 5($/
 3527(*,'2

5HJLVWURV
*HQHUDOHV

($; (%; (&; (';


(6, (',

&RQWDGRU GH
5HJLVWURV
5HJLVWURV
3URJUDPD
GH 6HJPHQWR GH &RQWURO
\ 5HJ (VWDGR

(,3 ()/$*6

&6 66 '6

&5 &5

(6 )6 *6

&5 &5

(%3 (63

TvrhPrhvD

$SXQWHV GH 62 ,

BrvyqrHrvh!(



*HVWLyQ GH 0HPRULD

direccin de segmento, como ya veremos, se obtiene a partir de un VHOHFWRU. El


selector es el contenido de uno de los registros de segmento, y se describe en
detalle un poco ms adelante.
La unidad de segmentacin transforma la direccin virtual de 46 bits en una
GLUHFFLyQ OLQHDO de 32 bits. Si no est activa la paginacin, la direccin lineal es
directamente la direccin fsica.
Si se trabaja con paginacin (est activo el bit PG del CR0), la unidad de
paginacin convierte la direccin lineal en una GLUHFFLyQ ItVLFD de 32 bits, con la
que ya se accede a una posicin de memoria fsica.

(VSDFLRV GH 'LUHFFLRQDPLHQWR

DryQrv

8iypyqryh9DS@88DI@A@8UDW6

76T@

I9D8@

9@TQG6a6HD@IUP

;
8S
Q

@T86G6

!#'

5$0

9v@srpvh

9vWvhy
T@G@8UPS

Vvqhqqr
T@BH@IU68DI

"!

9v

Vvqhqqr
Q6BDI68DI

Gvrhy

TvrhPrhvD

"!

9v
Atvph

BrvyqrHrvh"

En primer lugar estudiaremos el mecanismo de segmentacin y a continuacin


pasaremos a ver el de paginacin.

 0HFDQLVPR GH 6HJPHQWDFLyQ


Hasta ahora hemos visto, en los sistemas generales de segmentacin, cmo el
procesador al hacer referencia a una posicin de memoria, en la direccin que saca
por el bus de direcciones indica explcitamente el segmento correspondiente a esa
posicin de memoria. Esto lo haca incluyendo el nmero de segmento en los bits
ms significativos de la direccin. Como vemos, HQ FDGD UHIHUHQFLD D PHPRULD VH
LQGLFD H[SOtFLWDPHQWH HO Q~PHUR GH VHJPHQWR HQ OD GLUHFFLyQ.



$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Pues bien hay otro mtodo alternativo para indicar el segmento en una referencia a
memoria. En este otro mtodo HO Q~PHUR GH VHJPHQWR VH REWLHQH LPSOtFLWDPHQWH
dependiendo del tipo de acceso a memoria que se est realizando. Como ejemplo
de valores implcitos en los direccionamientos tenemos las instrucciones de pila,
tales como push y pop. En estas instrucciones no se indica explcitamente en la
propia instruccin la direccin del operando (la cima de la pila), sino que tal direccin
se asume implcitamente, y realmente se obtiene a partir del registro Puntero de
Pila.
Los procesadores de Intel con arquitectura de 32 bits (80386, 80486 y Pentium)
utilizan este sistema en el que el nmero de segmento no forma parte de la
direccin que figura en el operando de una instruccin, sino que dicho nmero de
segmento se mantiene en unos UHJLVWURV GH VHJPHQWR dentro del procesador, de tal
forma que el mecanismo de segmentacin se encarga de formar una direccin
completa a partir de la direccin que figura en el operando de una instruccin (o en
el registro Puntero de Instruccin) ms el segmento que se obtiene a partir de
un registro de segmento.
Hecha esta aclaracin sobre el mtodo utilizado por los procesadores de esta familia
para referenciar un segmento, pasemos a ver su mecanismo completo de
segmentacin.
Empezaremos diciendo que el tamao mximo de un segmento es 4 Gigabytes, y
que un proceso puede acceder hasta un mximo de 8 Ksegmentos locales
(particulares del proceso) y a 8 Ksegmentos globales (compartidos con los dems
procesos). Si cada tarea puede tener hasta 16 Ksegmentos (214) y el tamao
mximo de cada segmento es 4 Gb (232 bytes), esto significa un total de 64
46
terabytes (2 bytes) de memoria virtual.
Toda la informacin relativa a un segmento (direccin base, tamao o lmite,
permisos de acceso, atributos, etc.) est contenida en el GHVFULSWRU GH VHJPHQWR.
Un descriptor de segmento es una estructura de 8 bytes que contiene los siguientes
campos de informacin:
%DVH

Direccin de comienzo del segmento.

/tPLWH

Longitud del segmento

Bit de presencia. 1= Presente; 0= No presente

'3/

Nivel de privilegio del descriptor

0= Descriptor del sistema; 1= Descriptor de cdigo o datos

7LSR

Tipo de segmento. Permisos de acceso

Bit de accedido. Lo pone el procesador cuando accede al segmento.

Granularidad.

'

Longitud por defecto de los operandos. 0=16 bits; 1=32 bits

0= Longitud del segmento indicada en bytes


1= Longitud expresada en pginas (de 4 Kb)

'HVFULSWRU GH 6HJPHQWR

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

/RV 6HJPHQWRV

,QWHO 3HQWLXP

+ 7DPDxR 0i[LPR GHO 6HJPHQWR  *E\WHV


+ +D\ KDVWD N 6HJPHQWRV *OREDOHV D WRGRV ORV SURFHVRV
+ &DGD SURFHVR SXHGH WHQHU KDVWD N 6HJPHQWRV /RFDOHV


%DVH GHO 6HJPHQWR 


%DVH * '  


/tPLWH


/tPLWH GHO 6HJPHQWR 


3 '3/ 6 7 L S R $

%DVH 


'HVFULSWRU GH 6HJPHQWR

*'75

GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 




7DEOD GH
'HVFULSWRUHV *OREDOHV

TvrhPrhvD



/'75

GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 




7DEODV GH
'HVFULSWRUHV /RFDOHV

BrvyqrHrvh"

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Hay una 7DEOD GH 'HVFULSWRUHV *OREDOHV (GDT) que contiene todos los
descriptores de los segmentos globales. Por otra parte, cada proceso tiene una
7DEOD GH 'HVFULSWRUHV /RFDOHV (LDT) que contiene los descriptores de sus
segmentos particulares. La direccin de la GDT est contenida en un registro del
procesador, el GDTR, mientras que la direccin de la LDT que se est utilizando en
un momento dado, se mantiene en otro registro, el LDTR.
Obsrvese que en un sistema hay una nica tabla de descriptores globales y
muchas tablas de descriptores locales, una por cada proceso.
Y cuando se realiza el direccionamiento a un dato en memoria cmo se sabe qu
descriptor de segmento hay que utilizar? La respuesta est en el VHOHFWRU, cuyo
formato se muestra en la Figura 32. Como vemos, consta de tres campos:
QGLFH

Indica una de las 8 K entradas de la tabla de


descriptores globales o de la tabla de
descriptores locales, dependiendo del valor del
campo TI.

,QGLFDGRU GH 7DEOD
(TI)

TI=0 Se hace referencia a la tabla de


descriptores globales (GDT)
TI=1 Se hace referencia a la tabla de
descriptores locales (LDT)

1LYHO GH 3ULYLOHJLR
GHO 3HWLFLRQDULR
(RPL)

Contiene el nivel de privilegio del proceso que


efecta el acceso al segmento
&DPSRV GH XQ 6HOHFWRU

Para hacer referencia a un segmento se utiliza un selector, cuyo campo TI indica si


se trata de un segmento global o local del proceso. Una vez identificada la tabla de
descriptores (GDT o LDT), se toma el descriptor sealado por el ndice y a
continuacin se comprueba si el nivel de privilegio del proceso (contenido en el RPL)
es igual o mayor que el nivel de privilegio del segmento (expresado en el campo
DPL del descriptor).
Bien, sabemos que los descriptores de segmentos estn en las tablas de
descriptores, pero dnde estn los selectores? Los selectores estn en los
registros de segmento (CS, DS, SS, ES, FS, GS). As tenemos que en cada
momento dado hay 6 descriptores que estn siendo apuntados por los selectores
contenidos en los 6 registros de segmento del procesador. Pero si hay 6 registros
cul se utiliza?
6L VH HVWi DOLPHQWDQGR XQD LQVWUXFFLyQ
6L VH HVWi DFFHGLHQGR D XQ RSHUDQGR
6L VH HVWi UHDOL]DQGR XQD RSHUDFLyQ FRQ OD SLOD

$SXQWHV GH 62 ,

&6
'6
66



*HVWLyQ GH 0HPRULD

/RV 6HOHFWRUHV

,QWHO 3HQWLXP

6(/(&725



NDICE

TI
7,

7DEOD GH
'HVFULSWRUHV
/RFDOHV


RPL
7,


GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 




7DEOD GH
'HVFULSWRUHV
*OREDOHV

GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 




'RV $FFHVRV D 0HPRULD SDUD 2EWHQHU XQ 'DWR

12
5HJLVWURV GH 'HVFULSWRUHV
'LU %DVH
&6

/tPLWH $WULEXWRV

6(/(&725

'6 6(/(&725
66 6(/(&725
(6

6(/(&725

)6

6(/(&725

*6 6(/(&725
TvrhPrhvD



BrvyqrHrvh"!

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

La seleccin del registro a utilizar se realiza automticamente en funcin del tipo de


direccionamiento que se est realizando (a cdigo, a datos o a la pila). Para acceder
a un dato situado en uno de los segmentos auxiliares de datos (ES, FS o GS) hay
que indicarlo explcitamente mediante un prefijo de instruccin.
Pero segn este esquema, cada referencia a memoria generada por la CPU
originara realmente dos accesos! uno para obtener el descriptor del segmento
indicado por el selector y otro para acceder propiamente al dato, lo que significara
una duplicacin en el tiempo de acceso.
Para evitar esto, se dispone de una memoria cach, tambin conocida como
5HJLVWURV GH 'HVFULSWRUHV, que contiene los 6 descriptores apuntados por los
selectores cargados en los registros de segmento (Ver Figura 33). El
contenido de estos registros de descriptores solamente se modifica cuando se
realiza una operacin de carga de registro de segmento, momento en el que
habra que acceder a memoria para cargar el descriptor correspondiente al nuevo
selector cargado en el registro de segmento.
De esta manera, si est alimentando una instruccin (interviene el registro IP) se
utiliza directamente el registro de descriptor de cdigo, cuyo contenido es el
descriptor del segmento de cdigo; si se est accediendo a un dato, se utiliza el
registro de descriptor de datos, etc.
Para ayudar a ver de forma general el sistema de segmentacin, presentaremos el
escenario completo de un programa desde que se escribe hasta que se ejecuta.
1. El usuario escribe, en un lenguaje de alto nivel, un programa compuesto de
distintos mdulos, procedimientos, funciones, variables globales y locales a los
subprogramas, tablas, etc. sin preocuparse de si la mquina en la que se va a
ejecutar tiene o no una memoria segmentada.
2. Al traducir cada mdulo, el compilador, adems de producir el cdigo
correspondiente, estructura el cdigo y datos generados en varios segmentos de
cdigo, de datos y de pila.
3. En la fase de montaje, al unir todos los mdulos componentes del programa, se
resuelven todas las referencias externas y se forma un nico mdulo cargable,
estructurado en mltiples segmentos correspondientes a los subprogramas y
estructuras de datos del programa completo. El montador tambin se encarga
de numerar cada uno de los segmentos utilizados. El cdigo generado incluye
las instrucciones necesarias para que cada vez que se haga referencia a una
nueva seccin de datos, se cargue el registro de segmento correspondiente
(DS, SS, ...) con el selector apropiado.
4. Una vez cargado el mdulo en memoria principal, las primeras instrucciones que
se ejecutarn sern las encargadas de cargar los registros de segmento CS, DS
y SS con los selectores correspondientes a los segmentos que contienen las
primeras instrucciones y datos del usuario, as como de la pila de trabajo.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

5. Al cargar los registros de segmento, se accede a las tablas de descriptores para


obtener los descriptores correspondientes, y automticamente se almacenan los
descriptores obtenidos en los respectivos registros de descriptores.
6. Ahora, al empezar a ejecutar ya las instrucciones propias del usuario, se utilizan
directamente los registros de descriptores de los segmentos que contienen las
instrucciones, datos o pila actualmente en uso.
7. Durante la ejecucin, si hay una instruccin que hace referencia a un dato de un
segmento distinto de los que se estn utilizando, previamente a est instruccin,
debe haber otra instruccin que se encargue de cargar uno de los registros de
segmento de datos (DS, ES, FS o GS) con el selector correspondiente al
segmento que contiene el dato que se va a referenciar. Las instrucciones de
carga de registros de segmento las inserta automticamente el compilador, o
sea, que el programador no tiene que preocuparse de ninguna cuestin relativa
al mecanismo utilizado en la gestin de memoria.

9LVLyQ *OREDO GH OD (WDSD GH 6HJPHQWDFLyQ

DryQrv

Srtv
qrTrtr
BT
AT

'LUHFFLyQ
(IHFWLYD

@T
9T
TT
8T

T@G@8UPS

@SSPS

9DS@88DI
GDI@6G

Trtr
Tryrppvhq
Qrv
Gtvr
9v7hr

9v7hr
qryTrtr

Srtv
qr9rpvr

TvrhPrhvD



BrvyqrHrvh""

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

 0HFDQLVPR GH 3DJLQDFLyQ


Una vez tratada la etapa de segmentacin, en la que se produce como resultado
una direccin lineal de 32 bits, pasemos a ver la fase de paginacin, cuya utilizacin
es optativa. Para tener activada la paginacin se debe tener a 1 el bit PG (3DJLQJ
(QDEOH) del registro de control CR0.
12
El tamao de las pginas del Pentium se puede establecer en 4 Kb (2 ) o en 4 Mb
22
(2 ). Aqu consideraremos un tamao de 4 Kb, por lo que para un rango de
direcciones de 32 bits, la memoria virtual est dividida en 220 pginas, o sea, 1
Mpgina. Si adelantamos que un descriptor de pgina ocupa 4 bytes, tenemos que
la tabla de pginas de cada proceso ocupara 4 Mb, lo cual, desde luego, resulta ser
una ocupacin de memoria bastante considerable. Por otra parte, por el principio de
localidad, no es normal que un proceso haga una referencia uniforme a todo el
espacio de direccionamiento de memoria, por lo que seguramente la ejecucin de
un proceso podra realizarse con bastante menos de 1 Mpgina.

Por este motivo, los descriptores de pginas estn estructurados en dos niveles:
El Directorio de Pginas
La Tabla de Pginas
El contenido, tanto del directorio como de la tabla de pginas, son descriptores de
pginas, cuyo formato es el siguiente:
0DUFR

Indica el nmero de marco ocupado por la pgina

Bit de ensuciado.

Bit de accedida o referenciada

86

Pgina de Usuario o Supervisor

/(

Permiso de lectura/escritura

Bit de presencia

Echmosle un vistazo a la Figura 34. Puesto que el tamao de la pgina es de 4 Kb,


los 12 bits de menor peso de la direccin lineal corresponden al desplazamiento. Por
lo tanto los 20 bits de mayor peso indican la pgina. Pues bien, tomando los 10 bits
de mayor peso, y teniendo en el registro de control CR3 la direccin de comienzo
del directorio, se hace referencia a una de las entradas del directorio de pginas.
Esta entrada har referencia a su vez a una de las 210 tablas de pgina del sistema.
Ahora, tomando como referencia la tabla indicada en el directorio de pginas y
tomando la entrada indicada por los siguientes 10 bits (12 a 21) de la direccin
lineal, se obtiene ya el descriptor de la pgina correspondiente a la direccin
referenciada por la CPU.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

3DJLQDFLyQ

,QWHO 3HQWLXP

',5(&&,1
9,578$/



6(/(&725
'LUHFFLyQ (IHFWLYD

GHVFULSWRU GH VHJPHQWR


7DEOD GH 'HVFULSWRUHV




3iJLQD


'HVSOD]DPLHQWR




'HVFU GH SiJ

'HVFU GH SiJ

'LUHFWRULR
GH 3iJLQDV

7DEOD GH
3iJLQDV

'LU )tVLFD

0DUFR

'LUHFFLyQ 9LUWXDO

7/%



'LUHFWRULR



5$0

&5


 

 

'LU 0DUFR GH 3iJ  UHVHUYDGR   ( $  


'(6&5,3725
TvrhPrhvD



'(

8/
3
6 (

3*,1$
BrvyqrHrvh"#

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

De esta forma, no es necesario tener cargada en memoria una tabla de


1 Megaentrada, sino que simplemente hay que tener en memoria el directorio y las
tablas de pginas que utilice el proceso, no todas.
Una vez obtenido el descriptor de la pgina referenciada por la CPU, se forma la
direccin fsica a partir del marco (si la pgina est en memoria) y del
desplazamiento.
El mecanismo de paginacin de estos procesadores est diseado para soportar
sistemas de memoria virtual mediante paginacin por demanda; sin embargo, sus
prestaciones se veran muy afectadas si el procesador tuviera que acceder a los dos
niveles de tablas en cada referencia a memoria. Para resolver este problema, el
Pentium mantiene una memoria cach con los descriptores de las pginas ms
recientemente referenciadas. Esta cach (denominada TLB o %XIIHU GH 7UDGXFFLyQ)
consiste en una memoria asociativa de 32 entradas, es decir, que contiene los
ltimos 32 descriptores de pginas referenciadas. Ya que las pginas son de 4
Kbytes, en la TLB se cubre un rea de memoria de 128 Kbytes.
Para sistemas multitarea convencionales, el TLB obtiene una tasa de aciertos del
98%, lo que significa que solamente el 2% de las referencias a memoria requerirn
el acceso a la estructura de tablas de dos niveles.

 (MHPSOR GH 'LUHFFLRQDPLHQWR


Vamos a ver un ejemplo de direccionamiento a memoria virtual con paginacin
segmentada en el microprocesador de Intel que hemos tratado.
Vamos a suponer que la CPU, durante la ejecucin de una instruccin realiza una
referencia a la direccin de memoria 4C703H para leer un operando.
Sabemos que para calcular la direccin fsica de la memoria, necesitamos tener el
descriptor del segmento correspondiente, y para conseguir el descriptor de
segmento previamente se requiere disponer del selector. Como ya sabemos, los
selectores se encuentran en los registros de segmento. Ya que se trata del acceso a
un dato (no alimentar una instruccin), el selector que nos interesa se encuentra en
el registro de segmento de datos DS. Como podemos ver en la Figura 35, el selector
del DS contiene un ndice con valor 27 (1B H), el indicador de tabla (TI) referencia a
la Tabla de Descriptores Locales, y el nivel de privilegio de acceso (RPL) es 2.
Con estos datos, se puede acceder a la entrada 27 de la Tabla de Descriptores
Locales y obtener el descriptor del segmento de datos. Obtenido el descriptor, se
almacena en su registro de descriptor correspondiente.
Analizando el contenido del descriptor de segmento obtenemos los siguientes datos
relevantes:

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

(MHPSOR GH 'LUHFFLRQDPLHQWR

,QWHO 3HQWLXP

/HFWXUD GH XQ RSHUDQGR HQ OD GLUHFFLyQ &+ GLU GLUHFWR


'LUHFFLyQ (IHFWLYD &+     
TI

RPL

1 0

'6 00 0000 0001 1011


7,

6HOHFWRU

GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 
GHVFU 

GHVFU %


7DEOD GH
'HVFULSWRUHV
/RFDOHV

5HJLVWURV GH 'HVFULSWRUHV
5' &6
5' '6
5' 66
5' (6
5' )6
5' *6

'HVFULSWRU GHO
6HJPHQWR '6
Base del Segmento 15..0

Lmite del Segmento 15..0

0011 0000 0000 0000

0010 0000 0000 0000

Base 31..24

0000 0000 0

Lm. 19..16

DPL

Tipo

Base 23..16

0101

0 1 0

0 0 0

0000 0000

%DVH GHO 6HJPHQWR +


/tPLWH
+ !&
*UDQXODULGDG

'LU 2SHUDQGR %DVH 6HJ  'LU (IHFWLYD

'3/

6LVWHPD  XVXDULR
  &

) +

',5(&&,1 /,1($/ ) +


TvrhPrhvD



BrvyqrHrvh"$

$SXQWHV GH 62 ,

*HVWLyQ GH 0HPRULD

Base del segmento:


Lmite del segmento:
DPL:
Sistema:
Granularidad:

3000H
52000H
1
0 (de usuario)
0 (byte)

Ya que la direccin efectiva no excede el lmite del segmento y que el DPL no es


mayor que el RPL (se tiene privilegio de acceso), se puede continuar calculando la
direccin lineal, as, sta se obtiene sumando simplemente la base del segmento
ms la direccin efectiva, esto es, 3000H + 4C703H, obteniendo que OD GLUHFFLyQ
OLQHDO HV )+.
En la Figura 36 podemos ver que el bit de paginacin del registro de control CR0
est activado, luego hay que continuar con el proceso de paginacin para obtener la
direccin fsica.
Descomponiendo la direccin lineal 4F703 obtenemos un directorio de pginas (0),
una pgina (4FH) y un desplazamiento (703H).
El registro de control CR3 contiene F12000H como direccin de comienzo del
directorio de pginas. Tomando la entrada 0 de este directorio, obtenemos el
descriptor de la pgina que contiene la tabla de pginas que nos corresponde, el
cual apunta a la direccin 42B74H, direccin en la que se encuentra por tanto
nuestra tabla de pginas.
Obtenida la tabla de pginas, accedemos ahora al descriptor de la pgina donde se
encuentra la direccin referenciada. La pgina en cuestin la obtuvimos de la
descomposicin de la direccin lineal, resultando ser la pgina 4FH, por lo que
accedemos a la entrada 4FH de la tabla de pginas (que estar en la direccin
42B74H + (4FH x 4), ya que cada entrada ocupa 4 bytes) y obtenemos el descriptor
de la pgina.
Como se puede ver en la parte inferior de la Figura 36, el marco donde se encuentra
la pgina es el 125A3H y est presente en memoria. Ya que el tamao de cada
pgina ( o marco) es de 4 Kb (1000H), la direccin del marco indicado se hallar
12
multiplicando el nmero de marco por 2 , es decir, 125A3000H.
Ya solamente resta por sumar el desplazamiento a la direccin base de la pgina
para obtener la GLUHFFLyQ ItVLFD, esto es, 125A3000H + 703H = $+.
Debemos comentar ahora, que al entrar en la etapa de paginacin se consulta la
memoria asociativa de direcciones (TLB), y si la direccin lineal se encuentra en
esta memoria, no es necesario realizar todo el proceso de paginacin pues
directamente se obtendra la direccin fsica correspondiente.

$SXQWHV GH 62 ,



*HVWLyQ GH 0HPRULD

(MHPSOR GH 'LUHFFLRQDPLHQWR

,QWHO 3HQWLXP

) + 'LUHFFLyQ /LQHDO

3*

&5 



'LUHFWRULR

3iJLQD

'HVSOD]DPLHQWR

        




 +




'HVFU GH SiJ

'LUHFWRULR
GH 3iJLQDV
)

)[

$
'LU )tVLFD

'HVFU GH SiJ

0DUFR





$

% 7DEOD GH

3iJLQDV

5$0

&5

'LU PDUFR GH SiJ  5HVHUYDGR

% +

  

  

XV OH 3

  

  

'HVFULSWRU GHO 'LUHFWRULR GH 3iJLQDV


'LU PDUFR GH SiJ  5HVHUYDGR

$ +

  

XV OH 3

     

  

'HVFULSWRU GH OD 7DEOD GH 3iJLQDV

TvrhPrhvD



BrvyqrHrvh"%

$SXQWHV GH 62 ,

Vous aimerez peut-être aussi