You are on page 1of 60

4

Gestin de memoria

La memoria es uno de los recursos ms importantes de la computadora y, en consecuencia, la


parte del sistema operativo responsable de tratar con este recurso, el gestor de memoria, es
un componente bsico del mismo. El gestor de memoria del sistema operativo debe hacer de
puente entre los requisitos de las aplicaciones y los mecanismos que proporciona el hardware de gestin de memoria. Se trata de una de las partes del sistema operativo que est ms
ligada al hardware. Esta estrecha colaboracin ha hecho que tanto el hardware como el
software de gestin de memoria hayan ido evolucionando juntos. Las necesidades del sistema
operativo han obligado a los diseadores del hardware a incluir nuevos mecanismos que, a
su vez, han posibilitado el uso de nuevos esquemas de gestin de memoria. De hecho, la
frontera entre la labor que realiza el hardware y la que hace el software de gestin de
memoria es difusa y ha ido tambin evolucionando.
Por lo que se refiere a la organizacin del captulo, en primer lugar se presentarn los
requisitos que debe cumplir la gestin de memoria en un sistema con multiprogramacin. A
continuacin, se mostrarn las distintas fases que conlleva la generacin de un ejecutable y
se estudiar cmo es el mapa de memoria de un proceso. En las siguientes secciones, se
analizar cmo ha sido la evolucin de la gestin de la memoria, desde los sistemas multiprogramados ms primitivos hasta los sistemas actuales basados en la tcnica de memoria
virtual. Por ltimo, se presentar el concepto de proyeccin de archivos y se estudiarn
algunos de los servicios POSIX y Win32 de gestin de memoria. El ndice del captulo es el
siguiente:

Objetivos del sistema de gestin de memoria.


Modelo de memoria de un proceso.
Esquemas de memoria basados en asignacin contigua.
Intercambio.
Memoria virtual.
Archivos proyectados en memoria.
Servicios de gestin de memoria.

163

164

Sistemas operativos. Una visin aplicada

4.1. OBJETIVOS DEL SISTEMA DE GESTIN DE MEMORIA


En un sistema con multiprogramacin, el sistema operativo debe encargarse de realizar un reparto
transparente, eficiente y seguro de los distintos recursos de la mquina entre los diversos procesos,
de forma que cada uno de ellos crea que tiene una mquina para l solo. Esto es, el sistema
operativo debe permitir que los programadores desarrollen sus aplicaciones sin verse afectados por
la posible coexistencia de su programa con otros durante su ejecucin.
Como se ha analizado en captulos anteriores, en el caso del procesador esta multiplexacin
se logra almacenando en el bloque de control de cada proceso el contenido de los registros del
procesador correspondientes a dicho proceso, salvndolos y restaurndolos durante la ejecucin
del mismo.
En el caso de la memoria, el sistema operativo, con el apoyo del hardware de gestin de
memoria del procesador, debe repartir el almacenamiento existente proporcionando un espacio
de memoria independiente para cada proceso y evitando la posible interferencia voluntaria o involuntaria de cualquier otro proceso.
Se podra considerar que, en el caso del procesador, se realiza un reparto en el tiempo, mientras que en el de la memoria, se trata de un reparto en el espacio (Aclaracin 4.1). La accin
combinada de estos dos mecanismos ofrece a los programas una abstraccin de procesador virtual
que les independiza del resto de los procesos.
ACLARACIN 4.1
Reparto del espacio de memoria entre los procesos
En trminos generales, el reparto de la memoria entre los procesos activos se realiza mediante una
multiplexacin del espacio disponible entre ellos. Por motivos de eficiencia, esta solucin es la ms
razonable cuando se trata de la memoria principal. Sin embargo, no siempre es la ms adecuada cuando
se consideran otros niveles de la jerarqua de memoria. As, en el nivel que corresponde con los registros
del procesador, la solucin obligada es una multiplexacin en el tiempo. En el caso de la memoria
virtual, que se estudiar detalladamente ms adelante, se combinan ambos tipos de multiplexacin.

Sea cual sea la poltica de gestin de memoria empleada en un determinado sistema, se pueden
destacar las siguientes caractersticas como objetivos deseables del sistema de gestin de memoria:

Ofrecer a cada proceso un espacio lgico propio.


Proporcionar proteccin entre los procesos.
Permitir que los procesos compartan memoria.
Dar soporte a las distintas regiones del proceso.
Maximizar el rendimiento del sistema.
Proporcionar a los procesos mapas de memoria muy grandes.

Espacios lgicos independientes


En un sistema operativo multiprogramado de propsito general no se puede conocer a priori la
posicin de memoria que ocupar un programa cuando se cargue en memoria para proceder a su
ejecucin, puesto que depender del estado de ocupacin de la memoria, pudiendo variar, por tanto,
en sucesivas ejecuciones del mismo.
El cdigo mquina de un programa contenido en un archivo ejecutable incluir referencias a
memoria, utilizando los diversos modos de direccionamiento del juego de instrucciones del proce-

Gestin de memoria

165

Archivo ejecutable
0
4
....
96
100
104
108
112
116
120
124
128
132
136

Figura 4.1.

Cabecera
LOAD R1, #1000
LOAD R2, #2000
LOAD R3, /1500
LOAD R4, [R1]
STORE R4, [R2]
INC R1
INC R2
DEC R3
JNZ /12
.................

Archivo ejecutable hipottico.

sador, tanto para acceder a sus operandos como para realizar bifurcaciones en la secuencia de
ejecucin. Estas referencias tpicamente estarn incluidas en un intervalo desde 0 hasta un valor
mximo N.
Supngase, por ejemplo, un fragmento de un programa que copia el contenido de un vector
almacenado a partir de la direccin 1000 en otro almacenado a partir de la 2000, estando el tamao
del vector almacenado en la direccin 1500. El cdigo almacenado en el archivo ejecutable, mostrado en un lenguaje ensamblador hipottico, sera el mostrado en la Figura 4.1, donde se ha supuesto que la cabecera del ejecutable ocupa 100 bytes y que cada instruccin ocupa 4. Observe que,
evidentemente, tanto en el ejecutable como posteriormente en memoria, se almacena realmente
cdigo mquina. En esta figura y en las posteriores se ha preferido mostrar un pseudocdigo ensamblador para facilitar la legibilidad de las mismas.
El cdigo mquina de ese programa incluye referencias a direcciones de memoria que corresponden tanto a operandos (las direcciones de los vectores y su tamao) como a instrucciones (la
etiqueta de la bifurcacin condicional, JNZ).
En el caso de un sistema con monoprogramacin, para ejecutar este programa slo ser necesario cargarlo a partir de la posicin de memoria 0 y pasarle el control al mismo. Observe que, como
se puede apreciar en la Figura 4.2, se est suponiendo que el sistema operativo estar cargado en la
parte de la memoria con direcciones ms altas.
En un sistema con multiprogramacin es necesario realizar un proceso de traduccin (reubicacin) de las direcciones de memoria a las que hacen referencia las instrucciones de un programa
(direcciones lgicas) para que se correspondan con las direcciones de memoria principal asignadas
al mismo (direcciones fsicas). En el ejemplo planteado previamente, si al programa se le asigna
una zona de memoria contigua a partir de la direccin 10000, habra que traducir todas las direcciones que genera el programa aadindoles esa cantidad.
Este proceso de traduccin crea, por tanto, un espacio lgico (o mapa) independiente para
cada proceso proyectndolo sobre la parte correspondiente de la memoria principal de acuerdo con
una funcin de traduccin:
Traduccin(direccin lgica) r direccin fsica

166

Sistemas operativos. Una visin aplicada


Memoria
0
4
8
12
16
20
24
28
32
36
....

LOAD R1, #1000


LOAD R2, #2000
LOAD R3, /1500
LOAD R4, [R1]
STORE R4, [R2]
INC R1
INC R2
DEC R3
JNZ /12
.................

Sistema operativo

Figura 4.2.

Ejecucin del programa en un sistema con monoprogramacin.

Dado que hay que aplicar esta funcin a cada una de las direcciones que genera el programa, es
necesario que sea el procesador el encargado de realizar esta traduccin. Como se explic en el
Captulo 1, la funcin de traduccin la lleva a cabo concretamente un mdulo especfico del procesador denominado unidad de gestin de memoria (MMU, Memory Management Unit). El sistema
operativo deber poder especificar a la MMU del procesador qu funcin de traduccin debe aplicar al proceso que est ejecutando en ese momento. En el ejemplo planteado, el procesador, a
instancias del sistema operativo, debera sumarle 10000 a cada una de las direcciones que genera el
programa en tiempo de ejecucin. Observe que el programa se cargara en memoria desde el ejecutable sin realizar ninguna modificacin del mismo y, como se muestra en la Figura 4.3, sera durante su ejecucin cuando se traduciran adecuadamente las direcciones generadas. El sistema operativo debera almacenar asociado a cada proceso cul es la funcin de traduccin que le corresponde
al mismo y, en cada cambio de proceso, debera indicar al procesador qu funcin debe usar para el
nuevo proceso activo.
Memoria

UCP
PC
8
R. instruccin
1500
LOAD R3, /1500

Figura 4.3.

MMU
10000

11500

10000
10004
10008
10012
10016
10020
10024
10028
10032
10036
..........

Ejecucin en un sistema con reubicacin hardware.

LOAD R1, #1000


LOAD R2, #2000
LOAD R3, /1500
LOAD R4, [R1]
STORE R4, [R2]
INC R1
INC R2
DEC R3
JNZ /12
.................

Gestin de memoria

167

Una alternativa software, usada en sistemas ms antiguos que no disponan de hardware de


traduccin, es realizar la reubicacin de las direcciones que contiene el programa en el momento de
su carga en memoria. Con esta estrategia, por tanto, el cdigo del programa cargado en memoria ya
contiene las direcciones traducidas apropiadamente. Para el ejemplo planteado, durante su carga en
memoria, el sistema operativo detectara qu instrucciones hacen referencia a direcciones de memoria y las modificara aadiendo 10000 al valor original. Por tanto, el cdigo cargado en memoria
resultara el mostrado en la Figura 4.4.
Esta segunda solucin, sin embargo, no permite que el programa o un fragmento del mismo se
pueda mover en tiempo de ejecucin, lo cual es un requisito de algunas de las tcnicas de gestin de
memoria como la memoria virtual, ni asegura la proteccin entre procesos como se apreciar en el
siguiente apartado.
A la hora de analizar este objetivo no slo hay que tener en cuenta las necesidades de los
procesos, sino que tambin hay que tener en cuenta las del propio sistema operativo. Al igual que
los procesos, el sistema operativo necesita tambin su propio mapa de memoria. En este caso, sin
embargo, no sera estrictamente necesaria la traduccin ya que el sistema operativo puede situarse
de forma contigua al principio de la memoria eliminando esta necesidad. De cualquier manera, el
uso de una funcin de traduccin puede ser interesante puesto que proporciona ms flexibilidad.
Como gestor de los recursos del sistema, el sistema operativo no slo requiere utilizar su mapa
sino que necesita acceder a toda la memoria del sistema. Es importante resaltar que, adems de
poder acceder a la memoria fsica, el sistema operativo necesita ver el espacio lgico de cada
proceso. Para aclarar esta afirmacin, considrese, por ejemplo, un proceso que realiza una llamada
al sistema en la que pasa como parmetro la direccin donde est almacenada una cadena de
caracteres que representa el nombre de un archivo. Observe que se tratar de una direccin lgica
dentro del mapa del proceso y que, por tanto, el sistema operativo, ya sea con la ayuda de la MMU o
a mano, deber transformar esa direccin usando la funcin de traduccin asociada al proceso.
Proteccin
En un sistema con monoprogramacin es necesario proteger al sistema operativo de los accesos que
realiza el programa en ejecucin para evitar que, voluntaria o involuntariamente, pueda interferir en
Memoria

10000
10004
10008
10012
10016
10020
10024
10028
10032
10036
..........

Figura 4.4.

LOAD R1, #11000


LOAD R2, #12000
LOAD R3, /11500
LOAD R4, [R1]
STORE R4, [R2]
INC R1
INC R2
DEC R3
JNZ /10012
.................

Ejecucin en un sistema con reubicacin software.

168

Sistemas operativos. Una visin aplicada

el correcto funcionamiento del mismo. Todos los usuarios que han trabajado en un sistema que no
cumple este requisito de proteccin, como por ejemplo MS-DOS, han experimentado cmo un error
de programacin en una aplicacin puede causar que todo el sistema se colapse durante la ejecucin
de la misma al producirse una alteracin imprevista del cdigo o las estructuras de datos del sistema
operativo.
En un sistema con multiprogramacin el problema se acenta ya que no slo hay que proteger
al sistema operativo sino tambin a los procesos entre s. El mecanismo de proteccin en este tipo
de sistemas necesita del apoyo del hardware puesto que es necesario validar cada una de las direcciones que genera un programa en tiempo de ejecucin. Este mecanismo est tpicamente integrado
en el mecanismo de traduccin: la funcin de traduccin debe asegurar que los espacios lgicos de
los procesos sean disjuntos entre s y con el del propio sistema operativo.
Observe que en el caso de un sistema que use un procesador con mapa de memoria y E/S
comn, el propio mecanismo de proteccin integrado en el proceso de traduccin permite impedir
que los procesos accedan directamente a los dispositivos de E/S, haciendo simplemente que las
direcciones de los dispositivos no formen parte del mapa de ningn proceso.

Compartimento de memoria
Para cumplir el requisito de proteccin, el sistema operativo debe crear espacios lgicos independientes y disjuntos para los procesos. Sin embargo, en ciertas situaciones, bajo la supervisin y
control del sistema operativo, puede ser provechoso que los procesos puedan compartir memoria.
Esto es, la posibilidad de que direcciones lgicas de dos o ms procesos, posiblemente distintas
entre s, se correspondan con la misma direccin fsica. Ntese que, como puede observarse en la
Figura 4.5, la posibilidad de que dos o ms procesos compartan una zona de memoria implica que el
sistema de gestin de memoria debe permitir que la memoria asignada a un proceso no sea contigua. As, por ejemplo, una funcin de traduccin como la comentada anteriormente, que nicamente sumaba una cantidad a las direcciones generadas por el programa, obligara a que el espacio
asignado al proceso fuera contiguo, imposibilitando, por tanto, el poder compartir memoria.
Mapa proceso 1
Memoria
Zona privada 1
Zona compartida

Zona priv. 1 (P1)


Zona priv. 1 (P2)

Zona privada 2
Zona compartida
Mapa proceso 2
Zona priv. 2 (P2)
Zona privada 1
Zona priv. 2 (P1)
Zona compartida
Zona privada 2

Figura 4.5.

Dos procesos compartiendo una zona de memoria.

Gestin de memoria

169

El compartimento de memoria puede ser beneficioso en varios aspectos. Por un lado, permite
que cuando se estn ejecutando mltiples instancias del mismo programa (p. ej.: el intrprete de
mandatos), los procesos correspondientes compartan el cdigo, lo que resulta en un mejor aprovechamiento de la memoria disponible. Adicionalmente, como se analizar en el Captulo 5, la memoria compartida permite una forma de comunicacin muy rpida entre procesos cooperantes.
La posibilidad de que los procesos compartan una zona de memoria hacindola corresponder
con rangos diferentes de su espacio lgico presenta problemas en determinadas circunstancias.
Considrese el caso de que una posicin de memoria de la zona compartida tenga que contener la
direccin de otra posicin de dicha zona (o sea, una referencia). Como se puede apreciar en la
Figura 4.6, no es posible determinar qu direccin almacenar en la posicin origen puesto que cada
proceso ve la posicin referenciada en una direccin diferente de su mapa de memoria.
Esta situacin se puede presentar tanto en zonas compartidas de cdigo como de datos. En el
caso del cdigo, considrese que una posicin de la zona contiene una instruccin de bifurcacin a
otra posicin de la misma. Por lo que respecta al caso de los datos, supngase que la zona compartida contiene una estructura de lista basada en punteros.
Soporte de las regiones del proceso
Como se analizar con ms detalle en secciones posteriores, el mapa de un proceso no es homogneo sino que est formado por distintos tipos de regiones con diferentes caractersticas y propiedades. Dado que el sistema operativo conoce qu regiones incluye el mapa de memoria de cada
proceso, el gestor de memoria con el apoyo del hardware debera dar soporte a las caractersticas
especficas de cada regin.
As, por ejemplo, el contenido de la regin que contiene el cdigo del programa no
debe poder modificarse. Se debera detectar cualquier intento de escritura sobre una direccin
incluida en dicha regin y tratarlo adecuadamente (p. ej.: mandando una seal al proceso).
Observe que lo que se est detectando en este caso es un error de programacin en la aplicacin.
El dar soporte al carcter de slo lectura de la regin permite detectar inmediatamente el
error, lo que facilita considerablemente la depuracin del programa.
Mapa proceso 1
Memoria
2000
Zona compartida
10000

Zona compartida
1100 o 2100?

10100
Mapa proceso 2
1000
Zona compartida

Figura 4.6.

Problemas al compartir una zona en diferentes direcciones del mapa de cada proceso.

170

Sistemas operativos. Una visin aplicada

Otro aspecto a resaltar es que el mapa del proceso no es esttico. Durante la ejecucin de un
programa puede variar el tamao de una regin o, incluso, pueden crearse nuevas regiones o eliminarse regiones existentes. El sistema de memoria debe controlar qu regiones estn presentes en el
mapa de memoria y cul es el tamao actual de cada una. Tmese como ejemplo el comportamiento
dinmico de la regin de pila del proceso. El gestor de memoria debe asignar y liberar memoria
para estas regiones segn evolucionen las mismas. Este carcter dinmico del mapa de un proceso
implica la existencia de zonas dentro del mapa de memoria del proceso que en un determinado
momento de su ejecucin no pertenecen a ninguna regin y que, por tanto, cualquier acceso a las
mismas implica un error de programacin. El gestor de memoria debera detectar cundo se produce un acceso a las mismas y, como en el caso anterior, tratarlo adecuadamente. Con ello adems de
facilitar la depuracin, se elimina la necesidad de reservar memoria fsica para zonas del mapa que
no estn asignadas al proceso en un determinado instante. El sistema operativo debe almacenar por
cada proceso una tabla de regiones que indique las caractersticas de las regiones del proceso
(tamao, proteccin, etc.).
De acuerdo con los aspectos que se acaban de analizar, la funcin de traduccin se generaliza
para que tenga en cuenta las situaciones planteadas pudiendo, por tanto, devolver tres valores alternativos:
Traduccin(direccin lgica, tipo de operacin) r
{Direccin fsica correspondiente,
Excepcin por acceso a una direccin no asignada,
Excepcin por operacin no permitida}

Por ltimo, hay que resaltar que el mapa de memoria del propio sistema operativo, como programa que es, tambin est organizado en regiones. Al igual que ocurre con los procesos de usuario, el
sistema de memoria debera dar soporte a las regiones del sistema operativo. As, se detectara inmediatamente un error en el cdigo del sistema operativo, lo que facilitara su depuracin a la gente
encargada de esta ardua labor. Observe que la deteccin del error debera detener inmediatamente la
ejecucin del sistema operativo y mostrar un volcado de la informacin del sistema.
Maximizar el rendimiento
Como ya se analiz en captulos anteriores, el grado de multiprogramacin del sistema influye
directamente en el porcentaje de utilizacin del procesador y, por tanto, en el rendimiento del
sistema. Adicionalmente, un mayor grado de multiprogramacin implica que puede existir un mayor nmero de usuarios trabajando simultneamente en el sistema.
El gestor de memoria debe, por tanto, realizar un reparto de la memoria entre los procesos
intentando que quepa el mayor nmero de ellos en memoria y minimizando el desperdicio inherente al reparto. Para ello, debe establecerse una poltica de asignacin adecuada. La poltica de
asignacin determina qu direcciones de memoria se asignan para satisfacer una determinada peticin. Hay que resaltar que la propia gestin de la memoria requiere un gasto en espacio de almacenamiento para que el sistema operativo almacene las estructuras de datos implicadas en dicha
gestin. As, ser necesario guardar la tabla de regiones y la funcin de traduccin asociada a cada
proceso (normalmente implementadas como tablas), as como una estructura que refleje qu partes
de la memoria permanecen libres y cules estn ocupadas. Dado que el almacenamiento de estas
estructuras resta espacio de memoria para los procesos, es importante asegurar que su consumo se
mantiene en unos trminos razonables.

Gestin de memoria

171

As, por ejemplo, la situacin ptima de aprovechamiento se obtendra si la funcin de traduccin de direcciones permitiese hacer corresponder cualquier direccin lgica de un proceso con
cualquier direccin fsica, como muestra la Figura 4.7. Observe que esto permitira que cualquier
palabra de memoria libre se pudiera asignar a cualquier proceso. Esta funcin de traduccin es, sin
embargo, irrealizable en la prctica puesto que implica tener unas tablas de traduccin enormes,
dado que habra que almacenar una entrada en la tabla por cada direccin de memoria del mapa de
cada proceso.
Como ya se estudi en el Captulo 1, la solucin adoptada en la mayora de los sistemas
operativos actuales para obtener un buen aprovechamiento de la memoria, pero manteniendo las
tablas de traduccin dentro de unos valores razonables, es la paginacin que se volver a tratar en
las secciones siguientes.
Para optimizar el rendimiento, la mayora de los sistemas operativos actuales no slo intentan
aprovechar la memoria lo mejor posible, sino que adems utilizan la tcnica de la memoria virtual
presentada en el Captulo 1. Con esta tcnica, el grado de multiprogramacin puede aumentar
considerablemente, ya que no es preciso que todo el mapa de memoria del proceso tenga que residir
en memoria principal para poder ejecutarse, sino que se ir trayendo de la memoria secundaria bajo
demanda. Observe que el incremento del grado de multiprogramacin no puede ser ilimitado puesto
que, como ya se analiz en el Captulo 1, cuando se supera un determinado umbral, el rendimiento
del sistema decae drsticamente.
Como se analizar ms adelante, antes de la aparicin de la memoria virtual, los sistemas
operativos de tiempo compartido utilizaban una tcnica denominada intercambio (swapping). Este
mecanismo permite que en el sistema existan ms procesos de los que caben en memoria. Sin
embargo, a diferencia de la memoria virtual, esta tcnica sigue requiriendo que la imagen completa
de un proceso resida en memoria para poder ejecutarlo. Los procesos que no caben en memoria en
un determinado instante estn suspendidos y su imagen reside en un dispositivo de almacenamiento
secundario. Por tanto, el grado de multiprogramacin sigue estando limitado por el tamao de la
memoria, por lo que el uso de esta tcnica no redunda directamente en la mejora del rendimiento
del sistema. Sin embargo, proporciona un mejor soporte multiusuario, que fue el motivo principal
para el que se concibi.
Memoria
0

Direccin 50 del proceso 4

Direccin 10 del proceso 6

Direccin 95 del proceso 7

Direccin 56 del proceso 8

Direccin 0 del proceso 12

Direccin 5 del proceso 20

Direccin 0 del proceso 1


.........................................
.........................................

Figura 4.7.

N-1

Direccin 88 del proceso 9

Direccin 51 del proceso 4

Aprovechamiento ptimo de la memoria.

172

Sistemas operativos. Una visin aplicada

Mapas de memoria muy grandes para los procesos


En los tiempos en los que la memoria era muy cara y, en consecuencia, los equipos posean una
memoria bastante reducida, se producan habitualmente situaciones en las que las aplicaciones se
vean limitadas por el tamao de la memoria. Para solventar este problema, los programadores
usaban la tcnica de los overlays. Esta tcnica consiste en dividir el programa en una serie de fases
que se ejecutan sucesivamente, pero estando en cada momento residente en memoria slo una fase.
Cada fase se programa de manera que, despus de realizar su labor, carga en memoria la siguiente
fase y le cede el control. Es evidente que esta tcnica no soluciona el problema de forma general
dejando en manos del programador todo el trabajo.
Por ello, se ide la tcnica de la memoria virtual, que permite proporcionar a un proceso de
forma transparente un mapa de memoria considerablemente mayor que la memoria fsica existente
en el sistema.
A pesar del espectacular abaratamiento de la memoria y la consiguiente disponibilidad generalizada de equipos con memorias apreciablemente grandes, sigue siendo necesario que el sistema de
memoria, usando la tcnica de la memoria virtual, proporcione a los procesos espacios lgicos ms
grandes que la memoria realmente disponible. Observe que a la memoria le ocurre lo mismo que a
los armarios: cuanto ms grandes son, ms cosas metemos dentro de ellos. La disponibilidad de
memorias mayores permite a los programadores obtener beneficio del avance tecnolgico, pudiendo incluir caractersticas ms avanzadas en sus aplicaciones o incluso tratar problemas que hasta
entonces se consideraban inabordables.

4.2. MODELO DE MEMORIA DE UN PROCESO


El sistema operativo gestiona el mapa de memoria de un proceso durante la vida del mismo. Dado
que el mapa inicial de un proceso est muy vinculado con el archivo que contiene el programa
ejecutable asociado al mismo, esta seccin comenzar estudiando cmo se genera un archivo ejecutable y cul es la estructura tpica del mismo. A continuacin, se analizar cmo evoluciona el
mapa a partir de ese estado inicial y qu tipos de regiones existen tpicamente en el mismo, identificando cules son sus caractersticas bsicas. Por ltimo, se expondrn cules son las operaciones
tpicas sobre las regiones de un proceso.

4.2.1. Fases en la generacin de un ejecutable


Habitualmente los programadores desarrollan sus aplicaciones utilizando lenguajes de alto nivel.
En general, una aplicacin estar compuesta por un conjunto de mdulos de cdigo fuente que
debern ser procesados para obtener el ejecutable de la aplicacin. Como se puede observar en la
Figura 4.8, este procesamiento tpicamente consta de dos fases:
Compilacin. Se genera el cdigo mquina correspondiente a cada mdulo fuente de la
aplicacin asignando direcciones a los smbolos definidos en el mdulo y resolviendo las
referencias a los mismos. As, si a una variable se le asigna una determinada posicin de
memoria, todas las instrucciones que hagan referencia a esa variable deben especificar dicha
direccin. Las referencias a smbolos que no estn definidos en el mdulo quedan pendientes de resolver hasta la fase de montaje. Como resultado de esta fase se genera un mdulo
objeto por cada archivo fuente.

Gestin de memoria

Mdulo
fuente A

173

Mdulo
fuente B

Compilador

Mdulo
objeto A

Mdulo
objeto B

Bibliotecas

Montador
Archivo
ejecutable

Figura 4.8.

Fases en la generacin de un ejecutable.

Montaje o enlace. Se genera un ejecutable agrupando todos los archivos objeto y resolviendo las referencias entre mdulos, o sea, haciendo que las referencias a un determinado smbolo apunten a la direccin asignada al mismo. Adems de este tipo de referencias, pueden
existir referencias a smbolos definidos en otros archivos objeto previamente compilados
agrupados normalmente en bibliotecas. El montador, por tanto, debe generalmente incluir en
el ejecutable otros objetos extrados de las bibliotecas correspondientes. As, por ejemplo, si
la aplicacin usa una funcin matemtica como la que calcula el coseno, el montador deber
extraer de la biblioteca matemtica el objeto que contenga la definicin de dicha funcin,
incluirlo en el ejecutable y resolver la referencia a dicha funcin desde la aplicacin de
manera que se corresponda con la direccin de memoria adecuada.
Bibliotecas de objetos
Una biblioteca es una coleccin de objetos normalmente relacionados entre s. En el sistema existe
un conjunto de bibliotecas predefinidas que proporcionan servicios a las aplicaciones. Estos servicios incluyen tanto los correspondientes a un determinado lenguaje de alto nivel (el API del lenguaje) como los que permiten el acceso a los servicios del sistema operativo (el API del sistema
operativo).
Asimismo, cualquier usuario puede crear sus propias bibliotecas para de esta forma poder
organizar mejor los mdulos de una aplicacin y facilitar que las aplicaciones compartan mdulos.
As, por ejemplo, un usuario puede crear una biblioteca que maneje nmeros complejos y utilizar
esta biblioteca en distintas aplicaciones.
Bibliotecas dinmicas
La manera de generar el ejecutable comentada hasta ahora consiste en compilar los mdulos fuente
de la aplicacin y enlazar los mdulos objeto resultantes junto con los extrados de las bibliotecas
correspondientes. De esta forma, se podra decir que el ejecutable es autocontenido: incluye todo el
cdigo que necesita el programa para poder ejecutarse. Este modo de trabajo presenta varias desventajas:
El archivo ejecutable puede ser bastante grande ya que incluye, adems del cdigo propio de
la aplicacin, todo el cdigo de las funciones externas que usa el programa.

174

Sistemas operativos. Una visin aplicada

Todo programa en el sistema que use una determinada funcin de biblioteca tendr una
copia del cdigo de la misma. Como ejemplo, el cdigo de la funcin printf, utilizada en
casi todos los programas escritos en C, estar almacenado en todos los ejecutables que la
usan.
Cuando se estn ejecutando simultneamente varias aplicaciones que usan una misma funcin de biblioteca, existirn en memoria mltiples copias del cdigo de dicha funcin
aumentando el gasto de memoria.
La actualizacin de una biblioteca implica tener que volver a generar los ejecutables que la
incluyen por muy pequeo que sea el cambio que se ha realizado sobre la misma. Supngase
que se ha detectado un error en el cdigo de una biblioteca o que se ha programado una
versin ms rpida de una funcin de una biblioteca. Para poder beneficiarse de este cambio,
los ejecutables que la usan deben volver a generarse a partir de los objetos correspondientes.
Observe que esta operacin no siempre puede realizarse ya que dichos objetos pueden no
estar disponibles.
Para resolver estas deficiencias se usan las bibliotecas dinmicamente enlazadas (Dynamic
Link Libraries) o, simplemente, bibliotecas dinmicas. Por contraposicin, se denominarn bibliotecas estticas a las presentadas hasta el momento.
Con este nuevo mecanismo, el proceso de montaje de una biblioteca de este tipo se difiere y en
vez de realizarlo en la fase de montaje se realiza en tiempo de ejecucin del programa. Cuando en la
fase de montaje el montador procesa una biblioteca dinmica, no incluye en el ejecutable cdigo
extrado de la misma, sino que simplemente anota en el ejecutable el nombre de la biblioteca para
que sta sea cargada y enlazada en tiempo de ejecucin.
Como parte del montaje, se incluye en el ejecutable un mdulo de montaje dinmico que se
encargar de realizar en tiempo de ejecucin la carga y el montaje de la biblioteca cuando se haga
referencia por primera vez a algn smbolo definido en la misma. En el cdigo ejecutable original
del programa, las referencias a los smbolos de la biblioteca, que evidentemente todava estn
pendientes de resolver, se hacen corresponder con smbolos en el mdulo de montaje dinmico. De
esta forma, la primera referencia a uno de estos smbolos produce la activacin del mdulo que
realizar en ese momento la carga de la biblioteca y el proceso de montaje necesario. Como parte
del mismo, se resolver la referencia a ese smbolo de manera que apunte al objeto real de la
biblioteca y que, por tanto, los posteriores accesos al mismo no afecten al mdulo de montaje
dinmico. Observe que este proceso de resolucin de referencias afecta al programa que hace uso
de la biblioteca dinmica ya que implica modificar en tiempo de ejecucin algunas de sus instrucciones para que apunten a la direccin real del smbolo. Esto puede entrar en conflicto con el tpico
carcter de no modificable que tiene la regin de cdigo.
El uso de bibliotecas dinmicas resuelve las deficiencias identificadas anteriormente:
El tamao de los archivos ejecutables disminuye considerablemente ya que en ellos no se
almacena el cdigo de las funciones de bibliotecas dinmicas usadas por el programa.
Las rutinas de una biblioteca dinmica estarn almacenadas nicamente en el archivo de la
biblioteca en vez de estar duplicadas en los ejecutables que las usan.
Cuando se estn ejecutando varios procesos que usan una biblioteca dinmica, stos podrn
compartir el cdigo de la misma, por lo que en memoria habr slo una copia de la misma.
La actualizacin de una biblioteca dinmica es inmediatamente visible a los programas que
la usan sin necesidad de volver a montarlos.
Con respecto a este ltimo aspecto, es importante resaltar que cuando la actualizacin implica
un cambio en la interfaz de la biblioteca (p. ej.: una de las funciones tiene un nuevo parmetro), el
programa no debera usar esta biblioteca sino la versin antigua de la misma. Para resolver este

Gestin de memoria

175

problema de incompatibilidad, en muchos sistemas se mantiene un nmero de versin asociado a


cada biblioteca. Cuando se produce un cambio en la interfaz, se crea una nueva versin con un
nuevo nmero. Cuando en tiempo de ejecucin se procede a la carga de una biblioteca, se busca la
versin de la biblioteca que coincida con la que requiere el programa, producindose un error en
caso de no encontrarla. Observe que durante el montaje se ha almacenado en el ejecutable el nombre y la versin de la biblioteca que utiliza el programa.
Por lo que se refiere al compartimento del cdigo de una biblioteca dinmica entre los procesos que la utilizan en un determinado instante, es un aspecto que hay que analizar ms en detalle.
Como se plante en la seccin anterior, si se permite que el cdigo de una biblioteca pueda estar
asociado a un rango de direcciones diferente en cada proceso, surgen problemas con las referencias
que haya en el cdigo de la biblioteca a smbolos definidos en la misma. Ante esta situacin se
presentan tres alternativas:
Establecer un rango de direcciones predeterminado y especfico para cada biblioteca dinmica de manera que todos los procesos que la usen la incluirn en dicho rango dentro de su
mapa de memoria. Esta solucin permite compartir el cdigo de la biblioteca, pero es poco
flexible ya que limita el nmero de bibliotecas que pueden existir en el sistema y puede
causar que el mapa de un proceso sea considerablemente grande presentando amplias zonas
sin utilizar.
Reubicar las referencias presentes en el cdigo de la biblioteca durante la carga de la misma
de manera que se ajusten a las direcciones que le han correspondido dentro del mapa de
memoria del proceso que la usa. Esta opcin permite cargar la biblioteca en cualquier zona
libre del mapa del proceso. Sin embargo, impide el poder compartir su cdigo (o, al menos,
la totalidad de su cdigo) al estar adaptado a la zona de memoria donde le ha tocado vivir.
Generar el cdigo de la biblioteca de manera que sea independiente de la posicin (en ingls
se suelen usar las siglas PIC, Position Independent Code). Con esta tcnica, el compilador
genera cdigo que usa direccionamientos relativos a un registro (p. ej.: al contador de programa) de manera que no se ve afectado por la posicin de memoria donde ejecuta. Esta
alternativa permite que la biblioteca resida en la zona del mapa que se considere conveniente
y que, adems, su cdigo sea compartido por los procesos que la usan. El nico aspecto
negativo es que la ejecucin de este tipo de cdigo es un poco menos eficiente que el
convencional [Gingell, 1987], pero, generalmente, este pequeo inconveniente queda compensado por el resto de las ventajas.
El nico aspecto negativo del uso de las bibliotecas dinmicas es que el tiempo de ejecucin
del programa puede aumentar ligeramente debido a que con este esquema el montaje de la biblioteca se realiza en tiempo de ejecucin. Sin embargo, este aumento es perfectamente tolerable en la
mayora de los casos y queda claramente contrarrestado por el resto de los beneficios que ofrece
este mecanismo.
Otro aspecto que conviene resaltar es que el mecanismo de bibliotecas dinmicas es transparente al modo de trabajo habitual de un usuario. Dado que este nuevo mecanismo slo atae a la
fase de montaje, tanto el cdigo fuente de un programa como el cdigo objeto no se ven afectados
por el mismo. Adems, aunque la fase de montaje haya cambiado considerablemente, los mandatos
que se usan en esta etapa son tpicamente los mismos. De esta forma, el usuario no detecta ninguna
diferencia entre usar bibliotecas estticas y dinmicas excepto, evidentemente, los beneficios antes
comentados.
En la mayora de los sistemas que ofrecen bibliotecas dinmicas, el sistema tiene una versin
esttica y otra dinmica de cada una de las bibliotecas predefinidas. Dados los importantes beneficios que presentan las bibliotecas dinmicas, el montador usar por defecto la versin dinmica. Si
el usuario, por alguna razn, quiere usar la versin esttica, deber pedirlo explcitamente.

176

Sistemas operativos. Una visin aplicada

Montaje explcito de bibliotecas dinmicas


La forma de usar las bibliotecas dinmicas que se acaba de exponer es la ms habitual: se especifica
en tiempo de montaje qu bibliotecas se deben usar y se pospone la carga y el montaje hasta el
tiempo de ejecucin. Este esquema se suele denominar enlace dinmico implcito. Sin embargo,
no es la nica manera de usar las bibliotecas dinmicas.
En algunas aplicaciones no se conoce en tiempo de montaje qu bibliotecas necesitar el
programa. Supngase, por ejemplo, un navegador de Internet que maneja hojas que contienen archivos en distintos formatos y que usa las funciones de varias bibliotecas dinmicas para procesar
cada uno de los posibles formatos. En principio, cada vez que se quiera dotar al navegador de la
capacidad de manejar un nuevo tipo de formato, sera necesario volver a montarlo especificando
tambin la nueva biblioteca que incluye las funciones para procesarlo. Observe que esto sucede
aunque se usen bibliotecas dinmicas.
Lo que se requiere en esta situacin es poder decidir en tiempo de ejecucin qu biblioteca
dinmica se necesita y solicitar explcitamente su montaje y carga. El mecanismo de bibliotecas
dinmicas presente en Windows NT y en la mayora de las versiones de UNIX ofrece esta funcionalidad, denominada tpicamente enlace dinmico explcito. Un programa que pretenda usar esta
funcionalidad deber hacer uso de los servicios que ofrece el sistema para realizar esta solicitud
explcita. Observe que, en este caso, no habra que especificar en tiempo de montaje el nombre de la
biblioteca dinmica. Pero, como contrapartida, el mecanismo de carga y montaje de la biblioteca
dinmica deja de ser transparente a la aplicacin.
Formato del ejecutable
Como parte final del proceso de compilacin y montaje, se genera un archivo ejecutable que contiene el cdigo mquina del programa. Distintos fabricantes han usado diferentes formatos para este
tipo de archivos. En el mundo UNIX, por ejemplo, uno de los formatos ms utilizados actualmente
es el denominado Executable and Linkable Format (ELF). A continuacin, se presentar de forma
simplificada cmo es el formato tpico de un ejecutable.
Como se puede observar en la Figura 4.9, un ejecutable est estructurado como una cabecera y
un conjunto de secciones.
La cabecera contiene informacin de control que permite interpretar el contenido del ejecutable. En la cabecera tpicamente se incluye, entre otras cosas, la siguiente informacin:
Archivo ejecutable
0

Cabecera

Nmero mgico
Contador de programa inicial
....................
Tabla de secciones

1000
Cdigo
5000

Secciones

Datos con valor inicial

................
8000

Figura 4.9.

Tabla de smbolos

Formato simplificado de un ejecutable.

Cdigo
Datos con v.i.
Datos sin v.i.
......................

Despl.
1000
5000
-----........

Tam.
4000
1000
500
........

T. smbolos

8000 1000

Gestin de memoria

177

Un nmero mgico que identifica al ejecutable. As, por ejemplo, en el formato ELF, el
primer byte del archivo ejecutable debe contener el valor hexadecimal 7f y los tres siguientes los caracteres E, L y F.
La direccin del punto de entrada del programa, esto es, la direccin que se almacenar
inicialmente en el contador de programa del proceso.
Una tabla que describe las secciones que aparecen en el ejecutable. Por cada una de ellas, se
especifica, entre otras cosas, su tipo, la direccin del archivo donde comienza y su tamao.
En cuanto a las secciones, cada ejecutable tiene un conjunto de secciones. El contenido de
estas secciones es muy variado. Una seccin puede contener informacin para facilitar la depuracin (p. ej.: una tabla de smbolos). Otra seccin puede contener la lista de bibliotecas dinmicas
que requiere el programa durante su ejecucin. Sin embargo, esta exposicin se centrar en las tres
que ms influyen en el mapa de memoria de un proceso:
Cdigo (texto). Contiene el cdigo del programa.
Datos con valor inicial. Almacena el valor inicial de todas las variables globales a las que se
les ha asignado un valor inicial en el programa.
Datos sin valor inicial. Se corresponde con todas las variables globales a las que no se les ha
dado un valor inicial. Como muestra la figura, esta seccin aparece descrita en la tabla de
secciones de la cabecera, pero, sin embargo, no se almacena normalmente en el ejecutable
ya que el contenido de la misma es irrelevante. En la tabla nicamente se especifica su
tamao.
Observe que en el ejecutable no aparece ninguna seccin que corresponda con las variables
locales y parmetros de funciones. Esto se debe a que este tipo de variables presentan unas caractersticas muy diferentes a las de las variables globales, a saber:
Las variables globales tienen un carcter esttico. Existen durante toda la vida del programa.
Tienen asociada una direccin fija en el mapa de memoria del proceso y, por tanto, tambin
en el archivo ejecutable puesto que ste se corresponde con la imagen inicial del proceso. En
el caso de que la variable no tenga un valor inicial asignado en el programa, no es necesario
almacenarla explcitamente en el ejecutable, sino que basta con conocer el tamao de la
seccin que contiene este tipo de variables.
Las variables locales y parmetros tienen carcter dinmico. Se crean cuando se invoca la
funcin correspondiente y se destruyen cuando termina la llamada. Por tanto, estas variables
no tienen asignado espacio en el mapa inicial del proceso ni en el ejecutable. Se crean
dinmicamente usando para ello la pila del proceso. La direccin que corresponde a una
variable de este tipo se determina en tiempo de ejecucin ya que depende de la secuencia de
llamadas que genere el programa. Observe que, dada la posibilidad de realizar llamadas
recursivas directas o indirectas que proporciona la mayora de los lenguajes, pueden existir
en tiempo de ejecucin varias instancias de una variable de este tipo.
En el Programa 4.1 se muestra el esqueleto de un programa en C que contiene diversos tipos de
variables. En l se puede observar que las variables x e y son globales, mientras que z es local y t es
un parmetro de una funcin. La primera de ellas tiene asignado un valor inicial, por lo que dicho
valor estar almacenado en la seccin del ejecutable que corresponde a este tipo de variables. Con
respecto a la variable y, no es necesario almacenar ningn valor en el ejecutable asociado a la
misma, pero su existencia quedar reflejada en el tamao total de la seccin de variables globales
sin valor inicial. En cuanto a la variable local z y al parmetro t, no estn asociados a ninguna
seccin del ejecutable y se les asignar espacio en tiempo de ejecucin cuando se produzcan llamadas a la funcin donde estn definidos.

178

Sistemas operativos. Una visin aplicada

Programa 4.1.

Esqueleto de un programa.

int x=8;
int y;
f(int t){
int z;
.........
}
main(){
.........
}

4.2.2. Mapa de memoria de un proceso


Como se coment previamente, el mapa de memoria de un proceso no es algo homogneo sino que
est formado por distintas regiones o segmentos. Una regin tiene asociada una determinada informacin. En este captulo se denominar objeto de memoria a este conjunto de informacin relacionada. La asociacin de una regin de un proceso con un objeto de memoria permite al proceso tener
acceso a la informacin contenida en el objeto.
Cuando se activa la ejecucin de un programa (servicio exec en POSIX y CreateProcess
en Win32), se crean varias regiones dentro del mapa a partir de la informacin del ejecutable. Cada
seccin del ejecutable constituye un objeto de memoria. Las regiones iniciales del proceso se van a
corresponder bsicamente con las distintas secciones del ejecutable.
Cada regin es una zona contigua que est caracterizada por la direccin dentro del mapa del
proceso donde comienza y por su tamao. Adems, tendr asociadas una serie de propiedades y
caractersticas especficas como las siguientes:
Soporte de la regin. El objeto de memoria asociado a la regin. En l est almacenado el
contenido inicial de la regin. Se presentan normalmente dos posibilidades:
Soporte en archivo. El objeto est almacenado en un archivo o en parte del mismo.
Sin soporte. El objeto no tiene un contenido inicial. En algunos entornos se les denomina
objetos annimos.
Tipo de uso compartido:
Privada. El contenido de la regin slo es accesible al proceso que la contiene. Las
modificaciones sobre la regin no se reflejan en el objeto de memoria.
Compartida. El contenido de la regin puede ser compartido por varios procesos. Las
modificaciones en el contenido de la regin se reflejan en el objeto de memoria.
Proteccin. Tipo de acceso permitido. Tpicamente se distinguen tres tipos:
Lectura. Se permiten accesos de lectura de operandos de instrucciones.
Ejecucin. Se permiten accesos de lectura de instrucciones (fetch).
Escritura. Se permiten accesos de escritura.
Tamao fijo o variable. En el caso de regiones de tamao variable, se suele distinguir si la
regin crece hacia direcciones de memoria menores o mayores.
Como se puede observar en la Figura 4.10, las regiones que presenta el mapa de memoria
inicial del proceso se corresponden bsicamente con las secciones del ejecutable ms la pila inicial
del proceso, a saber:

Gestin de memoria

179

Cdigo (o texto). Se trata de una regin compartida de lectura/ejecucin. Es de tamao fijo


(el indicado en la cabecera del ejecutable). El soporte de esta regin est en la seccin
correspondiente del ejecutable.
Datos con valor inicial. Se trata de una regin privada ya que cada proceso que ejecuta un
determinado programa necesita una copia propia de las variables del mismo. Es de lectura/escritura y de tamao fijo (el indicado en la cabecera del ejecutable). El soporte de esta
regin est en la seccin correspondiente del ejecutable.
Datos sin valor inicial. Se trata de una regin privada de lectura/escritura y de tamao fijo (el
indicado en la cabecera del ejecutable). Como se coment previamente, esta regin no tiene
soporte en el ejecutable ya que su contenido inicial es irrelevante. En muchos sistemas se le
da un valor inicial de cero a toda la regin por motivos de confidencialidad.
Pila. Esta regin es privada y de lectura/escritura. Servir de soporte para almacenar los
registros de activacin de las llamadas a funciones (las variables locales, parmetros, direccin de retorno, etc.). Se trata, por tanto, de una regin de tamao variable que crecer
cuando se produzcan llamadas a funciones y decrecer cuando se retorne de las mismas.
Tpicamente, esta regin crece hacia las direcciones ms bajas del mapa de memoria. De
manera similar a la regin de datos sin valor inicial, por razones de confidencialidad de la
informacin, cuando crece la pila se rellena a cero la zona expandida. En el mapa inicial
existe ya esta regin que contiene tpicamente los argumentos especificados en la invocacin del programa (en el caso de POSIX, estos argumentos son los especificados en el
segundo parmetro de la funcin execvp).
Los sistemas operativos modernos ofrecen un modelo de memoria dinmico en el que el mapa
de un proceso est formado por un nmero variable de regiones que pueden aadirse o eliminarse
durante la ejecucin del mismo. Adems de las regiones iniciales ya analizadas, durante la ejecucin
del proceso pueden crearse nuevas regiones relacionadas con otros aspectos tales como los siguientes:
Archivo ejecutable
0

Cabecera

Nmero mgico
Contador de programa inicial
....................
Tabla de secciones

Mapa de memoria
0

1000

Cdigo

Cdigo
5000

Secciones

4000
Datos con valor inicial

Datos con valor inicial

................

5000

Datos sin valor inicial

8000
Tabla de smbolos

Argumentos del programa

Figura 4.10.

Mapa de memoria inicial a partir del ejecutable.

Pila

180

Sistemas operativos. Una visin aplicada

Heap. La mayora de los lenguajes de alto nivel ofrecen la posibilidad de reservar espacio en
tiempo de ejecucin. En el caso del lenguaje C se usa la funcin malloc para ello. Esta
regin sirve de soporte para la memoria dinmica que reserva un programa en tiempo de
ejecucin. Comienza, tpicamente, justo despus de la regin de datos sin valor inicial (de
hecho, en algunos sistemas se considera parte de la misma) y crece en sentido contrario a la
pila (hacia direcciones crecientes). Se trata de una regin privada de lectura/escritura, sin
soporte (se rellena inicialmente a cero), que crece segn el programa vaya reservando memoria dinmica y decrece segn la vaya liberando. Normalmente, cada programa tendr un
nico heap. Sin embargo, algunos sistemas, como Win32, permiten crear mltiples heaps.
En la Aclaracin 4.2 se intenta clarificar algunos aspectos de la memoria dinmica.
Archivos proyectados. Cuando se proyecta un archivo, se crea una regin asociada al mismo.
Este mecanismo ser analizado con ms profundidad al final del captulo, pero, a priori, se
puede resaltar que se trata de una regin compartida cuyo soporte es el archivo que se proyecta.
Memoria compartida. Cuando se crea una zona de memoria compartida y se proyecta, como
se analizar detalladamente en el Captulo 4, se origina una regin asociada a la misma. Se
trata, evidentemente, de una regin de carcter compartido, cuya proteccin la especifica el
programa a la hora de proyectarla.
Pilas de threads. Como se estudi en el Captulo 3, cada thread necesita una pila propia que
normalmente corresponde con una nueva regin en el mapa. Este tipo de regin tiene las
mismas caractersticas que la regin correspondiente a la pila del proceso.

ACLARACIN 4.2
El sistema operativo slo realiza una gestin bsica de la memoria dinmica. Generalmente, las aplicaciones no usan directamente estos servicios. La biblioteca de cada lenguaje de programacin utiliza
estos servicios bsicos para construir a partir de ellos unos ms avanzados orientados a las aplicaciones.
Un aspecto que conviene resaltar sobre la memoria dinmica es que es habitual cometer errores de
programacin al usarla. Los dos errores ms frecuentes son los punteros sueltos y las goteras en
memoria. El primer problema se produce cuando se intenta usar un puntero para acceder a una zona de
memoria, pero dicha zona se ha liberado previamente o, incluso, ni siquiera se haba reservado. En
cuanto a las goteras, se corresponde con situaciones en las que el programador se olvida de liberar una
zona de memoria que ya no necesita, con lo que sta queda permanentemente asignada al programa,
pero inutilizable produciendo una prdida de memoria. Algunos lenguajes incluyen un mecanismo de
recoleccin de basura que detecta cuando una zona no se usa, liberndola automticamente. Los
Programas 4.2 y 4.3 muestran ejemplos de estos problemas, respectivamente.

Programa 4.2.

Ejemplo del problema de los punteros sueltos.

int *p, *q;


p=malloc (sizeof(int));
*p=7;
free(p);
....
*q=*p; /* p y q son dos punteros sueltos */

Gestin de memoria

Programa 4.3.

181

Ejemplo del problema de las goteras.

int *p, *q;


p=malloc (sizeof(int));
q=malloc (sizeof(int));
p=q;
/* la primera zona reservada queda inutilizable */

En la Figura 4.11 se muestra un hipottico mapa de memoria que contiene algunos de los tipos
de regiones comentadas en esta seccin.
Como puede apreciarse en la figura, la carga de una biblioteca dinmica implicar la creacin
de un conjunto de regiones asociadas a la misma que contendrn las distintas secciones de la
biblioteca (cdigo y datos globales).
Hay que resaltar que, dado el carcter dinmico del mapa de memoria de un proceso (se
crean y destruyen regiones, algunas regiones cambian de tamao, etc.), existirn, en un determinado instante, zonas sin asignar (huecos) dentro del mapa de memoria del proceso. Cualquier
acceso a estos huecos representa un error y debera ser detectado y tratado por el sistema operativo.
Por ltimo, hay que recalcar que, dado que el sistema operativo es un programa, su mapa de
memoria contendr tambin regiones de cdigo, datos y heap (el sistema operativo tambin usa
memoria dinmica).

Mapa de memoria
Cdigo
Datos con valor inicial
Datos sin valor inicial
Heap

Archivo proyectado F

Zona de memoria compartida


Cdigo biblioteca dinmica B
Datos biblioteca dinmica B
Pila de thread 1

Pila del proceso

Figura 4.11.

Mapa de memoria de un proceso hipottico.

182

Sistemas operativos. Una visin aplicada

4.2.3. Operaciones sobre regiones


Durante la vida de un proceso, su mapa de memoria va evolucionando y con l las regiones incluidas en el mismo. En aras de facilitar el estudio que se realizar en el resto de este captulo, en esta
seccin se identifican qu operaciones se pueden realizar sobre una regin dentro del mapa de un
proceso. En esta exposicin se plantean las siguientes operaciones genricas:
Crear una regin dentro del mapa de un proceso asocindola un objeto de memoria. El
sistema operativo crea una nueva regin vinculada al objeto en el lugar correspondiente del
mapa asignndola los recursos necesarios y estableciendo las caractersticas y propiedades
de la misma (tipo de soporte, carcter privado o compartido, tipo de proteccin y tamao fijo
o variable). En la creacin del mapa de un proceso asociado a un determinado programa, se
realiza esta operacin por cada una de las regiones iniciales (cdigo, datos con valor inicial,
datos sin valor inicial y pila). Durante la ejecucin del programa, tambin se lleva a cabo en
diferentes situaciones como, por ejemplo, cuando se carga una biblioteca dinmica o cuando
se proyecta un archivo.
Eliminar una regin del mapa de un proceso. Esta operacin libera todos los recursos
vinculados a la regin que se elimina. Cuando un proceso termina, voluntaria o involuntariamente, se liberan implcitamente todas sus regiones. En el caso de una regin que corresponda con una zona de memoria compartida o un archivo proyectado, el proceso puede solicitar
explcitamente su eliminacin del mapa.
Cambiar el tamao de una regin. El tamao de la regin puede cambiar ya sea por una
peticin explcita del programa, como ocurre con la regin del heap, o de forma implcita,
como sucede cuando se produce una expansin de la pila. En el caso de un aumento de
tamao, el sistema asignar los recursos necesarios a la regin comprobando previamente
que la expansin no provoca un solapamiento, en cuyo caso no se llevara a cabo. Cuando
se trata de una reduccin de tamao, se liberan los recursos vinculados al fragmento liberado.
Duplicar una regin del mapa de un proceso en el mapa de otro. Dada una regin asociada a un determinado objeto de memoria, esta operacin crea una nueva regin vinculada a
un objeto de memoria que es una copia del anterior. Por tanto, las modificaciones que se
realizan en una regin no afectan a la otra. Esta operacin servira de base para llevar a
cabo la creacin de un proceso mediante el servicio fork de POSIX, que requiere duplicar
el mapa de memoria del proceso del padre en el proceso hijo. En sistemas operativos que
no tengan primitivas de creacin de procesos de este estilo no se requerira esta operacin.
En las siguientes secciones se analiza la evolucin de la gestin de memoria en los sistemas
operativos. Dicha evolucin ha estado muy ligada con la del hardware de gestin de memoria del
procesador ya que, como se analiz en la primera seccin del captulo, se necesita que sea el
procesador el que trate cada una de las direcciones que genera un programa para cumplir los requisitos de reubicacin y proteccin. La progresiva disponibilidad de procesadores con un hardware de
gestin de memoria ms sofisticado ha permitido que el sistema operativo pueda implementar
estrategias ms efectivas para manejar la memoria.
En estas prximas secciones se va a revisar brevemente esta evolucin, distinguiendo, por
simplicidad, nicamente dos etapas en la misma: desde los esquemas que realizaban una asignacin
contigua de memoria hasta los esquemas actuales que estn basados en la memoria virtual. Como
etapa intermedia entre estos dos esquemas, se presentar la tcnica del intercambio.

Gestin de memoria

183

4.3. ESQUEMAS DE MEMORIA BASADOS EN ASIGNACIN CONTIGUA


Un esquema simple de gestin de memoria consiste en asignar a cada proceso una zona contigua de
memoria para que en ella resida su mapa de memoria. Dentro de esta estrategia general hay diversas
posibilidades. Sin embargo, dado el alcance y objetivo de este tema, la exposicin se centrar slo
en uno de estos posibles esquemas: la gestin contigua basada en particiones dinmicas. Se trata de
un esquema que se us en el sistema operativo OS/MVT de IBM en la dcada de los sesenta.
Con esta estrategia, cada vez que se crea un proceso, el sistema operativo busca un hueco en
memoria de tamao suficiente para alojar el mapa de memoria del mismo. El sistema operativo
reservar la parte del hueco necesaria, crear en ella el mapa inicial del proceso y establecer una
funcin de traduccin tal que las direcciones que genera el programa se correspondan con la zona
asignada.
En primer lugar, se presentar qu hardware de gestin de memoria se requiere para realizar
este esquema para, a continuacin, describir cul es la labor del sistema operativo.
Hardware
Como ya se estudi en el Captulo 1, este esquema requiere un hardware de memoria relativamente
simple. Tpicamente el procesador tendr dos registros valla, nicamente accesibles en modo privilegiado, que utilizar para tratar cada una de las direcciones que genera un programa. Como se
puede observar en la Figura 4.12, la funcin de estos registros ser la siguiente:
Registro lmite. El procesador comprueba que cada direccin que genera el proceso no es
mayor que el valor almacenado en este registro. En caso de que lo sea, se generar una
excepcin.
Registro base. Una vez comprobado que la direccin no rebasa el lmite permitido, el procesador le sumar el valor de este registro, obtenindose con ello la direccin de memoria
fsica resultante.
Memoria
0
Proceso 4
UCP

10000
MMU
R.lmite R.base
21000
4000

PC
8
R. instruccin
LOAD R3, /1500

1500

>

NO

S
Excepcin

10020
Proceso 7

22500
15051

Proceso 3
20500
21000
25000
N

Figura 4.12.

Estado de la MMU durante la ejecucin del proceso 2.

Proceso 2
.........................................

184

Sistemas operativos. Una visin aplicada

Observe que los registros valla estarn desactivados cuando el procesador est en modo privilegiado. De esta forma, el sistema operativo podr acceder a toda la memoria del sistema. Sin
embargo, a veces el sistema operativo necesitar traducir una direccin lgica de un proceso que
recibe como argumento de una llamada al sistema. En ese caso, el mismo deber aplicar a esa
direccin los registros valla.
Gestin del sistema operativo
El sistema operativo nicamente tendr que almacenar en el bloque de control de cada proceso
cules son los valores que deben tener estos dos registros para dicho proceso. Observe que este par
de valores son los que definen la funcin de traduccin que corresponde al proceso y que, evidentemente, su almacenamiento apenas consume espacio. Cuando se produzca un cambio de proceso, el
sistema operativo deber cargar los registros valla del procesador con los valores correspondientes
al proceso que se va a activar.
El sistema operativo mantiene informacin sobre el estado de la memoria usando una estructura de datos que identifica qu partes de la memoria estn libres. Tpicamente usa una lista que
almacena la direccin inicial y el tamao de cada zona libre o hueco (vase la Aclaracin 4.3 que
analiza los distintos usos de este trmino en este entorno). Observe que en la gestin de esta lista,
cada vez que una zona pasa de ocupada a libre hay que comprobar si el nuevo espacio libre se puede
fundir con posibles zonas libres contiguas. Adems, deber mantener una tabla de regiones para
identificar qu partes de la memoria otorgada al proceso estn asignadas a regiones y cules estn
libres.
Con esta estrategia, como muestra la figura anterior, segn se van ejecutando distintos procesos, van quedando fragmentos en la memoria que, dado su pequeo tamao, no podran ser
asignados a ningn proceso. A este problema se le denomina fragmentacin externa y conlleva
una mala utilizacin de la memoria por la progresiva fragmentacin del espacio de almacenamiento. Una posible solucin a este problema sera compactar la memoria moviendo los mapas de
memoria de los procesos para que queden contiguos, dejando as el espacio libre tambin contiguo.
Esta transferencia implicara tambin el reajuste de los registros valla de acuerdo a la nueva posicin de cada proceso. Sin embargo, esta compactacin es un proceso bastante ineficiente.

ACLARACIN 4.3
Los huecos en la memoria
Una de las labores del gestor de memoria es controlar qu zonas de la memoria estn ocupadas y cules
estn libres. El trmino hueco se utiliza para denominar a estas ltimas. Sin embargo, hay que resaltar
que este mismo trmino se puede aplicar en diferentes niveles de la gestin de memoria.
Huecos en la memoria principal. Se trata de zonas no asignadas a ningn proceso. El sistema
operativo utiliza una estructura de datos para almacenar esta informacin.
Huecos en el mapa del proceso. Como se coment previamente, en el mapa de un proceso existen
huecos entre las distintas regiones de un proceso que permiten que stas puedan cambiar de
tamao o crearse dinmicamente. La tabla de regiones de cada proceso identifica estos huecos.
Huecos en el heap. Segn el programa va solicitando y liberando memoria dinmica se van
creando huecos en la regin de heap. Observe que se trata de huecos que, sin embargo, se
corresponden con una zona ocupada en la tabla de regiones. La gestin del espacio en el heap
generalmente no la realiza el sistema operativo sino una biblioteca.
En los tres niveles hay que utilizar una poltica de asignacin de espacio. Ms adelante se analizan
diversas polticas de asignacin.

Gestin de memoria

185

Poltica de asignacin de espacio


El sistema operativo debe llevar a cabo una poltica de asignacin de espacio. Cuando se precisa
crear el mapa de memoria de un proceso que ocupa un determinado tamao, esta poltica decide
cul de las zonas libres se debera usar, intentando conjugar dos aspectos: un buen aprovechamiento
de la memoria y un algoritmo de decisin eficiente.
Realmente, el problema de la asignacin dinmica de espacio es un problema ms general que
se presenta tambin fuera del mbito de la informtica. Se trata, por tanto, de un problema ampliamente estudiado. Tpicamente, existen tres estrategias bsicas:
El mejor ajuste (best-fit). Se elige la zona libre ms pequea donde quepa el mapa del
proceso. A priori, puede parecer la mejor solucin. Sin embargo, esto no es as. Por un lado,
se generan nuevos espacios libres muy pequeos. Por otro lado, la seleccin del mejor hueco
exige comprobar cada uno de ellos o mantenerlos ordenados por tamao. Ambas soluciones
conducen a un algoritmo ineficiente.
El peor ajuste (worst-fit). Se elige el hueco ms grande. Con ello se pretende que no se
generen nuevos huecos pequeos. Sin embargo, sigue siendo necesario recorrer toda la lista
de huecos o mantenerla ordenada por tamao.
El primero que ajuste (first-fit). Aunque pueda parecer sorprendente a priori, sta suele ser
la mejor poltica. Es muy eficiente ya que basta con encontrar una zona libre de tamao
suficiente y proporciona un aprovechamiento de la memoria aceptable.
Una estrategia de asignacin interesante es el sistema buddy [Knowlton, 1965]. Est basado en
el uso de listas de huecos cuyo tamao son potencias de dos. La gestin interna de la memoria del
propio sistema operativo en UNIX 4.3 BSD y en Linux utiliza variantes de este algoritmo. Dada su
relativa complejidad, se remite al lector a la referencia antes citada.
Es interesante resaltar que estas estrategias de asignacin tambin se utilizan en la gestin del
heap, tanto en el de los procesos como en el del propio sistema operativo.
Valoracin del esquema contiguo
Una vez realizada esta presentacin de los fundamentos de los esquemas de asignacin contigua, se
puede analizar hasta qu punto cumplen los requisitos planteados al principio del captulo:
Espacios lgicos independientes. Los registros valla realizan la reubicacin del mapa de
memoria del proceso a la zona contigua asignada.
Proteccin. El uso del registro lmite asegura que un proceso no pueda acceder a la memoria
de otros procesos o del sistema operativo, crendose, por tanto, espacios disjuntos.
Compartir memoria. Como se coment al principio del captulo, la asignacin contigua
impide la posibilidad de que los procesos compartan memoria.
Soporte de las regiones del proceso. Con esta estrategia no es posible controlar si son correctos los accesos que genera el programa a las distintas regiones de su mapa, ya sea por
intentar realizar una operacin no permitida (p. ej.: escribir en la regin de cdigo) o por
acceder a una zona no asignada actualmente (hueco). Asimismo, no es posible evitar que las
zonas del mapa que no estn asignadas en un determinado momento no consuman memoria.
Por tanto, hay que reservar desde el principio toda la memoria que puede llegar a necesitar el
proceso durante su ejecucin, lo cual conduce a un mal aprovechamiento de la memoria.
Maximizar el rendimiento. Como se analiz previamente, este tipo de asignacin no proporciona un buen aprovechamiento de la memoria presentando fragmentacin externa. Adems,
no sirve de base para construir un esquema de memoria virtual.

186

Sistemas operativos. Una visin aplicada

Mapas de memoria grandes para los procesos. Este esquema no posibilita el uso de mapas
grandes, ya que quedan limitados por el tamao de la memoria fsica.
Operaciones sobre regiones
Las limitaciones del hardware condicionan cmo se gestionan las regiones con este esquema. No se
puede compartir memoria ni se pueden controlar los accesos errneos.
Cuando se crea un proceso se le otorga una zona de memoria de tamao fijo que quedar
asignada al proceso hasta que ste termine. El tamao de esta regin deber ser suficiente para
albergar las regiones iniciales del proceso y un hueco que permita que las regiones puedan crecer y
que se incluyan nuevas regiones (p. ej.: bibliotecas dinmicas). Dado que el tamao de la zona
asignada al proceso no va a cambiar durante su ejecucin, es importante establecer un tamao
adecuado para el hueco. Si es demasiado pequeo, puede agotarse el espacio durante la ejecucin
del proceso debido al crecimiento de una regin o a la inclusin de una nueva regin. Si es demasiado grande, se produce un desperdicio ya que la memoria asociada al hueco no podr aprovecharse
mientras dure la ejecucin del programa.
Cuando se crea una regin, ya sea en el mapa inicial o posteriormente, se le da una parte del
espacio asignado al proceso actualizando la tabla de regiones adecuadamente. En este espacio se
carga el contenido inicial de la regin (de un archivo o con ceros).
Cuando se elimina una regin se libera su espacio quedando disponible para otras regiones. Al
terminar el proceso se liberan todas sus regiones liberando todo el espacio del mapa para que se
pueda usar para crear otros procesos.
El cambio de tamao de una regin implica la asignacin o liberacin de la zona afectada. En
el caso de un aumento, antes se comprueba que hay espacio libre contiguo a la regin sin producirse
un solapamiento con otra regin. Esta comprobacin se puede realizar cuando la regin crece por
una solicitud del programa (como ocurre con el heap). Sin embargo, no se puede llevar a cabo en el
caso de una expansin de la pila, ya que sta se realiza sin intervencin del sistema operativo, por lo
que la pila puede desbordarse y afectar a otra regin.
Por ltimo, la operacin de duplicar una regin implica crear una regin nueva y copiar el
contenido de la regin original. Este esquema no permite optimizar esta operacin necesaria para
implementar el servicio fork de POSIX.

4.4. INTERCAMBIO
Como se coment previamente, la tcnica del intercambio (swapping) signific en su momento una
manera de permitir que en los sistemas del tiempo compartido existieran ms procesos de los que
caben en memoria. Se puede considerar que se trata de un mecanismo antecesor de la memoria
virtual. En esta seccin se presentarn de forma breve los fundamentos de esta tcnica.
El intercambio se basa en usar un disco o parte de un disco (dispositivo de swap) como respaldo de la memoria principal. Cuando no caben en memoria todos los procesos activos (p. ej.: debido
a que se ha creado uno nuevo), se elige un proceso residente y se copia en swap su imagen en
memoria. El criterio de seleccin puede tener en cuenta aspectos tales como la prioridad del proceso, el tamao de su mapa de memoria, el tiempo que lleva ejecutando y, principalmente, su estado.
Se debe intentar expulsar (swap out) procesos que estn bloqueados. Cuando se expulsa un proceso
no es necesario copiar toda su imagen al swap. Los huecos en el mapa no es preciso copiarlos, ya
que su contenido es intrascendente. Tampoco se tiene que copiar el cdigo, ya que se puede volver
a recuperar directamente del ejecutable.

Gestin de memoria

187

Evidentemente, un proceso expulsado tarde o temprano debe volver a activarse y cargarse en


memoria principal (swap in). Slo se deberan volver a cargar aquellos procesos que estn listos
para ejecutar. Esta readmisin en memoria se activar cuando haya espacio de memoria disponible
(p. ej.: debido a que se ha terminado un proceso) o cuando el proceso lleve un cierto tiempo
expulsado. Observe que al tratarse de un sistema de tiempo compartido, se debe repartir el procesador entre todos los procesos. Por ello, en numerosas ocasiones hay que expulsar un proceso para
poder traer de nuevo a memoria a otro proceso que lleva expulsado un tiempo suficiente.
En cuanto al dispositivo de swap, hay dos alternativas en la asignacin de espacio:
Preasignacin. Al crear el proceso ya se reserva espacio de swap suficiente para albergarlo.
Sin preasignacin. Slo se reserva espacio de swap cuando se expulsa el proceso.
Un ltimo aspecto a tener en cuenta es que no debera expulsarse un proceso mientras se estn
realizando operaciones de entrada/salida por DMA vinculadas a su imagen de memoria ya que esto
causara que el dispositivo accediera al mapa de otro proceso.

4.5. MEMORIA VIRTUAL


En prcticamente todos los sistemas operativos modernos se usa la tcnica de memoria virtual. En
esta seccin se analizarn los conceptos bsicos de esta tcnica. En el Captulo 1 ya se presentaron
los fundamentos de la memoria virtual, por lo que no se volver a incidir en los aspectos estudiados
en el mismo.
Como se estudi en dicho captulo, la memoria en un sistema est organizada como una jerarqua de niveles de almacenamiento, entre los que se mueve la informacin dependiendo de la
necesidad de la misma en un determinado instante. La tcnica de memoria virtual se ocupa de la
transferencia de informacin entre la memoria principal y la secundaria. La memoria secundaria
est normalmente soportada en un disco (o particin). Dado que, como se ver ms adelante, la
memoria virtual se implementa sobre un esquema de paginacin, a este dispositivo se le denomina
dispositivo de paginacin. Tambin se usa el trmino dispositivo de swap. Aunque este trmino
no es muy adecuado, ya que proviene de la tcnica del intercambio, por tradicin se usa frecuentemente y se utilizar indistintamente en esta exposicin.
Es importante recordar en este punto que, como se explic en el Captulo 1, el buen rendimiento del sistema de memoria virtual est basado en que los procesos presentan la propiedad de proximidad de referencias. Esta propiedad permite que un proceso genere muy pocos fallos aunque
tenga en memoria principal slo una parte de su imagen de memoria (conjunto residente). El
objetivo del sistema de memoria virtual es intentar que la informacin que est usando un proceso
en un determinado momento (conjunto de trabajo) est residente en memoria principal. O sea, que
el conjunto residente del proceso contenga a su conjunto de trabajo.
Algunos beneficios del uso de memoria virtual son los siguientes:
Se produce un aumento del grado de multiprogramacin al no ser necesario que todo el
mapa de memoria de un proceso est en memoria principal para poder ejecutarlo. Este
aumento implica una mejora en el rendimiento del sistema. Sin embargo, como se analiz en
el Captulo 2, si el grado de multiprogramacin se hace demasiado alto, el nmero de fallos
de pgina se dispara y el rendimiento del sistema baja drsticamente. A esta situacin se le
denomina hiperpaginacin y se estudiar ms adelante.
Se pueden ejecutar programas ms grandes que la memoria principal disponible.

188

Sistemas operativos. Una visin aplicada

Hay que resaltar que el uso de la memoria virtual no acelera la ejecucin de un programa, sino
que puede que incluso la ralentice debido a la sobrecarga asociada a las transferencias entre la
memoria principal y la secundaria. Esto hace que esta tcnica no sea apropiada para sistemas de
tiempo real.
En esta seccin se estudia, en primer lugar, el hardware requerido por esta tcnica presentando
los esquemas de paginacin, segmentacin y segmentacin paginada. Hay que resaltar que estos
esquemas tambin se pueden usar sin memoria virtual, aportando beneficios apreciables con respecto a los esquemas de asignacin contigua. De hecho, algunas versiones de UNIX usaban paginacin e intercambio pero no memoria virtual. Sin embargo, en la actualidad el uso de estos esquemas
est ligado a la memoria virtual. Despus de presentar el hardware, se mostrar cmo construir un
esquema de memoria virtual sobre el mismo estudiando las diferentes polticas de gestin de memoria virtual.

4.5.1. Paginacin
Como se ha analizado previamente, los sistemas de gestin de memoria basados en asignacin
contigua presentan numerosas restricciones a la hora de satisfacer los requisitos que debe cumplir el
gestor de memoria del sistema operativo. La paginacin surge como un intento de paliar estos
problemas sofisticando apreciablemente el hardware de gestin de memoria del procesador y
aumentado considerablemente la cantidad de informacin de traduccin que se almacena por cada
proceso.
Aunque el objetivo de este captulo no es estudiar en detalle cmo es el hardware de gestin de
memoria (MMU) de los sistemas basados en paginacin, ya que es un tema que pertenece a la
materia de estructura de computadoras, se considera que es necesario presentar algunos conceptos
bsicos del mismo para poder comprender adecuadamente su funcionamiento. Estos esquemas ya
fueron presentados en el Captulo 1, por lo que en esta seccin no se volver a incidir en los
aspectos estudiados en el mismo.
Como su nombre indica, la unidad bsica de este tipo de esquema es la pgina. La pgina
corresponde con una zona de memoria contigua de un determinado tamao. Por motivos de eficiencia en la traduccin, este tamao debe ser potencia de 2 (un tamao de pgina de 4 KB es un valor
bastante tpico).
El mapa de memoria de cada proceso se considera dividido en pginas. A su vez, la memoria
principal del sistema se considera dividida en zonas del mismo tamao que se denominan marcos
de pgina. Un marco de pgina contendr en un determinado instante una pgina de memoria de un
proceso. La estructura de datos que relaciona cada pgina con el marco donde est almacenada es la
tabla de pginas. El hardware de gestin de memoria usa esta tabla para traducir todas las direcciones que genera un programa. Como se analiz en el Captulo 1, esta traduccin consiste en
detectar a qu pgina del mapa corresponde una direccin lgica y acceder a la tabla de pginas
para obtener el nmero de marco donde est almacenada dicha pgina. La direccin fsica tendr
un desplazamiento con respecto al principio del marco igual que el que tiene la direccin lgica
con respecto al principio de la pgina. La Figura 4.13 muestra cmo es este esquema de traduccin.
Tpicamente, la MMU usa dos tablas de pginas. Una tabla de pginas de usuario para traducir
las direcciones lgicas del espacio de usuario (en algunos procesadores se corresponden con las
direcciones que empiezan por un 0) y una tabla de pginas del sistema para las direcciones lgicas
del espacio del sistema (las direcciones lgicas que empiezan por un 1). Estas ltimas slo pueden
usarse cuando el procesador est en modo privilegiado.

Gestin de memoria

189

Direccin lgica
Pgina

Registro base
de la TP (RIED)

Figura 4.13.

0
1
2
3
4
5
.
.
.
.
.
.
.
.
.
.
.
.
.
n

Byte

Marco de
pgina

.
.
.

Esquema de traduccin de la paginacin.

Hay que resaltar que si se trata de un procesador con mapa comn de entrada/salida y de
memoria, las direcciones de entrada/salida tambin se accedern a travs de la tabla de pginas.
Para impedir que los procesos de usuario puedan acceder a ellas, estas direcciones de entrada/salida
estarn asociadas a direcciones lgicas del espacio del sistema.
La paginacin no proporciona un aprovechamiento ptimo de la memoria como lo hara un
esquema que permitiese que cada palabra del mapa de memoria de un proceso pudiera corresponder
con cualquier direccin de memoria. Sin embargo, esta estrategia, como se analiz al principio del
captulo, es irrealizable en la prctica dada la enorme cantidad de informacin de traduccin que
implicara. La paginacin presenta una solucin ms realista permitiendo que cada pgina del mapa
de un proceso se pueda corresponder con cualquier marco de memoria. Este cambio de escala
reduce drsticamente el tamao de la tabla de traduccin, pero, evidentemente, proporciona un peor
aprovechamiento de la memoria, aunque mantenindose en unos trminos aceptables. Observe que
con la paginacin se le asigna a cada proceso un nmero entero de marcos de pgina, aunque, en
general, su mapa no tendr un tamao mltiplo del tamao del marco. Por tanto, se desperdiciar
parte del ltimo marco asignado al proceso, lo que correspondera con las zonas sombreadas que
aparecen en la Figura 4.14. A este fenmeno se le denomina fragmentacin interna e implica que
por cada proceso de desperdiciar, en trmino medio, la mitad de una pgina, lo cual es un valor
bastante tolerable.
Cada entrada de la tabla de pginas, adems del nmero de marco que corresponde con esa
pgina, contiene informacin adicional tal como la siguiente:
Informacin de proteccin. Un conjunto de bits que especifican qu tipo de accesos estn
permitidos. Tpicamente, se controla el acceso de lectura, de ejecucin y de escritura.

190

Sistemas operativos. Una visin aplicada


T. Pginas Pr. 1
Pgina 0

Marco 2

Memoria

Pgina 1

Marco N
..............

Pg. 1 Pr. 2

Marco 0

Pg. P Pr. 2

Pgina M

Marco 3

Pg. 0 Pr. 1

Marco 1
Marco 2

T. Pginas Pr. 2

Pg. M Pr. 1

Marco 3

Pgina 0

Marco 4

Marco 4

Pgina 1

Marco 0
..............

Pg. 0 Pr. 2
............
Pg. 1 Pr. 1

Marco N

Pgina P

Figura 4.14.

Marco 1

Fragmentacin interna asociada a la paginacin.

Indicacin de pgina vlida. Un bit que especifica si esa pgina es vlida, o sea, tiene una
traduccin asociada. Observe que, en el caso de que no lo sea, la informacin del nmero de
marco es irrelevante. Como se analizar ms adelante, este bit tambin se utilizar en los esquemas de memoria virtual para indicar que la pgina no est residente en memoria principal.
El hardware consulta esta informacin cada vez que realiza una traduccin para verificar si el
acceso es correcto. En caso contrario, genera una excepcin que activa al sistema operativo.
En la entrada de la tabla de pginas puede haber informacin adicional, tal como la siguiente:
Indicacin de pgina accedida. La MMU activa este bit indicador cuando se accede a una
direccin lgica que pertenece a esa pgina.
Indicacin de pgina modificada. La MMU activa este bit indicador cuando se escribe en
una direccin lgica que pertenece a esa pgina.
Desactivacin de cache. Este bit indica que no debe usarse la cache de la memoria principal
para acelerar el acceso a las direcciones de esta pgina. En sistemas con mapa comn de
memoria y de entrada/salida, se activara en las pginas que contienen direcciones asociadas
a dispositivos de entrada/salida, ya que para estas direcciones no se debe usar la cache sino
acceder directamente al dispositivo.
Un aspecto importante en el rendimiento de un sistema de paginacin es el tamao de la
pgina. Evidentemente, su tamao debe ser potencia de 2 y, dado que va a servir de base a la
memoria virtual, mltiplo del tamao del bloque de disco. El tamao tpico puede estar entre 2 KB
y 16 KB. Hay que tener en cuenta que la determinacin del tamao ptimo es un compromiso entre
diversos factores:
Un tamao pequeo reduce la fragmentacin y, como se ver ms adelante, cuando se
usa para implementar memoria virtual, permite ajustarse mejor al conjunto de trabajo del
proceso.
Un tamao grande implica tablas ms pequeas y, cuando se usa para implementar memoria
virtual, un mejor rendimiento en los accesos a disco.
Gestin del sistema operativo
La tabla de pginas hace la funcin de traduccin que se analiz al principio del captulo. El sistema
operativo mantendr una tabla de pginas para cada proceso y se encargar de notificar al hardware

Gestin de memoria

191

en cada cambio de proceso qu tabla tiene que usar dependiendo del proceso que est ejecutando,
utilizando para ello el registro base de la tabla de pginas o el registro identificador del espacio de
direccionamiento (RIED). En otras palabras, el sistema operativo es el encargado de definir la
funcin de correspondencia entre pginas y marcos mediante la tabla de pginas, y el hardware es el
encargado de aplicarla. Observe que el formato de la tabla de pginas y de sus entradas viene fijado
por el procesador. Sin embargo, en algunas ocasiones el sistema operativo quiere almacenar informacin propia, que no concierne al hardware, asociada a cada pgina. A veces, esta informacin
puede incluirse en la propia entrada de la tabla de pginas, almacenndola en alguna parte que no
usa la MMU. Sin embargo, si esto no es posible, el sistema operativo puede usar su propia tabla de
pginas para almacenar esta informacin.
El sistema operativo mantiene una nica tabla de pginas para s mismo. De esta forma, todos
los procesos comparten el sistema operativo. Cuando el sistema operativo est ejecutando una
llamada al sistema invocada por un proceso, puede acceder directamente a su propio mapa y al del
proceso.
Adems de las tablas de pginas, el sistema operativo debe usar una estructura para almacenar
el estado de ocupacin de la memoria principal. Se trata de la tabla de marcos de pgina que
permite conocer qu marcos estn libres y cules estn ocupados.
Por ltimo, ser necesario que el sistema operativo almacene por cada proceso su tabla de
regiones que contenga las caractersticas de cada regin especificando qu rango de pginas pertenecen a la misma.
Observe que el esquema de paginacin requiere que el sistema operativo tenga una serie de
estructuras de datos de tamao considerable para poder mantener la informacin requerida por el
mismo. Este gasto es mucho mayor que en el esquema de asignacin contigua. Evidentemente, es
el precio que hay que pagar para obtener una funcionalidad mucho mayor.
Valoracin de la paginacin
Una vez realizada esta presentacin de los fundamentos de los esquemas de paginacin, se puede
analizar cmo cumplen los requisitos planteados al principio del captulo:
Espacios lgicos independientes. Cada proceso tiene una tabla de pginas que crea un espacio lgico independiente para el mismo. La tabla es, por tanto, una funcin de traduccin
que hace corresponder las pginas del mapa de memoria del proceso con los marcos que
tiene asignados.
Proteccin. La tabla de pginas de un proceso restringe qu parte de la memoria puede ser
accedida por el mismo, permitiendo asegurar que los procesos usan espacios disjuntos.
Compartir memoria. Bajo la supervisin del sistema operativo, que es el nico que puede
manipular las tablas de pginas, dos o ms procesos pueden tener una pgina asociada al
mismo marco de pgina. Observe que el compartimento se realiza siempre con la granularidad de una pgina.
Soporte de las regiones del proceso. La informacin de proteccin presente en cada entrada
de la tabla de pginas permite controlar que los accesos a la regin son del tipo que sta
requiere. Asimismo, la informacin de validez detecta cundo se intenta acceder a huecos
dentro del mapa del proceso y, adems, elimina la necesidad de gastar memoria fsica para
estos huecos.
Maximizar el rendimiento. En primer lugar, la paginacin, a pesar de la fragmentacin
interna, obtiene un buen aprovechamiento de la memoria, ya que elimina la necesidad de
que el mapa de memoria de un proceso se almacene de forma contigua en memoria principal. As, cualquier marco que est libre se puede usar como contenedor de cualquier pgi-

192

Sistemas operativos. Una visin aplicada

na de cualquier proceso. Por otro lado, y ms importante todava, la paginacin puede servir
como base para construir un esquema de memoria virtual.
Mapas de memoria grandes para los procesos. Gracias a que los huecos no consumen espacio de almacenamiento, el sistema operativo puede crear un mapa de memoria para el proceso que ocupe todo su espacio lgico direccionable. De esta forma, habr suficientes huecos
para que las regiones crezcan o se incluyan nuevas regiones, sin penalizar con ello el gasto
en espacio de almacenamiento. Por otro lado, y ms importante todava, la paginacin permite implementar un esquema de memoria virtual.
Implementacin de la tabla de pginas
El esquema bsico de paginacin que acaba de describirse, aunque funciona de manera correcta,
presenta serios problemas a la hora de implementarlo directamente. Estos problemas surgen debido
a la necesidad de mantener las tablas pginas en memoria principal. Esto conlleva problemas de
eficiencia y de consumo de espacio.
Por lo que se refiere a los problemas de eficiencia, dado que para acceder a la posicin de
memoria solicitada, la MMU debe consultar la entrada correspondiente de la tabla de pginas, se
producirn dos accesos a memoria por cada acceso real solicitado por el programa. Esta sobrecarga
es intolerable, ya que reducira a la mitad el rendimiento del sistema. Para solventar este problema,
la MMU incluye internamente una especie de cache de traducciones llamada TLB (Translation
Lookaside Buffer), cuyo modo de operacin se mostrar en la siguiente seccin.
Por otro lado, existe un problema de gasto de memoria. Las tablas de pginas son muy grandes
y hay una por cada proceso activo. Como se coment previamente, la paginacin permite construir
mapas de memoria muy grandes para los procesos, ya que los huecos no consumen espacio. Sin
embargo, si se usa todo el espacio de direccionamiento, como es deseable para conseguir que los
procesos no tengan problemas de memoria durante su ejecucin, la tabla de pginas debe tener
tantas entradas como pginas hay en el espacio lgico, aunque muchas de ellas estn marcadas
como invlidas al corresponder con huecos. Para resaltar esta circunstancia, a continuacin se
plantea un ejemplo.
Sea un procesador con una direccin lgica de 32 bits, un tamao de pgina de 4 KB y tal que
cada entrada de la tabla de pginas ocupa 4 bytes. Si se le asigna a cada proceso todo el espacio
direccionable, resultar un mapa de memoria de 232 bytes que corresponde con 220 pginas. La tabla
de pginas de cada proceso ocupa 4 MB (220 entradas * 4 bytes). Por tanto, se requeriran 4 MB de
memoria principal para cada tabla, lo que resulta en un gasto de memoria inadmisible. Observe que
la mayora de las entradas de la tabla de pginas de un proceso estaran vacas. As, por ejemplo, si
las regiones de un proceso requieren 16 MB, lo cual es una cantidad bastante considerable, slo
estaran marcadas como vlidas 4.096 entradas de las ms de un milln que hay en la tabla de
pginas. Observe que este problema se acenta enormemente en los procesadores modernos que
usan direcciones de 64 bits.
La solucin a este problema son las tablas de pginas multinivel y las tablas invertidas.
Translation Lookaside Buffer (TLB)
Para hacer que un sistema de paginacin sea aplicable en la prctica es necesario que la mayora de
los accesos a memoria no impliquen una consulta a la tabla de pginas, sino que nicamente requieran el acceso a la posicin solicitada. De esta forma, el rendimiento ser similar al de un sistema sin
paginacin.
Como se coment previamente, esto se logra mediante el uso de la TLB. Se trata de una
pequea memoria asociativa interna a la MMU que mantiene informacin sobre las ltimas pginas

Gestin de memoria

193

accedidas. Cada entrada en la TLB es similar a la de la tabla de pginas (nmero de marco, proteccin, bit de referencia, etc.), pero incluye tambin el nmero de la pgina para permitir realizar una
bsqueda asociativa. Existen dos alternativas en el diseo de una TLB dependiendo de si se almacenan identificadores de proceso o no.
TLB sin identificadores de proceso. La MMU accede a la TLB slo con el nmero de
pgina. Por tanto, cada vez que hay un cambio de proceso el sistema operativo debe invalidar la TLB ya que cada proceso tiene su propio mapa.
TLB con identificadores de proceso. La MMU accede a la TLB con el nmero de pgina y
un identificador de proceso. En cada entrada de la TLB, por tanto, se almacena tambin este
identificador. La MMU obtiene el identificador de un registro del procesador. El sistema
operativo debe encargarse de asignarle un identificador a cada proceso y de rellenar este
registro en cada cambio de proceso. De esta forma, no es necesario que el sistema operativo
invalide la TLB en cada cambio de proceso, pudiendo existir en la TLB entradas correspondientes a varios procesos.
Tradicionalmente, la TLB ha sido gestionada directamente por la MMU sin intervencin del
sistema operativo. La MMU consulta la TLB y, si se produce un fallo debido a que la traduccin de
esa pgina no est presente, la propia MMU se encarga de buscar la traduccin en la tabla de
pginas e insertarla en la TLB. De hecho, la TLB es casi transparente al sistema operativo, que slo
debe encargarse en cada cambio de proceso de solicitar a la MMU su volcado y, en caso de que no
use identificadores de proceso, su invalidacin. Observe que es necesario realizar un volcado de la
TLB a la tabla de pginas, ya que la informacin de los bits de pgina accedida o modificada se
actualizan directamente en la TLB, pero no en la tabla de pginas.
Algunos procesadores modernos (como, por ejemplo, MIPS o Alpha) tienen un diseo alternativo en el que se traspasa parte de la gestin de la TLB al sistema operativo. A este esquema se le
denomina TLB gestionada por software. La MMU se encarga de buscar la traduccin en la TLB,
pero si no la encuentra produce una excepcin que activa al sistema operativo. ste se debe encargar de buscar a mano en la tabla de pginas e insertar en la TLB la traduccin. Observe que, con
este esquema, la MMU se simplifica considerablemente, ya que no tiene que saber nada de las
tablas de pginas. Adems, proporciona ms flexibilidad, ya que el sistema operativo puede definir
las tablas de pgina a su conveniencia, sin ninguna restriccin impuesta por el hardware. Como
contrapartida, el sistema ser menos eficiente, ya que parte del proceso de traduccin se realiza por
software.
Tabla de pginas multinivel
Una manera de afrontar el problema del gasto de memoria de las tablas de pginas es utilizar tablas
de pgina multinivel. Con este esquema, en vez de tener una nica tabla de pginas por proceso, hay
una jerarqua de tablas. Existe una nica tabla de pginas de primer nivel. Cada entrada de esta tabla
apunta a tablas de pginas de segundo nivel. A su vez, las tablas de pgina de segundo nivel apuntan
a tablas de pgina de tercer nivel. As, sucesivamente, por cada nivel de la jerarqua. Las tablas de
pginas del ltimo nivel apuntan directamente a marcos de pgina. En la prctica, esta jerarqua se
limita a dos o tres niveles.
A la hora de traducir una direccin lgica, el nmero de pgina contenido en la misma se
considera dividido en tantas partes como niveles existan. En la Figura 4.15 se muestra cmo se
realiza la traduccin en un esquema con dos niveles.
Las entradas de las tablas de pgina de los distintos niveles tienen una estructura similar,
conteniendo informacin de proteccin y de validez. La diferencia entre las entradas de las tablas

194

Sistemas operativos. Una visin aplicada


Pgina

Direccin lgica

Registro base
de la TP (RIED)

1.er nivel

0
1
2
3
4
5
.
.
.
.
.
.
.
.
.
.
.
.
.
n

2. nivel

.
.
.

Tabla de pginas
de primer nivel

Byte

0
1
2
3
4
5
.
.
.
.
.
.
.
.
.
.
.
.
.
n

0
1
2
3
4
5
.
.
.
.
.
.
.
.
.
.
.
.
.
n

.
.
.

Marco de
pgina

.
.
.

Tabla de pginas
de segundo nivel

Figura 4.15.

Esquema de traduccin con un esquema de paginacin de dos niveles.

de niveles intermedios y las de las tablas de ltimo nivel es que las primeras contienen la direccin
de una tabla del siguiente nivel, mientras que las segundas incluyen la direccin del marco de
pgina correspondiente.
La ventaja de este modelo es que si todas las entradas de una tabla de pginas de cualquier
nivel estn marcadas como invlidas, no es necesario almacenar esta tabla de pginas. Bastara con
marcar como invlida la entrada de la tabla de pginas de nivel superior que corresponde con esa
tabla vaca. Observe que, dado que las tablas de pginas tradicionales de un solo nivel estn llenas
de entradas invlidas, lo que se est logrando con este esquema es ahorrar el almacenamiento de
estas entradas invlidas.
Retomando el ejemplo expuesto anteriormente de un procesador con una direccin lgica de 32
bits, un tamao de pgina de 4 KB y tal que cada entrada de la tabla de pginas ocupa 4 bytes,
supngase adems que el procesador utiliza un esquema de dos niveles con 10 bits de la direccin
dedicados a cada nivel. Con estos datos, la tabla de pginas de primer nivel tendra un tamao de 4 KB
(210 entradas de 4 bytes) que podran apuntar a 1.024 tablas de pginas de segundo nivel. A su vez,
cada tabla de pginas de segundo nivel ocupar tambin 4 KB (210 entradas de 4 bytes) que podran

Gestin de memoria

195

apuntar a 1.024 marcos. Cada tabla de segundo nivel cubre un espacio de direccionamiento de 4 MB
(1.024 marcos * 4 KB).
Si el proceso utiliza slo los 12 MB de la parte superior de su mapa (la de direcciones ms
bajas) y 4 MB de la parte inferior (la de direcciones ms altas), el espacio gastado en tablas de
pginas sera el correspondiente a la tabla de pginas de primer nivel (4 KB) ms 4 tablas de
pginas de segundo nivel para cubrir los 16 MB. Slo 4 entradas de la tabla de pginas de primer
nivel estarn marcadas como vlidas. Esto hace un total de 20 KB (5 tablas de pginas * 4 KB que
ocupa cada una) dedicados a tablas de pginas. Comparando este resultado con el obtenido para un
esquema con un solo nivel, se obtiene un ahorro apreciable. Se ha pasado de gastar 4 MB a slo 20
KB. En la Figura 4.16 se puede apreciar este ahorro. Observe que, en el caso hipottico de que un
proceso ocupara todo su mapa, las tablas de pginas multinivel no aportaran ningn ahorro, ms
bien al contrario ya que ocuparan ms espacio.
Hay que resaltar que el uso de la TLB es todava ms imprescindible con las tablas multinivel,
ya que si no habra que realizar siempre un acceso por cada nivel.
El esquema de tablas de pgina multinivel proporciona dos ventajas adicionales:
Permite compartir tablas de pginas intermedias. As, por ejemplo, en el caso de un sistema con dos niveles, si dos procesos comparten una regin que se corresponde con una
tabla de segundo nivel, pueden compartir directamente dicha tabla. O sea, cada proceso
tendr una entrada en su tabla de primer nivel que apunte a la tabla de segundo nivel
compartida. De esta forma, se ahorra espacio en almacenar entradas repetidas. Observe
que esto requiere que la regin que se comparte se corresponda con un nmero entero de
tablas de segundo nivel.
Slo es preciso que est residente en memoria la tabla de pginas de primer nivel. Las
restantes podran almacenarse en el disco y traerlas bajo demanda.

Tablas de pginas
segundo nivel

Memoria
Pgina 2048

..
.
Tabla de pginas
primer nivel
V
V
V
I

I
V

Pgina 1023

..
.

Pgina 0
Pgina 1024
Pgina 2047

..
.
Pgina 3071

..
.

Pgina 1048575 (2^20-1)

Pgina 1047552 (2^20-1024)

Figura 4.16.

Ventajas de las tablas de pginas multinivel.

196

Sistemas operativos. Una visin aplicada

Tabla de pginas invertida


Otra alternativa para reducir el gasto en tablas de pginas es usar una tabla invertida. Una tabla de
pginas invertida contiene una entrada por cada marco de pgina. Cada entrada identifica qu
pgina est almacenada en ese marco y cules son sus caractersticas. Para ello, contiene el nmero
de pgina y un identificador del proceso al que pertenece la pgina. Observe que, con este esquema
hay una nica tabla de pginas cuyo tamao es proporcional al tamao de la memoria principal. La
Figura 4.17 ilustra cmo se realiza una traduccin con este esquema.
La MMU usa una TLB convencional, pero cuando no encuentra en ella la traduccin debe
acceder a la tabla invertida para encontrarla. Dado que la tabla est organizada por marcos, no se
puede hacer una bsqueda directa. En principio, se deberan acceder a todas las entradas buscando
la pgina solicitada. Para agilizar esta bsqueda, generalmente la tabla de pginas se organiza como
una tabla hash. En esta exposicin no se entrar en ms detalles sobre esta organizacin (p. ej.:
explicar cmo se resuelven las colisiones de la funcin hash).
Esta organizacin dificulta el compartimento de memoria ya que, en principio, no se pueden
asociar dos pginas al mismo marco. Hay algunas soluciones a este problema, pero quedan fuera
del alcance de esta exposicin.
Un ltimo punto que hay que resaltar es que la tabla invertida reduce apreciablemente el gasto
de memoria en tablas, ya que slo almacena informacin de las pginas vlidas. Sin embargo, como
se analizar ms adelante, cuando se usa este esquema para implementar memoria virtual, el sistema operativo debera mantener sus propias tablas de pgina para guardar informacin de las pginas que no estn presentes en memoria principal.
Para terminar con la paginacin, es conveniente hacer notar que hay numerosos aspectos avanzados sobre este tema que no se han explicado debido al alcance de esta presentacin y a que
algunos de ellos son transparentes al sistema operativo. Entre ellos, se puede destacar el tema de
cmo se relaciona la paginacin con el uso de una cache de memoria principal, ya que en l puede
estar implicado el sistema operativo. Hay bsicamente dos alternativas:

Direccin lgica
PID

Pgina

Byte

pid

Pgina
Byte

Direccin fsica

Tabla de pginas
invertida

Figura 4.17.

Esquema de traduccin usando una tabla de pginas invertida.

Gestin de memoria

197

Procesadores (p. ej.: PA-RISC) que acceden a la cache usando la direccin virtual (o parte
de ella). Esto permite realizar la bsqueda en la TLB y en la cache en paralelo, pero obliga a
que el sistema operativo tenga que invalidar la cache en cada cambio de proceso para evitar
incoherencias.
Procesadores (p. ej.: Alpha) que acceden a la cache usando la direccin fsica (o parte de
ella). Con este esquema el sistema operativo no tiene que invalidar la cache, pero no permite
que el acceso a la TLB y a la cache se hagan en paralelo (aunque si el tamao de la cache es
igual al de la pgina, s se podra hacer en paralelo).

4.5.2. Segmentacin
Con la paginacin, la MMU no sabe nada sobre las distintas regiones de los procesos. Slo entiende
de pginas. El sistema operativo debe guardar para cada proceso una tabla de regiones que especifique qu pginas pertenecen a cada regin. Esto tiene dos desventajas:
Para crear una regin hay que rellenar las entradas de las pginas pertenecientes a la regin
con las mismas caractersticas. As, por ejemplo, si se trata de una regin de cdigo que
ocupa diez pginas, habr que rellenar diez entradas especificando una proteccin que no
permita modificarlas.
Para compartir una regin, hay que hacer que las entradas correspondientes de dos procesos
apunten a los mismos marcos.
En resumen, lo que se est echando en falta es que la MMU sea consciente de la existencia de
las regiones y que permita tratar a una regin como una entidad.
La segmentacin es una tcnica hardware que intenta dar soporte directo a las regiones. Para
ello, considera el mapa de memoria de un proceso compuesto de mltiples segmentos. Cada regin
se almacenar en un segmento.
Se puede considerar que esta tcnica es una generalizacin del uso de los registros valla,
pero utilizando una pareja de registro base y registro lmite por cada segmento. La MMU maneja
una tabla de segmentos. Cada entrada de esta tabla mantiene, adems de informacin de proteccin,
el registro base y lmite correspondientes a esa regin. Una direccin lgica est formada
por un nmero de segmento y una direccin dentro del segmento. Como se muestra en la
Figura 4.18, la traduccin consiste en acceder al nmero de segmento correspondiente y usar
los registros valla almacenados en dicha entrada para detectar si el acceso es correcto y, en caso
afirmativo, reubicarlo.
Dado que cada segmento se almacena en memoria de forma contigua, este esquema presenta
fragmentacin externa.
El sistema operativo mantendr una tabla de segmentos por cada proceso y en cada cambio de
proceso ir informando a la MMU de qu tabla debe usar. Adems, el sistema operativo debe usar
una estructura de datos, similar a la utilizada con los esquemas de asignacin contigua, para conocer qu partes de la memoria principal estn libres y cules ocupadas.
A pesar de dar soporte directo a los segmentos, la segmentacin tal como se ha descrito en esta
seccin presenta numerosas deficiencias que hacen que prcticamente no se use en los sistemas
reales.
Valoracin de la segmentacin
A continuacin, se analiza si la segmentacin cumple los requisitos planteados al principio del
captulo:

198

Sistemas operativos. Una visin aplicada


Direccin lgica
s

d
Tabla de segmentos
Lmite

>

Base

NO

Memoria

S
Excepcin

Figura 4.18.

Esquema de traduccin usando segmentacin.

Espacios lgicos independientes. Cada proceso tiene una tabla de segmentos que crea un
espacio lgico independiente para el mismo.
Proteccin. La tabla de segmentos de un proceso restringe qu parte de la memoria puede ser
accedida por el mismo, permitiendo asegurar que los procesos usan espacios disjuntos.
Compartir memoria. Bajo la supervisin del sistema operativo, que es el nico que puede
manipular las tablas de segmentos, dos o ms procesos pueden tener un segmento asociado a
la misma zona de memoria.
Soporte de las regiones del proceso. ste es precisamente el punto fuerte de este sistema.
Maximizar el rendimiento. sta es una de sus deficiencias. Por un lado, presenta fragmentacin externa, por lo que no se obtiene un buen aprovechamiento de la memoria. Por otro
lado, y ms importante todava, esta tcnica no facilita la implementacin de esquemas de
memoria virtual debido al tamao variable de los segmentos.
Mapas de memoria grandes para los procesos. No contempla adecuadamente esta caracterstica al no permitir implementar eficientemente un sistema de memoria virtual.

4.5.3. Segmentacin paginada


Como su nombre indica, la segmentacin paginada intenta aunar lo mejor de los dos esquemas
anteriores. La segmentacin proporciona soporte directo a las regiones del proceso y la paginacin
permite un mejor aprovechamiento de la memoria y una base para construir un esquema de memoria virtual.
Con esta tcnica, un segmento est formado por un conjunto de pginas y, por tanto, no tiene
que estar contiguo en memoria. La MMU utiliza una tabla de segmentos, tal que cada entrada de la
tabla apunta a una tabla de pginas. La Figura 4.19 ilustra el proceso de traduccin en este esquema.
Valoracin de la segmentacin paginada
La valoracin de esta tcnica se corresponde con la unin de los aspectos positivos de los dos
esquemas anteriores:

Gestin de memoria

199

Direccin lgica
s

d'
Tabla de segmentos

Dir. T. Pg.

Lmite

>

NO

S
Excepcin

Figura 4.19.

Tabla de pginas
para segmento s

d'

Memoria

Direccin
fsica

Esquema de traduccin usando segmentacin paginada.

Espacios lgicos independientes. Cada proceso tiene una tabla de segmentos que crea un
espacio lgico independiente para el mismo.
Proteccin. La tabla de segmentos de un proceso restringe qu parte de la memoria puede ser
accedida por el mismo, permitiendo asegurar que los procesos usan espacios disjuntos.
Compartir memoria. Bajo la supervisin del sistema operativo, que es el nico que puede
manipular las tablas de segmentos, dos o ms procesos pueden tener un segmento asociado a
la misma zona de memoria.
Soporte de las regiones del proceso, gracias a la segmentacin.
Maximizar el rendimiento. La paginacin proporciona un buen aprovechamiento de la memoria y puede servir como base para construir un esquema de memoria virtual.
Mapas de memoria grandes para los procesos. La paginacin permite implementar un esquema de memoria virtual.
Es importante resaltar que, aunque la segmentacin paginada ofrece ms funcionalidad que la
paginacin, requiere un hardware ms complejo que, adems, no est presente en la mayora de los
procesadores. Por ello, la mayora de los sistemas operativos estn construidos suponiendo que el
procesador proporciona un esquema de paginacin.

4.5.4. Paginacin por demanda


Una vez analizados los diversos esquemas hardware, en esta seccin se plantea cmo construir el
mecanismo de la memoria virtual tomando como base dichos esquemas. Como se coment previamente, estos esquemas tambin pueden usarse sin memoria virtual, ya que de por s proporcionan
numerosas ventajas sobre los esquemas de asignacin contigua. Sin embargo, en la actualidad su
uso siempre est ligado a la memoria virtual.

200

Sistemas operativos. Una visin aplicada

Como se ha analizado en las secciones anteriores, la memoria virtual se construye generalmente sobre un esquema de paginacin, ya sea paginacin pura o segmentacin paginada. Por tanto, las
unidades de informacin que se transfieren entre la memoria principal y la secundaria son pginas.
Las transferencias desde la memoria secundaria hacia la principal se realizan normalmente bajo
demanda (paginacin por demanda). Cuando un proceso necesita acceder a una pgina que no
est en memoria principal (a lo que se denomina fallo de pgina), el sistema operativo se encarga
de transferirla desde la memoria secundaria. Si al intentar traer la pgina desde memoria secundaria se
detecta que no hay espacio en la memoria principal (no hay marcos libres), ser necesario expulsar
una pgina de la memoria principal y transferirla a la secundaria. Por tanto, las transferencias desde
la memoria principal hacia la secundaria se realizan normalmente por expulsin. El algoritmo para
elegir qu pgina debe ser expulsada se denomina algoritmo de reemplazo y se analizar ms
adelante.
Dado que se est usando la paginacin para construir un esquema de memoria virtual, se puede
usar indistintamente el trmino de direccin lgica y el de direccin virtual para referirse a las
direcciones que genera un programa.
Para construir un esquema de memoria virtual sobre un procesador que ofrezca paginacin, se
utiliza el bit de la entrada de la tabla de pginas que indica si la pgina es vlida. Estarn marcadas
como invlidas todas las entradas correspondientes a las pginas que no estn residentes en memoria principal en ese instante. Para estas pginas, en vez de guardarse la direccin del marco, se
almacenar la direccin del bloque del dispositivo que contiene la pgina. Cuando se produzca un
acceso a una de estas pginas, se producir una excepcin (fallo de pgina) que activar al sistema
operativo que ser el encargado de traerla desde la memoria secundaria.
Observe que dado que se utiliza el bit validez para marcar la ausencia de una pgina y este
mismo bit tambin se usa para indicar que una pgina es realmente invlida (una pgina que corresponde con un hueco en el mapa), es necesario que el sistema operativo almacene informacin
asociada a la pgina para distinguir entre esos dos casos.
Por ltimo, hay que comentar que algunos sistemas de memoria virtual usan la tcnica de la
prepaginacin. En un fallo de pgina no slo se traen la pgina en cuestin, sino tambin las
pginas adyacentes, ya que es posible que el proceso las necesite en un corto plazo de tiempo. La
efectividad de esta tcnica va a depender de si hay acierto en esta prediccin.
Tratamiento del fallo de pgina
La paginacin por demanda est dirigida por la ocurrencia de excepciones de fallo de pgina que
indican al sistema operativo que debe traer una pgina de memoria secundaria a primaria puesto
que un proceso la requiere. A continuacin, se especifican los pasos tpicos en el tratamiento de un
fallo de pgina:
La MMU produce una excepcin y tpicamente deja en un registro especial la direccin que
caus el fallo.
Se activa el sistema operativo que comprueba si se trata de una direccin correspondiente a
una pgina realmente invlida o se corresponde con una pgina ausente de memoria. Si la
pgina es invlida, se aborta el proceso o se le manda una seal. En caso contrario, se
realizan los pasos que se describen a continuacin.
Se consulta la tabla de marcos para buscar uno libre.
Si no hay un marco libre, se aplica el algoritmo de reemplazo para seleccionar una pgina
para expulsar. El marco seleccionado se desconectar de la pgina a la que est asociado
poniendo como invlida la entrada correspondiente. Si la pgina est modificada, previamente hay que escribir su contenido a la memoria secundaria.

Gestin de memoria

201

Una vez que se obtiene el marco libre, ya sea directamente o despus de una expulsin, se
inicia la lectura de la nueva pgina sobre el marco y, al terminar la operacin, se rellena la
entrada correspondiente a la pgina para que est marcada como vlida y apunte al marco
utilizado.
Observe que, en el peor de los casos, un fallo de pgina puede causar dos operaciones de
entrada/salida al disco.
Polticas de administracin de la memoria virtual
En un sistema de memoria virtual basado en paginacin hay bsicamente dos polticas que definen
el funcionamiento del sistema de memoria:
Poltica de reemplazo. Determina qu pgina debe ser desplazada de la memoria principal
para dejar sitio a la pgina entrante.
Poltica de asignacin de espacio a los procesos. Decide cmo se reparte la memoria fsica
entre los procesos existentes en un determinado instante.
Estos dos aspectos estn muy relacionados entre s y son determinantes en el rendimiento del
sistema de memoria virtual. En las dos prximas secciones se analizarn estas dos polticas.

4.5.5. Polticas de reemplazo


Las estrategias de reemplazo se pueden clasificar en dos categoras: reemplazo global y reemplazo
local. Con una estrategia de reemplazo global, se puede seleccionar, para satisfacer el fallo de
pgina de un proceso, un marco que actualmente tenga asociada una pgina de otro proceso. Esto
es, un proceso puede quitarle un marco de pgina a otro. La estrategia de reemplazo local requiere
que, para servir el fallo de pgina de un proceso, slo puedan usarse marcos de pginas libres o
marcos ya asociados al proceso.
Existen numerosos trabajos, tanto tericos como experimentales, sobre algoritmos de reemplazo de pginas. En esta seccin se describirn los algoritmos de reemplazo ms tpicos. Para profundizar en aspectos tericos avanzados se recomienda [Maekawa, 1987].
Todos estos algoritmos pueden utilizarse tanto para estrategias globales como locales. Cuando
se aplica un algoritmo determinado utilizando una estrategia global, el criterio de evaluacin del
algoritmo se aplicar a todas las pginas en memoria principal. En el caso de una estrategia local, el
criterio de evaluacin del algoritmo se aplica slo a las pginas en memoria principal que pertenecen al proceso que caus el fallo de pgina. La descripcin de los algoritmos, por tanto, se realizar
sin distinguir entre los dos tipos de estrategias.
Por ltimo, hay que comentar que el objetivo bsico de cualquier algoritmo de reemplazo es
minimizar la tasa de fallos de pgina, intentando adems que la sobrecarga asociada a la ejecucin
del algoritmo sea tolerable y que no se requiera una MMU con caractersticas especficas.
Algoritmo de reemplazo ptimo
Un algoritmo ptimo debe generar el mnimo nmero de fallos de pgina. Por ello, la pgina que se
debe reemplazar es aquella que tardar ms tiempo en volverse a usar.
Evidentemente, este algoritmo es irrealizable, ya que no se puede predecir cules sern las
siguientes pginas accedidas. El inters de este algoritmo es que sirve para comparar el rendimiento
de otros algoritmos realizables.

202

Sistemas operativos. Una visin aplicada

Algoritmo FIFO (First Input-First Output, primera en entrar-primera en salir)


Una estrategia sencilla e intuitivamente razonable es seleccionar para la sustitucin la pgina que
lleva ms tiempo en memoria. La implementacin de este algoritmo es simple. Adems, no necesita
ningn apoyo hardware especial. El sistema operativo debe mantener una lista de las pginas que
estn en memoria, ordenada por el tiempo que llevan residentes. En el caso de una estrategia local,
se utiliza una lista por cada proceso. Cada vez que se trae una nueva pgina a memoria, se pone al
final de la lista. Cuando se necesita reemplazar, se usa la pgina que est al principio de la lista.
Sin embargo, el rendimiento del algoritmo no es siempre bueno. La pgina que lleva ms
tiempo residente en memoria puede contener instrucciones o datos que se acceden con frecuencia.
Adems, en determinadas ocasiones, este algoritmo presenta un comportamiento sorprendente conocido como la anomala de Belady [Belady, 1969]. Intuitivamente parece que cuantos ms marcos
de pgina haya en el sistema, menos fallos de pgina se producirn. Sin embargo, ciertos patrones
de referencias causan que este algoritmo tenga un comportamiento opuesto. El descubrimiento de
esta anomala result al principio sorprendente y llev al desarrollo de modelos tericos para analizar los sistemas de paginacin. En la prctica, esta anomala es ms bien una curiosidad que demuestra que los sistemas pueden tener a veces comportamientos inesperados.
Algoritmo de la segunda oportunidad o algoritmo del reloj
El algoritmo de reemplazo con segunda oportunidad es una modificacin sencilla del FIFO que
evita el problema de que una pgina muy utilizada sea eliminada por llevar mucho tiempo residente.
En este algoritmo, cuando se necesita reemplazar una pgina, se examina el bit de referencia
de la pgina ms antigua (la primera de la lista). Si no est activo, se usa esta pgina para el
reemplazo. En caso contrario, se le da una segunda oportunidad a la pgina ponindola al final de la
lista y desactivando su bit de referencia. Por tanto, se la considera como si acabara de llegar a
memoria. La bsqueda continuar hasta que se encuentre una pgina con su bit de referencia desactivado. Observe que si todas las pginas tienen activado su bit de referencia, el algoritmo degenera
en un FIFO puro.
Para implementar este algoritmo, se puede usar una lista circular de las pginas residentes en
memoria, en vez de una lineal (en el caso de una estrategia local, se utiliza una lista circular por
cada proceso). Existe un puntero que seala en cada instante al principio de la lista. Cuando llega a
memoria una pgina, se coloca en el lugar donde seala el puntero y, a continuacin, se avanza el
puntero al siguiente elemento de la lista. Cuando se busca una pgina para reemplazar, se examina
el bit de referencia de la pgina a la que seala el puntero. Si est activo, se desactiva y se avanza el
puntero al siguiente elemento. El puntero avanzar hasta que se encuentre una pgina con el bit de
referencia desactivado. Esta forma de trabajo imita al comportamiento de un reloj donde el puntero
que recorre la lista se comporta como la aguja del reloj. Debido a ello, a esta estrategia tambin se le
denomina algoritmo del reloj.
Algoritmo LRU (Least Recently Used, menos recientemente usada)
El algoritmo LRU est basado en el principio de proximidad temporal de referencias: si es probable
que se vuelvan a referenciar las pginas accedidas recientemente, la pgina que se debe reemplazar
es la que no se ha referenciado desde hace ms tiempo.
El algoritmo LRU no sufre la anomala de Belady. Pertenece a una clase de algoritmos denominados algoritmos de pila. La propiedad de estos algoritmos es que las pginas residentes en
memoria para un sistema con n marcos de pgina son siempre un subconjunto de las que habra en

Gestin de memoria

203

un sistema con n + 1 marcos. Esta propiedad asegura que un algoritmo de este tipo nunca sufrir la
anomala de Belady.
Hay un aspecto sutil en este algoritmo cuando se considera su versin global. A la hora de
seleccionar una pgina, no habra que tener en cuenta el tiempo de acceso real, sino el tiempo lgico
de cada proceso. O sea, habra que seleccionar la pgina que haya sido menos recientemente usada
teniendo en cuenta el tiempo lgico de cada proceso.
A pesar de que el algoritmo LRU es realizable y proporciona un rendimiento bastante bueno,
su implementacin eficiente es difcil y requiere un considerable apoyo hardware. Una implementacin del algoritmo podra basarse en utilizar un contador que se incremente por cada referencia
a memoria. Cada posicin de la tabla de pginas ha de tener un campo de tamao suficiente
para que quepa el contador. Cuando se referencia a una pgina, el valor actual del contador se
copia por hardware a la posicin de la tabla correspondiente a esa pgina. Cuando se produce
una fallo de pgina, el sistema operativo examina los contadores de todas las pginas residentes
en memoria y selecciona como vctima aquella que tiene el valor menor. Esta implementacin
es factible aunque requiere un hardware complejo y muy especfico.
Buffering de pginas
Una situacin que intentan evitar la mayora de los sistemas es la que se produce cuando la pgina
seleccionada para reemplazar est modificada. En este caso, el tratamiento del fallo de pgina implica
dos operaciones al disco, aumentando considerablemente el tiempo de servicio del fallo.
Una solucin utilizada con cierta frecuencia es el buffering de pginas. Esta estrategia consiste
en mantener un conjunto de marcos de pgina libres. Cuando se produce un fallo de pgina, se usa
un marco de pgina libre, pero no se aplica el algoritmo de reemplazo. Esto es, se consume un
marco de pgina pero no se libera otro. Cuando el sistema operativo detecta que el nmero de
marcos de pgina disminuye por debajo de un cierto umbral, aplica repetidamente el algoritmo de
reemplazo hasta que el nmero de marcos libres sea suficiente. Las pginas liberadas que no estn
modificadas pasan a la lista de marcos libres. Las pginas que han sido modificadas pasan a la lista
de modificadas.
Las pginas que estn en cualquiera de las dos listas pueden recuperarse si vuelven a referenciarse. En este caso, la rutina de fallo de pgina recupera la pgina directamente de la lista y
actualiza la entrada correspondiente de la tabla de pginas para conectarla. Observe que este fallo
de pgina no implicara operaciones de entrada/salida.
Las pginas en la lista de modificadas se pueden escribir en tandas al dispositivo para obtener
un mejor rendimiento. Cuando la pgina modificada se ha escrito al dispositivo, se la incluye en la
lista de marcos libres.
Esta estrategia puede mejorar el rendimiento de algoritmos de reemplazo que no sean muy
efectivos. As, si el algoritmo de reemplazo decide revocar una pgina que en realidad est siendo
usada por un proceso, se producir inmediatamente un fallo de pgina que la recuperar de las listas.
Retencin de pginas en memoria
Para acabar esta seccin en la que se han presentado diversos algoritmos de reemplazo, hay que
resaltar que no todas las pginas residentes en memoria son candidatas al reemplazo. Se puede
considerar que algunas pginas estn atornilladas a la memoria principal.
En primer lugar, estn las pginas del propio sistema operativo. Por simplicidad, la mayora de
los sistemas operativos tienen su mapa de memoria fijo en memoria principal.
Adems, si se permite que los dispositivos de entrada/salida que usan DMA realicen transferencias directas a la memoria de un proceso, ser necesario marcar las pginas implicadas como no
reemplazables hasta que termine la operacin.

204

Sistemas operativos. Una visin aplicada

Por ltimo, algunos sistemas operativos ofrecen servicios a las aplicaciones que les permiten
solicitar que una o ms pginas de su mapa queden retenidas en memoria. Este servicio puede ser
til para procesos de tiempo real que necesitan evitar que se produzcan fallos de pgina imprevistos. Sin embargo, el uso indiscriminado de este servicio puede afectar gravemente al rendimiento
del sistema.

4.5.6. Poltica de asignacin de marcos de pgina


En un sistema con multiprogramacin existen varios procesos activos simultneamente que comparten la memoria del sistema. Es necesario, por tanto, determinar cuntos marcos de pgina se
asignan a cada proceso. Existen dos tipos de estrategias de asignacin: asignacin fija o asignacin
dinmica.
Asignacin fija
Se asigna a cada proceso un nmero fijo de marcos de pgina. Normalmente, este tipo de asignacin lleva asociada una estrategia de reemplazo local. El nmero de marcos asignados no vara ya
que un proceso slo usa para reemplazo los marcos que tiene asignados.
La principal desventaja de esta alternativa es que no se adapta a las diferentes necesidades de
memoria de un proceso a lo largo de su ejecucin. Una caracterstica positiva es que el comportamiento del proceso es relativamente predecible.
Existen diferentes criterios para repartir los marcos de las pginas entre los procesos existentes. Puede depender de mltiples factores tales como el tamao del proceso o su prioridad.
Por otra parte, cuando se usa una estrategia de asignacin fija, el sistema operativo determina
cul es el nmero mximo de marcos asignados al proceso. Sin embargo, la arquitectura de la
mquina establece el nmero mnimo de marcos que deben asignarse a un proceso.
Por ejemplo, si la ejecucin de una instruccin puede generar seis fallos de pgina y el sistema
operativo asigna cinco marcos de pgina a un proceso que incluya esta instruccin, el proceso
podra no terminar de ejecutar esta instruccin. Por tanto, el nmero mnimo de marcos de pgina
para una determinada arquitectura quedar fijado por la instruccin que pueda generar el mximo
nmero de fallos de pgina.
Asignacin dinmica
El nmero de marcos asignados a un proceso vara segn las necesidades que tenga el proceso (y
posiblemente el resto de procesos del sistema) en diferentes instantes de tiempo. Con este tipo de
asignacin se pueden usar tanto estrategias de reemplazo locales como globales.
Con reemplazo local, el proceso va aumentando o disminuyendo su conjunto residente dependiendo de sus necesidades en las distintas fases de ejecucin del programa.
Con reemplazo global, los procesos compiten en el uso de la memoria quitndose entre s las
pginas.
La estrategia de reemplazo global hace que el comportamiento del proceso en ejecucin sea
difcilmente predecible. El principal problema de este tipo asignacin es que la tasa de fallos de
pgina de un programa puede depender de las caractersticas de los otros procesos que estn activos
en el sistema.

Gestin de memoria

205

4.5.7. Hiperpaginacin
Si el nmero de marcos de pgina asignados a un proceso no es suficiente para almacenar las
pginas referenciadas activamente por el mismo, se producir un nmero elevado de fallos de pgina.
A esta situacin se le denomina hiperpaginacin (thrashing). Cuando se produce la hiperpaginacin, el proceso pasa ms tiempo en la cola de servicio del dispositivo de paginacin que ejecutando. Dependiendo del tipo de asignacin utilizado, este problema puede afectar a procesos individuales o a todo el sistema.
En un sistema operativo que utiliza una estrategia de asignacin fija, si el nmero de marcos
asignados al proceso no es suficiente para albergar su conjunto de trabajo en una determinada fase
de su ejecucin, se producir hiperpaginacin en ese proceso. Esto traer consigo un aumento
considerable de su tiempo de ejecucin, pero, sin embargo, el resto de los procesos del sistema no
se ven afectados directamente.
Con una estrategia de asignacin dinmica, el nmero de marcos asignados a un proceso se va
adaptando a sus necesidades, por lo que, en principio, no debera presentarse este problema. Sin
embargo, si el nmero de marcos de pgina existentes en el sistema no son suficientes para almacenar los conjuntos de trabajo de todos los procesos, se producirn fallos de pgina frecuentes y, por
tanto, el sistema sufrir hiperpaginacin. La utilizacin del procesador disminuir, puesto que
aumenta el tiempo que dedica al tratamiento de fallos de pgina. Como se puede observar en la
Figura 4.20, no se trata de una disminucin progresiva, sino ms bien drstica, que se debe a que al
aumentar el nmero de procesos aumenta, por un lado, la tasa de fallos de pgina de cada proceso
(hay menos marcos de pgina por proceso) y, por otro lado, aumenta el tiempo de servicio del
dispositivo de paginacin (crece la longitud de la cola de servicio del dispositivo).
Cuando se produce esta situacin, se deben suspender uno o varios procesos liberando sus
pginas. Es necesario establecer una estrategia de control de carga que ajuste el grado de multiprogramacin en el sistema para evitar que se produzca hiperpaginacin. A continuacin, se plantean
algunas polticas de control de carga.
Estrategia del conjunto de trabajo

Utilizacin de la UCP

Como se coment previamente, cuando un proceso tiene residente en memoria su conjunto de


trabajo, se produce una baja tasa de fallos de pgina. Una posible estrategia consiste en determinar
los conjuntos de trabajo de todos los procesos activos para intentar mantenerlos residentes en memoria principal.

Grado de multiprogramacin

Figura 4.20.

Hiperpaginacin.

Sistemas operativos. Una visin aplicada

Para poder determinar el conjunto de trabajo de un proceso es necesario dar una definicin
ms formal de este trmino. El conjunto de trabajo de un proceso es el conjunto de pginas accedidas por un proceso en las ltimas n referencias. El nmero n se denomina la ventana del conjunto de
trabajo. El valor de n es un factor crtico para el funcionamiento efectivo de esta estrategia. Si es
demasiado grande, la ventana podra englobar varias fases de ejecucin del proceso llevando a una
estimacin excesiva de las necesidades del proceso. Si es demasiado pequeo, la ventana podra no
englobar la situacin actual del proceso con lo que se generaran demasiados fallos de pgina.
Suponiendo que el sistema operativo es capaz de detectar cul es el conjunto de trabajo de
cada proceso, se puede especificar una estrategia de asignacin dinmica con reemplazo local y
control de carga.
Si el conjunto de trabajo de un proceso decrece, se liberan los marcos asociados a las pginas
que ya no estn en el conjunto de trabajo.
Si el conjunto de trabajo de un proceso crece, se asignan marcos para que puedan contener
las nuevas pginas que han entrado a formar parte del conjunto de trabajo. Si no hay marcos
libres, hay que realizar un control de carga suspendiendo uno o ms procesos y liberando sus
pginas.
El problema de esta estrategia es cmo poder detectar cul es el conjunto de trabajo de cada
proceso. Al igual que ocurre con el algoritmo LRU, se necesitara una MMU especfica que fuera
controlando las pginas accedidas por cada proceso durante las ltimas n referencias.
Estrategia de administracin basada en la frecuencia de fallos de pgina
Esta estrategia busca una solucin ms directa al problema de la hiperpaginacin. Se basa en controlar la frecuencia de fallos de pgina de cada proceso. Como se ve en la Figura 4.21, se establecen
una cuota superior y otra inferior de la frecuencia de fallos de pgina de un proceso. Basndose en
esa idea, a continuacin se describe una estrategia de asignacin dinmica con reemplazo local y
control de carga.
Si la frecuencia de fallos de un proceso supera el lmite superior, se asignan marcos de
pgina adicionales al proceso. Si la tasa de fallos crece por encima del lmite y no hay
marcos libres, se suspende algn proceso liberando sus pginas.
Cuando el valor de la tasa de fallos es menor que el lmite inferior, se liberan marcos asignados al proceso seleccionndolos mediante un algoritmo de reemplazo.

Tasa de fallos de pgina

206

Lmite superior

Lmite inferior

Nmero de marcos

Figura 4.21.

Estrategia de administracin basada en la frecuencia de fallos de pgina.

Gestin de memoria

207

Estrategia de control de carga para algoritmos de reemplazo globales


Los algoritmos de reemplazo globales no controlan la hiperpaginacin. Necesitan trabajar conjuntamente con un algoritmo de control de carga. A continuacin, como ejemplo, se describe la gestin
de memoria en el sistema operativo UNIX BSD.
El sistema usa la tcnica del buffering de pginas, mantenindose un conjunto de marcos de
pgina libres. Existe un proceso (page daemon) que se despierta peridicamente y comprueba si
hay suficientes marcos de pgina libres. Si no es as, aplica el algoritmo de reemplazo y libera el
nmero necesario de marcos de pgina.
La estrategia de reemplazo es global y utiliza una modificacin del algoritmo de reloj denominada reloj con dos manecillas, puesto que utiliza dos punteros en vez de uno. Cuando se ejecuta el
algoritmo de reemplazo, se desactiva el bit de referencia de la pgina a la que apunta el primer
puntero y se comprueba el bit de referencia de la pgina a la que seala el segundo. Si est desactivado se libera esa pgina, escribindola previamente al disco si est modificada. El algoritmo
avanza ambos punteros y repite el proceso hasta que se liberan suficientes marcos. Las pginas que
estn en la lista de pginas libres pueden recuperarse si se referencian antes de ser reutilizadas.
Cuando la tasa de paginacin en el sistema es demasiado alta y el nmero de marcos libres est
frecuentemente por debajo del mnimo, otro proceso especial (swapper) selecciona uno o ms
procesos para suspenderlos y liberar sus marcos de pgina. El swapper comprueba peridicamente
si alguno de los procesos expulsados debe reactivarse. La reactivacin de los procesos seleccionados slo se llevar a cabo si hay suficientes marcos de pgina libres.

4.5.8. Gestin del espacio de swap


El sistema operativo debe gestionar el espacio de swap reservando y liberando zonas del mismo
segn evolucione el sistema. Existen bsicamente dos alternativas a la hora de asignar espacio de
swap durante la creacin de una nueva regin:
Preasignacin de swap. Cuando se crea la nueva regin, se reserva espacio de swap para la
misma. Con esta estrategia, cuando se expulsa una pgina ya tiene reservado espacio en
swap para almacenar su contenido.
Sin preasignacin de swap. Cuando se crea una regin, no se hace ninguna reserva en el
swap. Las pginas de la regin se irn trayendo a memoria principal por demanda desde el
soporte de la regin. Slo se reserva espacio en el swap para una pgina cuando es expulsada
por primera vez.
La tendencia actual es utilizar la segunda estrategia, dado que la primera conlleva un peor
aprovechamiento de la memoria secundaria, puesto que toda pgina debe tener reservado espacio
en ella. Sin embargo, la preasignacin presenta la ventaja de que con ella se detecta anticipadamente
cundo no hay espacio en swap. Si al crear un proceso no hay espacio en swap, ste no se crea. Con un
esquema sin preasignacin, esta situacin se detecta cuando se va a expulsar una pgina y no hay sitio
para ella. En ese momento, habra que abortar el proceso, aunque ya haba realizado parte de su labor.
Hay que resaltar que, con independencia del esquema usado, una pgina no tiene que copiarse
al dispositivo de swap mientras no se modifique. Adems, una vez asignado espacio de swap, ya sea
anticipadamente o en su primera expulsin, la pgina estar siempre asociada al mismo bloque del
dispositivo de swap.
Observe que, en el caso de una regin compartida con soporte en un archivo (como el cdigo o
un archivo proyectado), no se usa espacio de swap para almacenarla, sino que se utiliza directamente el archivo que la contiene como almacenamiento secundario. De esta forma, los cambios realizados sobre la regin son visibles a todas las aplicaciones que la comparten.

208

Sistemas operativos. Una visin aplicada

Algunos sistemas operativos permiten aadir dispositivos de swap dinmicamente e incluso


usar archivos como soporte del swap. Sin embargo, hay que tener en cuenta que el acceso a los
archivos es ms lento que el acceso a los dispositivos. Esta posibilidad es muy interesante ya que
alivia al administrador de la responsabilidad de configurar correctamente a priori el dispositivo de
swap, puesto que si hay necesidad, se puede aadir ms espacio de swap en tiempo de ejecucin.

4.5.9. Operaciones sobre las regiones de un proceso


A continuacin se analiza cmo se realizan las diversas operaciones sobre las regiones en un sistema con memoria virtual.
Creacin de una regin
Cuando se crea una regin, no se le asigna memoria principal puesto que se cargar por demanda.
Todas las pginas de la regin se marcan como no residentes, o sea, invlidas pero vlidas para el
sistema operativo. De esta forma, el primer acceso causar un fallo de pgina.
El sistema operativo actualiza la tabla de regiones para reflejar la existencia de la nueva regin
y guarda la informacin de las caractersticas de las pginas de la regin rellenando las entradas de
la tabla de pginas de acuerdo a las mismas. Algunas de estas caractersticas son relevantes a la
MMU, como por ejemplo la proteccin. Sin embargo, otras slo le conciernen al sistema operativo,
como por ejemplo si las pginas de la regin son privadas o compartidas.
Las pginas de una regin con soporte en un archivo (p. ej.: las de cdigo o las correspondientes a la regin de datos con valor inicial) se marcan para indicar esta situacin (bit de cargar de
archivo), almacenndose tambin la direccin del bloque correspondiente del archivo. Las pginas
sin soporte (p. ej.: las pginas correspondientes a la regin de datos sin valor inicial) se marcan con
un valor especial que indica que hay que rellenarlas a cero (bit de rellenar con ceros). Observe que
un fallo sobre una pgina de este tipo no provocara una operacin de entrada/salida al disco.
Si en el sistema hay preasignacin de swap y se trata de una regin privada, hay que reservar
en el momento de la creacin la zona correspondiente del swap.
El caso de la creacin de la regin de pila del proceso es un poco diferente, ya que esta regin
tiene un contenido previo (los argumentos del programa) que no est almacenado en un archivo. Tpicamente, se reserva uno o ms bloques en el swap y se copia en ellos el contenido inicial de la pila.
Una vez creada una regin, el tratamiento que se le da a la pgina cuando se expulsa y est
modificada va a depender de si es privada o compartida:
Si la regin es privada, se escribe en el swap. En el caso de un sistema sin preasignacin,
ser necesario reservar espacio en swap cuando se expulsa por primera vez.
Si la regin es compartida, se escribe directamente en el soporte para que todos los procesos
puedan ver las modificaciones.
En la creacin de la imagen inicial del proceso, se crean todas las regiones iniciales siguiendo
el procedimiento que se acaba de describir y se marcan los huecos como pginas invlidas, tanto
para el hardware como para el sistema operativo. En la Figura 4.22 se muestra cmo es la imagen de
memoria en un sistema sin preasignacin de swap.
Liberacin de una regin
Cuando se libera una regin, se debe actualizar la tabla de regiones para reflejar este cambio. Las
pginas asociadas a la regin hay que marcarlas como invlidas tanto para la MMU como para el

Gestin de memoria

209

Swap
Archivo ejecutable

Tabla de pginas
1. pg.
Cdigo

RX A

1. pg.
Dat.v.i.

RW A

Cabecera

Bloque T (arch.)

Bloque T

....................

Bloque U (arch.)

Figura 4.22.

Bloque U Datos con valor inicial

....................

1. pg. RW A Rellenar con 0


Dat.no.v.i.
....................
1. pg. RW A Bloque S (swap)
Pila

Cdigo

................

Bloque S

Pila

Estado inicial de ejecucin en un sistema sin preasignacin de swap.

sistema operativo. Adems, si se trata de una regin privada, se libera el espacio de swap asociada a
la misma.
La liberacin puede deberse a una solicitud explcita (como ocurre cuando se desproyecta un
archivo) o a la finalizacin del proceso que conlleva la liberacin de todas sus regiones. Observe
que en POSIX, el servicio exec tambin produce una liberacin del mapa de un proceso.
Cambio del tamao de una regin
Con respecto a una disminucin de tamao en una regin, esta operacin implica una serie de acciones
similares a la liberacin, pero que slo afectan a la zona liberada. Por lo que se refiere a un aumento de
tamao, hay que comprobar que la regin no se solapa con otra regin y establecer las nuevas pginas
como no residentes y con las mismas caractersticas que el resto de las pginas de la regin.
En el caso de una expansin del heap, se marcan las nuevas pginas como de lectura y escritura, de carcter privado y a rellenar con ceros.
El tratamiento de la expansin de la pila es algo ms complejo, ya que no proviene de una
solicitud del proceso, sino de la propia evolucin de la pila. Observe que, cuando se produce una
expansin de pila, se genera un fallo de pgina asociado a una direccin que se corresponde con un
hueco. El sistema operativo podra pensar, en principio, que se trata de un acceso errneo. Para
diferenciarlo, debe comparar la direccin que caus el fallo con el puntero de pila. Si la direccin es
mayor, est dentro de la pila. Se trata de una expansin de la pila, que implica marcar adecuadamente las pginas involucradas en la expansin. En caso contrario, se trata de un acceso errneo.
Duplicado de una regin
Esta operacin est asociada al servicio fork de POSIX y no se requiere en sistemas operativos que
tengan un modelo de creacin de procesos ms convencional.
Cuando se produce una llamada a este servicio, se debe crear un nuevo proceso que sea un
duplicado del proceso que la invoca. Ambos procesos compartirn las regiones de carcter compartido que hay en el mapa del proceso original (como, por ejemplo, las regiones de cdigo, los
archivos proyectados o las zonas de memoria compartida). Sin embargo, las regiones de carcter
privado (como, por ejemplo, las regiones de datos con valor inicial, de datos sin valor inicial, la
regin de heap y la pila) deben ser un duplicado de las regiones originales. Esta operacin de
duplicado es costosa, ya que implica crear una nueva regin y copiar su contenido desde la regin
original.

210

Sistemas operativos. Una visin aplicada

Dado que este servicio se usa muy frecuentemente en los sistema UNIX y que, en la mayora
de los casos, el nuevo mapa apenas se utiliza ya que el proceso hijo realiza una llamada exec que lo
destruye, la mayora de las versiones de UNIX han optimizado esta operacin de duplicado usando
la tcnica del copy-on-write (COW).
La tcnica COW intenta realizar un duplicado por demanda. En vez de copiar la regin original, se comparte pero marcndola de tipo COW. Mientras los procesos que usan esta regin slo la
lean, pueden seguir compartindola. Pero, cuando un proceso intenta modificar una pgina de esta
regin, se produce una excepcin y el sistema operativo se encarga de crear una copia privada de
la pgina para ese proceso. Tpicamente, para forzar esta excepcin, se modifica la proteccin de la
pgina para que sea slo de lectura. Evidentemente, el sistema operativo almacenar en sus tablas
cul es la proteccin real de la pgina.
Observe que puede haber varios procesos con la misma regin duplicada (p. ej.: un proceso
que ha creado tres hijos). Por tanto, asociado a cada pgina de tipo COW hay un contador que
indica cuntos procesos estn compartindola. Cada vez que se produce una excepcin por acceso
de escritura a una pgina de este tipo, el sistema operativo, adems de crear una copia privada de la
pgina para el proceso, decrementa el contador de uso. Cuando el contador indique que slo hay un
proceso asociado a la pgina, se puede quitar la marca de COW ya que la pgina no tiene duplicados.
Como resultado de aplicar la tcnica COW, se optimiza considerablemente la ejecucin de un
servicio fork, ya que slo es necesario compartir las regiones del padre, o sea, duplicar su tabla de
pginas. Las regiones de carcter compartido son realmente compartidas, pero en las de tipo privado se trata de un falso compartimento mediante la tcnica COW.

4.6. ARCHIVOS PROYECTADOS EN MEMORIA


La generalizacin de la tcnica de memoria virtual permite ofrecer a los usuarios una forma alternativa de acceder a los archivos. Como se ha analizado en la seccin anterior, en un sistema de
memoria virtual se hacen corresponder directamente entradas de la tabla de pginas con bloques del
archivo ejecutable. La tcnica de proyeccin de archivos en memoria plantea usar esa misma idea,
pero aplicada a cualquier archivo. El sistema operativo va a permitir que un programa solicite que
se haga corresponder una zona de su mapa de memoria con los bloques de un archivo cualquiera, ya
sea completo o una parte del mismo. En la solicitud, el programa especifica el tipo de proteccin
asociada a la regin.
Como se puede observar en la Figura 4.23, el sistema operativo deber manipular la tabla
de pginas del proceso para que se corresponda con los bloques del archivo proyectado.
Una vez que el archivo est proyectado, si el programa accede a una direccin de memoria
perteneciente a la regin asociada al archivo, estar accediendo al archivo. El programa ya no tiene
que usar los servicios del sistema operativo para leer (read) y escribir (write) en el archivo. As,
si en el ejemplo de la figura el programa lee un byte de la direccin de memoria 10240, estar
leyendo el primer byte del archivo, mientras que, si escribe un byte en la direccin 10241, estar escribiendo en el segundo byte del archivo.
Observe que el proyectar un archivo no implica que se le asigne memoria principal. Simplemente, se actualizan las entradas de la tabla de pginas para que referencien al archivo. El propio
mecanismo de memoria virtual ser el que se encargue de ir trayendo a memoria principal los
bloques del archivo cuando se produzca un fallo de pgina al intentar acceder a la regin asociada al
mismo y de escribirlos cuando la pgina sea expulsada estando modificada.

Gestin de memoria

211

Mapa de memoria
Cdigo

Tabla de pginas

Datos con valor inicial

Archivo

...........................
1. pg.
Archivo

Datos sin valor inicial


Bloque 0

RW A Bloque 0 (arch.)
...........................

ltima pg. RW A Bloque N (arch.)


Archivo
...........................

Bloque 1

10240

Bloque 2
Archivo proyectado
.............
Bloque N
Pila

Figura 4.23.

Proyeccin de un archivo.

El acceso a un archivo mediante su proyeccin en memoria presenta numerosas ventajas sobre


el acceso convencional basado en los servicios de lectura y escritura. A continuacin, se detallan
algunas de estas ventajas:
Se disminuye considerablemente el nmero de llamadas al sistema necesarias para acceder a
un archivo. Con esta nueva tcnica, una vez que el archivo est proyectado, no es necesario
realizar ninguna llamada adicional. Esta reduccin implica una mejora considerable en los
tiempos de acceso puesto que, como ya es conocido, la activacin de una llamada al sistema
tiene asociada una considerable sobrecarga.
Se evitan copias intermedias de la informacin. Esto repercute tambin en un acceso ms
eficiente. Con esta tcnica, el sistema operativo transfiere directamente la informacin
entre la regin de memoria y el archivo. Con la forma de acceso convencional, todas las
transferencias se realizan pasando por un almacenamiento intermedio del sistema de archivos.
Se facilita la forma de programar los accesos a los archivos. Una vez proyectado el archivo,
ste se accede de la misma forma que cualquier estructura de datos en memoria que haya
declarado el programa. No es necesario utilizar ninguna primitiva especial del sistema operativo para acceder al mismo. As, por ejemplo, dado un programa que realiza un cierto
procesamiento sobre una matriz de datos almacenada en memoria, su modificacin para que
leyera la matriz de un archivo slo implicara aadir al principio del programa la proyeccin
del archivo. No sera necesario modificar el cdigo restante.
En algunos sistemas se permite tambin establecer proyecciones en las que la regin se marca
como privada. Con este tipo de proyeccin, los cambios realizados en la regin no afectan al
archivo, sino que se crear una copia privada que estar vinculada al dispositivo de swap. Tpicamente, las bibliotecas dinmicas se cargan usando este tipo de proyeccin sobre las secciones del
ejecutable que tienen carcter privado.

212

Sistemas operativos. Una visin aplicada

4.7. SERVICIOS DE GESTIN DE MEMORIA


4.7.1. Servicios genricos de memoria
Las labores que lleva a cabo el sistema de gestin de memoria son ms bien de carcter interno.
Debido a ello, este mdulo apenas ofrece directamente servicios a las aplicaciones. Los principales
servicios estn relacionados con la proyeccin de archivos. Tpicamente, existirn dos servicios:
Proyectar un archivo. Permite incluir en el mapa de memoria de un proceso un archivo o
parte del mismo. Con esta operacin, se crea una regin asociada al objeto de memoria
almacenado en el archivo. Normalmente, se pueden especificar algunas propiedades de esta
nueva regin. Por ejemplo, el tipo de proteccin o si la regin es privada o compartida.
Desproyectar un archivo. Eliminar una proyeccin previa o parte de la misma.

4.7.2. Servicios de memoria de POSIX


El estndar POSIX define un relativamente pequeo conjunto de servicios de gestin de memoria.
Los servicios de gestin de memoria ms frecuentemente usados son los que corresponden con la
proyeccin y desproyeccin de archivos (mmap, munmap). El servicio mmap tiene el siguiente prototipo:
caddr_t mmap (caddr_t direc, size_t longitud, int protec,
int indicador, int descriptor, off_t despl);

El primer parmetro indica la direccin del mapa donde se quiere que se proyecte el archivo.
Generalmente, se especifica un valor nulo para indicar que se prefiere que sea el sistema el que
decida dnde proyectar el archivo. En cualquier caso, la funcin devolver la direccin de proyeccin utilizada.
El parmetro descriptor se corresponde con el descriptor del archivo que se pretende proyectar (que debe estar previamente abierto) y los parmetros despl y longitud establecen qu
zona del archivo se proyecta: desde la posicin despl hasta desp + longitud.
El argumento protec establece la proteccin sobre la regin que puede ser de lectura
(PROT_READ), de escritura (PROT_WRITE), de ejecucin (PROT_EXEC) o cualquier combinacin de
ellas. Esta proteccin debe ser compatible con el modo de apertura del archivo. Por ltimo, el
parmetro indicador permite establecer ciertas propiedades en la regin:
MAP_SHARED. La regin es compartida. Las modificaciones sobre la regin afectarn al
archivo. Un proceso hijo compartir esta regin con el padre.
MAP_PRIVATE. La regin es privada. Las modificaciones sobre la regin no afectarn al
archivo. Un proceso hijo no compartir esta regin con el padre, sino que obtendr un duplicado de la misma.
MAP_FIXED. El archivo debe proyectarse justo en la direccin especificada en el primer
parmetro, siempre que ste sea distinto de cero.
En el caso de que se quiera proyectar una regin sin soporte (regin annima), en algunos
sistemas se puede especificar el valor MAP_ANOM en el parmetro indicador. Otros sistemas UNIX no
ofrecen esta opcin, pero permiten proyectar el dispositivo /dev/zero para lograr el mismo objetivo. Esta opcin se puede usar para cargar la regin de datos sin valor inicial de una biblioteca dinmica.

Gestin de memoria

213

Cuando se quiere eliminar una proyeccin previa o parte de la misma, se usa el servicio
munmap cuyo prototipo es:
int munmap (caddr_t direc, size_t longitud);

Los parmetros direc y longitud definen una regin (o parte de una regin) que se quiere
proyectar.
Antes de presentar ejemplos del uso de estos servicios, hay que aclarar que se usan conjuntamente con los servicios de manejo de archivos que se presentarn en el captulo que trata este tema.
Por ello, para una buena comprensin de los ejemplos, se deben estudiar tambin los servicios
explicados en ese captulo.
A continuacin, se muestran dos ejemplos del uso de estas funciones. El primero es el Programa 4.4, que cuenta cuntas veces aparece un determinado carcter en un archivo usando la tcnica
de proyeccin en memoria.
Programa 4.4.

#include
#include
#include
#include
#include
#include

Programa que cuenta el nmero de apariciones de un carcter en un archivo utilizando


servicios POSIX.

<sys/types.h>
<sys/stat.h>
<sys/mman.h>
<fcntl.h>
<stdio.h>
<unistd.h>

int main(int argc, char **argv) {


int i, fd, contador=0;
char caracter;
char *org, *p;
struct stat bstat;
if (argc!=3) {
fprintf (stderr, Uso: %s caracter archivo\n, argv[0]);
return(1);
}
/* Por simplicidad, se supone que el carcter a contar corresponde
con el primero del primer argumento */
carcter=argv[1][0];
/* Abre el archivo para lectura */
if ((fd=open(argv[2], O_RDONLY))<0) {
perror(No puede abrirse el archivo);
return(1);
}
/* Averigua la longitud del archivo */
if (fstat(fd, &bstat)<0) {
perror(Error en fstat del archivo);
close(fd);
return(1);
}

214

Sistemas operativos. Una visin aplicada

/* Se proyecta el archivo */
if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ,
MAP_SHARED, fd, 0)) == MAP_FAILED) {
perror(Error en la proyeccion del archivo);
close(fd);
return(1);
}
/* Se cierra el archivo */
close(fd);
/* Bucle de acceso */
p=org;
for (i=0; i<bstat.st_size; i++)
if (*p++==caracter) contador++;
/* Se elimina la proyeccin */
munmap(org, bstat.st_size);
printf(%d\n, contador);
return(0);
}

El segundo ejemplo corresponde con el Programa 4.5, que usa la tcnica de proyeccin para
realizar la copia de un archivo. Observe el uso del servicio ftruncate para asignar espacio al
archivo destino.
Programa 4.5.
#include
#include
#include
#include
#include
#include

Programa que copia un archivo utilizando servicios POSIX.

<sys/types.h>
<sys/stat.h>
<sys/mman.h>
<fcntl.h>
<stdio.h>
<unistd.h>

void main(int argc, char **argv) {


int i, fdo, fdd;
char *org, *dst, *p, *q;
struct stat bstat;
if (argc!=3) {
fprintf (stderr, Uso: %s orig dest\n, argv[0]);
exit(1);
}
/* Abre el archivo origen para lectura */
if ((fdo=open(argv[1], O_RDONLY))<0) {
perror(No puede abrirse el archivo origen);
exit(1);
}

Gestin de memoria

/* Crea el archivo destino */


if ((fdd=open(argv[2], O_CREAT|O_TRUNC|O_RDWR, 0640))<0) {
perror(No puede crearse el archivo destino);
close(fdo);
exit(1);
}
/* Averigua la longitud del archivo origen */
if (fstat(fdo, &bstat)<0) {
perror(Error en fstat del archivo origen);
close(fdo);
close(fdd);
unlink (argv[2]);
exit(1);
}
/* Establece que la longitud del archivo destino es igual a la
del origen.*/
if (ftruncate(fdd, bstat.st_size)<0) {
perror(Error en ftruncate del archivo destino);
close(fdo);
close(fdd);
unlink (argv[2]);
exit(1);
}
/* Se proyecta el archivo origen */
if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ,
MAP_SHARED, fdo, 0)) == MAP_FAILED) {
perror(Error en la proyeccion del archivo origen);
close(fdo);
close(fdd);
unlink (argv[2]);
exit(1);
}
/* Se proyecta el archivo destino */
if ((dst=mmap((caddr_t) 0, bstat.st_size, PROT_WRITE,
MAP_SHARED, fdd, 0)) == MAP_FAILED) {
perror(Error en la proyeccion del archivo destino);
close(fdo);
close(fdd);
unlink (argv[2]);
exit(1);
}
/* Se cierran los archivos */
close(fdo);
close(fdd);
/* Bucle de copia */
p=org; q=dst;
for (i=0; i<bstat.st_size; i++)
*q++= *p++;

215

216

Sistemas operativos. Una visin aplicada

/* Se eliminan las proyecciones */


munmap(org, bstat.st_size);
munmap(dst, bstat.st_size);
}

4.7.3. Servicios de memoria de Win32


Los servicios de memoria ms utilizados son, nuevamente, los de proyeccin de archivos. A diferencia de POSIX, la proyeccin de un archivo se realiza en dos pasos. En primer lugar, hay que
crear una proyeccin del archivo usando la primitiva CreateFileMapping:
HANDLE CreateFileMapping (HANDLE archivo,
LPSECURITY_ATTRIBUTES segur, DWORD prot,
DWORD tamanyo_max_alta; DWORD tamanyo_max_baja,
LPCTSTR nombre_proy);

Esta funcin devuelve un identificador de la proyeccin y recibe como parmetros el nombre


del archivo, un valor de los atributos de seguridad, la proteccin, el tamao del objeto a proyectar
(especificando la parte alta y la parte baja de este valor en dos parmetros independientes) y un
nombre para la proyeccin.
En cuanto a la proteccin, puede especificarse de slo lectura (PAGE_READONLY), de lectura y
escritura (PAGE_READWRITE) o privada (PAGE_WRITECOPY).
Con respecto al tamao, en el caso de que el archivo pueda crecer, se debe especificar el
tamao esperado para el archivo. Si se especifica un valor 0, se usa el tamao actual del archivo.
Por ltimo, el nombre de la proyeccin permite a otros procesos acceder a la misma. Si se
especifica un valor nulo, no se asigna nombre a la proyeccin.
Una vez creada la proyeccin, se debe crear una regin en el proceso asociada a la misma. Esta
operacin se realiza mediante la funcin MapViewOfFile cuyo prototipo es el siguiente:
LPVOID MapViewOfFile (HANDLE id_proy, DWORD acceso,
DWORD desp_alta, DWORD desp_baja, DWORD tamanyo);

Esta funcin devuelve la direccin del mapa donde se ha proyectado la regin. Recibe como
parmetros el identificador de la proyeccin devuelto por CreateFileMapping, el acceso solicitado (FILE_MAP_WRITE, FILE_MAP_READ y FILE_MAP_ALL_ACCESS), que debe ser compatible
con la proteccin especificada en la creacin, el desplazamiento con respecto al inicio del archivo a
partir del que se realiza la proyeccin y el tamao de la zona proyectada (el valor cero indica todo el
archivo).
Por ltimo, para desproyectar el archivo se usa UnmapViewOfFile:
BOOL UnmapViewOfFile (LPVOID dir);

donde el parmetro indica la direccin de comienzo de la regin que se quiere desproyectar.


Como se coment en la seccin que presentaba los servicios POSIX, es necesario conocer los
servicios bsicos de archivos para entender completamente los siguientes programas.
A continuacin, se muestran los dos mismos ejemplos que se plantearon en la seccin dedicada a POSIX. El primero es el Programa 4.6, que cuenta cuntas veces aparece un determinado
carcter en un archivo usando la tcnica de proyeccin en memoria.

Gestin de memoria

Programa 4.6.

217

Programa que cuenta el nmero de apariciones de un carcter en un archivo utilizando


servicios Win32.

#include <windows.h>
#include <stdio.h>
int main (int argc, LPTSTR argv [])
{
HANDLE hArch, hProy;
LPSTR base, puntero;
DWORD tam;
int contador=0;
char caracter;
if (argc!=3) {
fprintf (stderr, Uso: %s carcter archivo\n, argv[0]);
return(1);
}
/* Por simplicidad, se supone que el carcter a contar corresponde
con el primero del primer argumento */
caracter=argv[1][0];
/* Abre el archivo para lectura */
hArch = CreateFile (argv[2], GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hArch == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede abrirse el archivo\n);
return(1);
}
/* se crea la proyeccin del archivo */
hProy = CreateFileMapping (hArch, NULL, PAGE_READONLY, 0, 0, NULL);
if (hProy == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede crearse la proyeccin\n);
return(1);
}
/* se realiza la proyeccin */
base = MapViewOfFile (hProy, FILE_MAP_READ, 0, 0, 0);
tam = GetFileSize (hArch, NULL);
/* bucle de acceso */
puntero = base;
while (puntero < base + tam)
if (*puntero++==caracter) contador++;
printf(%d\n, contador);
/* se elimina la proyeccin y se cierra el archivo */
UnmapViewOfFile (base);
CloseHandle (hProy);
CloseHandle (hArch);
return 0;
}

218

Sistemas operativos. Una visin aplicada

El segundo ejemplo corresponde con el Programa 4.7, que usa la tcnica de proyeccin para
realizar la copia de un archivo.

Programa 4.7.

Programa que copia un archivo utilizando servicios Win32.

#include <windows.h>
#include <stdio.h>
int main (int argc, LPTSTR argv [])
{
HANDLE hEnt, hSal;
HANDLE hProyEnt, hProySal;
LPSTR base_orig, puntero_orig;
LPSTR base_dest, puntero_dest;
DWORD tam;
if (argc!=3) {
fprintf (stderr, Uso: %s origen destino\n, argv[0]);
return(1);
}
/* se abre archivo origen */
hEnt = CreateFile (argv[1], GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hEnt == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede abrirse el archivo origen\n);
return(1);
}
/* se crea proyeccin de archivo origen */
hProyEnt = CreateFileMapping (hEnt, NULL, PAGE_READONLY, 0, 0,
NULL);
if (hProyEnt == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede crearse proyeccin del archivo origen\n);
return(1);
}
/* se proyecta archivo origen */
base_orig = MapViewOfFile (hProyEnt, FILE_MAP_READ, 0, 0, 0);
tam = GetFileSize (hEnt, NULL);
/* se crea el archivo destino */
hSal = CreateFile (argv[2], GENERIC_READ Y GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hSal == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede crearse el archivo destino\n);
return(1);
}
/* se crea proyeccin de archivo destino */
hProySal = CreateFileMapping (hSal, NULL, PAGE_READWRITE, 0, tam,
NULL);

Gestin de memoria

219

if (hProySal == INVALID_HANDLE_VALUE) {
fprintf(stderr, No puede crearse proyeccin del archivo destino);
return(1);
}
/* se proyecta archivo destino */
base_dest = MapViewOfFile (hProySal, FILE_MAP_WRITE, 0, 0, tam);
/* bucle de copia */
puntero_orig = base_orig;
puntero_dest = base_dest;
for ( ; puntero_orig < base_orig + tam; puntero_orig++,
puntero_dest++)
*puntero_dest = *puntero_orig;
/* se eliminan proyecciones y se cierran archivos */
UnmapViewOfFile (base_dest);
UnmapViewOfFile (base_orig);
CloseHandle (hProyEnt);
CloseHandle (hEnt);
CloseHandle (hProySal);
CloseHandle (hSal);
return 0;
}

4.8. PUNTOS A RECORDAR


El sistema de memoria debe ofrecer a cada proceso un
espacio lgico propio.
El sistema de memoria debe proporcionar proteccin
entre los procesos.
El sistema de memoria debe permitir que los procesos
compartan memoria.
El sistema de memoria debe dar soporte a las regiones
del proceso.
El sistema de memoria debe maximizar el rendimiento
del sistema.
El sistema de memoria debe proporcionar a los procesos mapas de memoria muy grandes.
Las bibliotecas dinmicas ofrecen mltiples ventajas
con respecto a las estticas. Entre otras, disminuyen el
tamao del ejecutable y permiten una actualizacin dinmica.
Un ejecutable est formado por una cabecera y un conjunto de secciones. Las secciones principales son el cdigo, datos con valor inicial y sin valor inicial.
Las variables locales y parmetros no aparecen en el
ejecutable, ya que se crean en tiempo de ejecucin.

El mapa de memoria est formado por varias regiones. Las regiones iniciales se corresponde con las
secciones del ejecutable ms la pila inicial.
Otras regiones se crean posteriormente de forma dinmica como el heap, las zonas de memoria compartida y
los archivos proyectados.
Una regin se caracteriza por su tamao, soporte, proteccin, carcter privado o compartido y longitud fija o
variable.
Se identifican las siguientes operaciones sobre una regin: creacin, liberacin, cambio de tamao y duplicado.
Los esquemas de memoria ms primitivos son los de
asignacin contigua que requieren que la MMU tenga
registros valla.
En los esquemas contiguos se aplica una estrategia de
asignacin de espacio. Las ms tpicas son: best-fit,
worst-fit y first-fit (la ms adecuada).
El esquema de asignacin contigua no da soporte a las
regiones, no permite compartir y tiene un mal aprovechamiento de la memoria (fragmentacin externa).

220

Sistemas operativos. Una visin aplicada

El intercambio es una tcnica predecesora de la memoria virtual que permite que haya ms procesos de los
que caben en memoria usando un disco (dispositivo de
swap) como respaldo.
La paginacin considera el mapa del proceso dividido
en pginas y la memoria principal en marcos del mismo
tamao. La tabla de pginas hace corresponder una pgina con el marco que la contiene.
La paginacin sufre fragmentacin interna.
La entrada de la tabla de pginas contiene informacin
de validez, de proteccin, de acceso y el nmero de
marco asociado.
La paginacin cumple todos los objetivos deseables en
un esquema de memoria. Adems, sirve como base para
construir un sistema de memoria virtual.
Para implementar eficientemente la paginacin es necesario usar una TLB.
Para reducir los gastos de memoria en tablas de pgina
se pueden usar tablas de pginas multinivel y tablas invertidas.
La segmentacin considera el mapa del proceso dividido en segmentos continuos. No es adecuada por sufrir
fragmentacin externa y no permitir implementar eficientemente memoria virtual.
La segmentacin paginada combina las ventajas de ambos esquemas.
La memoria virtual se construye sobre esquemas basados en paginacin por demanda. Las pginas no residentes
se marcan como invlidas para forzar el fallo de pgina.
El tratamiento de un fallo de pgina implica la lectura
de la pgina en un marco libre. Si no hay ninguno, hay
que aplicar antes un reemplazo que puede requerir una
escritura al disco si la pgina expulsada estaba modificada.
La administracin de la memoria virtual conlleva una
poltica de reemplazo y una asignacin de espacio a los
procesos.
Las polticas de reemplazo pueden ser locales o globales.
La poltica de reemplazo LRU es la ms adecuada
pero es difcil de implementar sin un hardware especfico.

La poltica de reemplazo de la segunda oportunidad


proporciona una solucin con un rendimiento aceptable
sin requerir un hardware especfico.
No todas las pginas son objeto de reemplazo. Algunas
quedan retenidas en memoria.
La poltica de asignacin de marcos a los procesos puede ser fija o dinmica.
Las polticas de asignacin fija tienen asociados algoritmos de reemplazo locales. No se adaptan al comportamiento dinmico del proceso.
Las polticas de asignacin dinmica pueden usarse con
reemplazos locales o globales.
La hiperpaginacin se produce cuando hay una elevada
tasa de fallos de pgina.
Con asignacin fija, la hiperpaginacin slo afecta al
proceso implicado. Con asignacin dinmica, afecta a
todo el sistema y hace falta disminuir el grado de multiprogramacin.
Para evitar la hiperpaginacin puede usarse la estrategia
del conjunto de trabajo, la estrategia basada en la frecuencia de fallos de pgina o algoritmos de control de
carga especficos.
Existen dos estrategias a la hora de asignar espacio de
swap: asignacin cuando se crea la regin (preasignacin) o asignacin en la primera expulsin.
Cuando se crea una regin en un sistema de memoria
virtual, se marcan sus pginas como no residentes y se
almacenan sus propiedades.
Las regiones privadas se expulsan a swap, mientras que
las compartidas se escriben sobre el propio soporte.
El aumento de tamao de una regin debe controlarse
para evitar solapamiento.
El duplicado de una regin requerido por el servicio
fork de POSIX se optimiza mediante la tcnica del
copy-on-write.
El mecanismo de proyeccin de archivos en memoria
proporciona una manera alternativa de acceder a los archivos con numerosas ventajas sobre la forma tradicional.
Los principales servicios de gestin de memoria son los
relacionados con la proyeccin de archivos en memoria.

4.9. LECTURAS RECOMENDADAS


Todos los libros generales de sistemas operativos incluyen uno o ms captulos dedicados a la gestin de
memoria. Algunos de ellos dedican un captulo a los esquemas sin memoria virtual y otro a los esquemas con
memoria virtual ([Silberschatz, 1998] y [Stallings, 1998]). Sin embargo, otros libros dedican un solo captulo a
este tema [Tanenbaum, 1992].
Hay otros libros que estudian cmo se implementa la gestin de memoria en UNIX System V [Bach,
1986], en UNIX BSD [McKusick, 1998], en Linux [Beck, 1997], en Windows-NT [Custer, 1993] o en MINIX
[Tanenbaum, 1997].

Gestin de memoria

221

En cuanto a los servicios de gestin de memoria, en [Stevens, 1992] se presentan los de POSIX y en [Hart,
1997] los de Win32. Para un estudio de los aspectos ms formales de la memoria virtual, se recomienda
[Maekawa, 1987].

4.10.

EJERCICIOS

4.1.

Sea un sistema de paginacin con un tamao de pgina P. Especifique cul sera la frmula matemtica que determina la direccin de memoria fsica F a
partir de la direccin virtual D, siendo la funcin
MARCO(X) una que devuelve el nmero de marco
almacenado en la entrada X de la tabla de pginas.
4.2. Es siempre el algoritmo de reemplazo LRU mejor
que el FIFO? En caso afirmativo, plantee una demostracin. En caso negativo, proponga un contraejemplo.
4.3. Cul de las siguientes tcnicas favorece la proximidad de referencias?

Un programa multiflujo.
El uso de listas.
La programacin funcional.
La programacin estructurada.

4.4. El lenguaje C define el calificador volatile


aplicable a variables. La misin de este calificador
es evitar problemas de coherencia en aquellas variables que se acceden tanto desde el flujo de ejecucin normal como desde flujos asncronos,
como por ejemplo una rutina asociada a una seal
POSIX. Analice qu tipo de problemas podran
aparecer y proponga un mtodo para resolver los
problemas identificados para las variables etiquetadas con este calificador.
4.5. Algunas MMU no proporcionan un bit de pgina
accedida. Proponga una manera de simularlo. Una
pista: se pueden forzar fallos de pgina para detectar accesos a una pgina.
4.6. Algunas MMU no proporcionan un bit de pgina
modificada. Proponga una manera de simularlo.
4.7. Escriba un programa que use los servicios POSIX
de proyeccin de archivos para comparar dos archivos.
4.8. Escriba un programa que use los servicios Win32
de proyeccin de archivos para comparar dos archivos.
4.9. Por qu una cache que se accede con direcciones
virtuales puede producir incoherencias y requiere
que el sistema operativo la invalide en cada cambio de proceso y, en cambio, una que se accede con
direcciones fsicas no lo requiere?
4.10. Por qu una cache que se accede con direcciones
virtuales permite que el acceso a la TLB y a la ca-

4.11.

che se hagan en paralelo y, en cambio, una que se


accede con direcciones fsicas no lo permite? Por
qu es conveniente que las caches que se acceden
con direcciones fsicas tengan el mismo tamao
que la pgina?
La secuencia que se utiliza tpicamente como ejemplo de la anomala de Belady es la siguiente:
123412512345

4.12.

4.13.

Analice cuntos fallos de pgina se producen al


usar el algoritmo FIFO teniendo 3 marcos y cuntos con 4 marcos. Comprelo con el algoritmo
LRU. Qu caracteriza a los algoritmos de reemplazo de pila?
Exponga uno o ms ejemplos de las siguientes situaciones:
Fallo de pgina que no implica operaciones de
entrada/salida.
Fallo de pgina que implica slo una operacin
de lectura.
Fallo de pgina que implica slo una operacin
de escritura.
Fallo de pgina que implica una operacin de
lectura y una de escritura.
Sea un sistema de memoria virtual sin buffering de
pginas. Analice la evolucin de una pgina en
este sistema dependiendo de la regin a la que pertenece. Estudie los siguientes tipos:

4.14.
4.15.

4.16.

Pgina
Pgina
Pgina
Pgina
Pgina

de
de
de
de
de

cdigo.
datos con valor inicial.
datos sin valor inicial.
un archivo proyectado.
una zona de memoria compartida.

Resuelva el ejercicio anterior suponiendo que hay


buffering de pginas.
Consulte las pginas de manual de los servicios
dlopen y dlsym disponibles en algunos sistemas UNIX que permiten solicitar la carga de una
biblioteca dinmica y acceder a un smbolo de la
misma. Escriba un programa que use esta funcin
para cargar una biblioteca dinmica y ejecutar una
funcin de la misma.
Consulte el manual de los servicios LoadLibrary y GetProcAddress disponibles en

222

4.17.

4.18.

4.19.

4.20.
4.21.

4.22.

4.23.
4.24.
4.25.

Sistemas operativos. Una visin aplicada

Win32 que permiten solicitar la carga de una biblioteca dinmica y acceder a un smbolo de la
misma. Escriba un programa que use esta funcin
para cargar una biblioteca dinmica y ejecutar una
funcin de la misma.
Como se coment en la explicacin del algoritmo
de reemplazo LRU, el tiempo que se debe usar
para seleccionar la pgina menos recientemente
usada es el tiempo lgico de cada proceso y no el
tiempo real. Modifique la implementacin basada
en contadores propuesta en el texto para que tenga
en cuenta esta consideracin.
Un algoritmo de reemplazo no descrito en el texto
es el MFU (menos frecuentemente utilizada). Este
algoritmo elige para el reemplazo aquella pgina
que se haya utilizado menos frecuentemente. Analice cul son los puntos fuertes y dbiles de este
algoritmo y plantee una implementacin de este
algoritmo.
Codifique cmo sera la rutina de tratamiento de
fallo de pgina en un sistema con memoria virtual
que no usa buffering de pginas ni preasignacin
de swap. Tenga en cuenta la influencia de las distintas caractersticas de las regiones (p. ej.: si es
privada o compartida).
Resuelva el problema anterior para un sistema con
buffering de pginas y preasignacin de swap.
En la descripcin de la tcnica COW se explic
que para implementar esta tcnica generalmente se
pone la pgina con una proteccin de slo lectura.
Analice cmo sera la rutina de tratamiento de la
excepcin que se produce al escribir en una pgina
de este tipo para implementar la tcnica COW.
Muchas implementaciones de UNIX realizan la
carga de las bibliotecas dinmicas utilizando el
servicio mmap. Explique qu parmetros deberan
especificarse para cada una de las secciones de una
biblioteca.
Acceda en un sistema Linux al archivo /proc/
self/maps y analice su contenido.
En Win32 se pueden crear mltiples heaps. Analice en qu situaciones puede ser interesante esta caracterstica.
Algunas versiones de UNIX proporcionan una llamada denominada vfork que crea un hijo que uti-

4.26.
4.27.

4.28.

4.29.

4.30.

4.31.
4.32.

liza directamente el mapa de memoria del proceso


padre que queda bloqueado hasta que el hijo ejecuta un exec o termina. En ese momento el padre
recupera su mapa. Analice qu ventajas y desventajas presenta el uso de este nuevo servicio frente a
la utilizacin del fork convencional. En este anlisis suponga primero que el fork se implementa
sin usar la tcnica COW para a continuacin considerar que s se utiliza.
Por qu es necesario mantener al menos una pgina invlida entre la regin de pila y la regin que
est situada justo encima?
Analice qu puede ocurrir en un sistema que usa
paginacin por demanda si se recompila un programa mientras se est ejecutando. Proponga soluciones a los problemas que pueden surgir en esta situacin.
En POSIX se define el servicio msync que permite forzar la escritura inmediata de una regin al soporte. En qu situaciones puede ser interesante
usar esta funcin?
Cuando se produce un fallo en una pgina que pertenece a una regin compartida, se trae a memoria
secundaria la pgina y se actualiza la entrada de la
tabla de pginas del proceso que caus el fallo.
Cmo se enteran el resto de los procesos que comparten la pgina de que sta ya est en memoria?
El mecanismo de buffering permite recuperar una
pgina que est en la lista de libres ya que todava
no se ha reutilizado el marco que la contiene. Cmo se puede implementar esta bsqueda en la lista
para que se haga de forma eficiente?
Analice qu situaciones se pueden producir en el
tratamiento de un fallo de TLB en un sistema que
tiene una gestin software de la TLB.
Con el uso de la tcnica de proyeccin de archivos
se produce una cierta unificacin entre el sistema
de archivos y la gestin de memoria. Puesto que,
como se ver en el captulo dedicado a los archivos, el sistema de archivos usa una cache de bloques con escritura diferida para acelerar el acceso
al disco, analice qu tipo de incoherencias pueden
producirse si se accede a un archivo usando la proyeccin y las primitivas convencionales del sistema de archivos.

You might also like