Documente Academic
Documente Profesional
Documente Cultură
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$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
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
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.
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
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
,3/ 'ULYHUV
3URJUDPD
GH XVXDULR
3URJUDPD
GH XVXDULR
0RQLWRU
6 2
TvrhPrhvD
520
5$0
BrvyqrHrvh"
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
6LQ ,QWHUFDPELR
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
4
.E
4
.E
4
.E
6 2
.E
.E
.E
6 2
TvrhPrhvD
$SXQWHV GH 62 ,
BrvyqrHrvh$
*HVWLyQ GH 0HPRULD
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
$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
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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
,QWHUFDPELR GH 0HPRULD
%DWFK
7LHPSR
&RPSDUWLGR
TvrhPrhvD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
,QWHUFDPELR
6 2
6 2
6 2
6 2
WLHPSR
)UDJPHQWDFLyQ ([WHUQD
D
6 2
D
6 2
D
6 2
&203$&7$&,1
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
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
*HVWLyQ GH %ORTXHV
0DSD GH %LWV
/LVWD GH %ORTXHV /LEUHV
6LVWHPD %XGG\
+ 0DSD GH %LWV
$
&
11111000
11111111
11001111
11111000
00111111
'
16
(
24
32
L 0DSD *UDQGH
*UDQGH
J 0DSD 3HTXHxR
L )UDJPHQWDFLyQ ,QWHUQD
QLO
&yPR VH EXVFD
XQ EORTXH OLEUH
"
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:
$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.
$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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$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
7UR]RV ,JXDOHV
7UR]RV GH
WDPDxR YDULDEOH
3$*,1$&,1
6(*0(17$&,1
TvrhPrhvD
BrvyqrHrvh !
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
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 "
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
*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 $
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$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.
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
6XVWLWXFLyQ GH 3iJLQDV
3DJLQDFLyQ
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
YtFWLPD
7UDHU SiJLQD
UHIHUHQFLDGD
$/*25,702 '(
6867,78&,1
TvrhPrhvD
BrvyqrHrvh %
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
*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
Trvryhitvhryyrhivrrrvh
Trvyrrhrqvhrhpyhqritvh
J
L
7vr)8hqrqrphthyqyqrvvpvhyvhpvy
Hhy)8hqrqrphthhitvhpphr
vyvhqh
TrvrqrSrsrrpvh)
&
&
"
"
"
&
&
"
"
"
"
"
"
"
"
&
&
&
&
$AhyhqrQitvh
TvrhPrhvD
$SXQWHV GH 62 ,
8"hp
(shyhqritvh
8#hp
shyh
$QRPDOtD
GH %HODG\
BrvyqrQpr &
*HVWLyQ GH 0HPRULD
$OJRULWPR SWLPR
6ytvqrTvpvy
Srryhhyhitvh
rivrhhhqhrvyvhr
TrvrqrSrsrrpvh)
&
&
"
"
"
&
&
&
&
&
&
"
"
"
"
"
"
"
"
(AhyhqrQitvh
Bhhvhyhrhhqrshyhqritvhr
TvrhPrhvD
1R
5HDOL]DEOH
Trvyvhhh
rqvphhv
BrvyqrQpr
'
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
6ytvqrTvpvy
Trvryhitvhryyrhivr
vrrsrrpvhqh
@hhvhpvyhy6ytvv
TrvrqrSrsrrpvh)
&
&
"
"
"
&
&
&
"
"
"
"
"
"
"
"
"
&
&
&
!AhyhqrQitvh
J
L
@trrhyrirvrhHvyvhq
Ahyyhphytipyrrphhvhitvh
,PSOHPHQWDFLyQ
8hqr
Qvyh
Srvrrhqhqryu8PTUPTP
BrvyqrQpr (
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
6XVWLWXFLyQ
TvrhPrhvD
$SXQWHV GH 62 ,
BrvyqrHrvh!
*HVWLyQ GH 0HPRULD
$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.
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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
7UDVLHJR
&XHVWLRQHV GH 'LVHxR
75$6,(*2
25,*(1
&RODSVR
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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
7DPDxR GH 3iJLQD
&XHVWLRQHV GH 'LVHxR
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
'HVDSURYHFKD
)UDJPHQWDFLyQ
,QWHUQD
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
&DOFXORB[
3
L
O
D
5DL]
FXDGUDGD
7DEOD GH
6tPERORV
9,67$ /*,&$
'( /$
0(025,$
3URJUDPD
3ULQFLSDO
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
(O &203,/$'25
\ HO 0217$'25
(O &$5*$'25
TvrhPrhvD
$SXQWHV GH 62 ,
BrvyqrHrvh!#
*HVWLyQ GH 0HPRULD
,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
'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
&38
V G
0HPRULD
Vt
)tVLFD
QR
(UURU GH
'LUHFFLRQDPLHQWR
(Q 5HJLVWURV
L /HQWR
L /D 7DEOD SXHGH
VHU PX\ JUDQGH
(Q 0HPRULD 3ULQFLSDO 5%76
TvrhPrhvD
5/76
0HPRULD $VRFLDWLYD
SDUD ODV ~OWLPDV
UHIHUHQFLDV
BrvyqrHrvh!%
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
9HQWDMDV
6HJPHQWDFLyQ
0
1
/tPLWH
%DVH
3HUPLVRV
25286
8550
43062
90003
ej ej ej
le - -
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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
,QFRQYHQLHQWHV
6HJPHQWDFLyQ
)5$*0(17$&,1
(;7(51$
6HJPHQWDFLyQ 3DJLQDGD
TvrhPrhvD
BrvyqrHrvh!'
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$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
&RQWDGRU GH
5HJLVWURV
5HJLVWURV
3URJUDPD
GH 6HJPHQWR GH &RQWURO
\ 5HJ (VWDGR
(,3 ()/$*6
&5 &5
(6 )6 *6
&5 &5
(%3 (63
TvrhPrhvD
$SXQWHV GH 62 ,
BrvyqrHrvh!(
*HVWLyQ GH 0HPRULD
(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"
$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
/tPLWH
'3/
7LSR
Granularidad.
'
'HVFULSWRU GH 6HJPHQWR
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
/RV 6HJPHQWRV
,QWHO 3HQWLXP
/tPLWH
%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
,QGLFDGRU GH 7DEOD
(TI)
1LYHO GH 3ULYLOHJLR
GHO 3HWLFLRQDULR
(RPL)
$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
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
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
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
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
Bit de ensuciado.
86
/(
Permiso de lectura/escritura
Bit de presencia
$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
'(
8/
3
6 (
3*,1$
BrvyqrHrvh"#
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
(MHPSOR GH 'LUHFFLRQDPLHQWR
,QWHO 3HQWLXP
RPL
1 0
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
Base 31..24
0000 0000 0
Lm. 19..16
DPL
Tipo
Base 23..16
0101
0 1 0
0 0 0
0000 0000
'3/
6LVWHPD XVXDULR
&
) +
BrvyqrHrvh"$
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
3000H
52000H
1
0 (de usuario)
0 (byte)
$SXQWHV GH 62 ,
*HVWLyQ GH 0HPRULD
(MHPSOR GH 'LUHFFLRQDPLHQWR
,QWHO 3HQWLXP
3*
&5
'LUHFWRULR
3iJLQD
'HVSOD]DPLHQWR
+
'HVFU GH SiJ
'LUHFWRULR
GH 3iJLQDV
)
)[
$
'LU )tVLFD
'HVFU GH SiJ
0DUFR
$
% 7DEOD GH
3iJLQDV
5$0
&5
% +
XV OH 3
$ +
XV OH 3
TvrhPrhvD
BrvyqrHrvh"%
$SXQWHV GH 62 ,