# La gestión de la memoria

[Abrir el PDF original](<../PDF/La gestión de la memoria.pdf>)

> Conversión de texto página a página. La paginación permite cotejar este archivo con el PDF original.

## Página 1

<!-- source-page: 1 -->

La gestión de la
memoria



José Ramón Herrero Zaragoza
Enric Morancho Llena
Dolors Royo Vallés


PID_00169383

## Página 2

<!-- source-page: 2 -->

GNUFDL • PID_00169383                                                                                                                                                                                                       La gestión de la memoria



















































































































 © 2014, FUOC. Se garantiza permiso para copiar, distribuir y modificar este documento según los términos de la GNU Free
 Documentation License, Version 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni
 textos de cubierta delantera o trasera. Se dispone de una copia de la licencia en el apartado "GNU Free Documentation License" de
 este documento.

## Página 3

<!-- source-page: 3 -->

GNUFDL • PID_00169383                                                                                                                                                                                                       La gestión de la memoria

Índice






Introducción...............................................................................................                          5

Objetivos.......................................................................................................                     6

1.     Espacios de direcciones.....................................................................                                  7

2.     Un primer mecanismo de traducción dinámica........................                                                            9
       2.1.       Limitaciones de este sistema .......................................................                             11

3.     Memoria virtual.................................................................................                            13
       3.1.       Paginación ...................................................................................                   13
                  3.1.1.        Ubicación de las regiones de código, datos y pila
                                dentro del espacio lógico ..............................................                           15
                  3.1.2.        ¿Evita la paginación las deficiencias del sistema
                                presentado en el apartado 2? ........................................                              16
       3.2.       Paginación bajo demanda ...........................................................                              17

4.     Modificación dinámica del espacio lógico..................................                                                  21
       4.1.       Modificación dinámica del tamaño de la región de datos ..........                                                21

5.     Errores de programación relacionados con el acceso a la
       memoria................................................................................................                     23

Resumen.......................................................................................................                     26

Actividades..................................................................................................                      27

Ejercicios de autoevaluación..................................................................                                     27

Solucionario................................................................................................                       29

Glosario........................................................................................................                   30

Bibliografía.................................................................................................                      31

## Página 4

<!-- source-page: 4 -->



## Página 5

<!-- source-page: 5 -->

GNUFDL • PID_00169383                                                                                   5                                                                                                   La gestión de la memoria

Introducción







En este módulo didáctico, presentamos los principios de la gestión de la me-
moria principal, uno de los recursos más importantes de cualquier sistema
operativo multiprogramado. La gestión￿de￿la￿memoria se encarga básicamen-
te de asignar la memoria física del sistema computador, que es finita, a los
procesos que la solicitan. Ningún programa se puede ejecutar si no se le ha
asignado memoria principal para almacenar su código, sus datos y su pila de
ejecución.


Primero se introducen los espacios￿de￿direcciones, que son el lógico y el físi-
co. Mientras que el espacio físico es único, cada proceso en ejecución tendrá
asociado un espacio lógico; cada espacio lógico será independiente de los del
resto de procesos. El sistema de gestión de la memoria esconderá el espacio
físico a los usuarios y la visión que éstos tendrán de la memoria será el espa-
cio lógico. Por lo tanto, será necesario un mecanismo que traduzca, de forma
transparente para el usuario, los accesos al espacio lógico en accesos al espacio
físico.


La coexistencia de múltiples espacios de direcciones lógicos que pertenecen a
diferentes procesos residentes en la memoria principal introduce la necesidad
de proteger los espacios de direcciones. En un entorno multiprogramado, el
gestor de la memoria tendría que disponer de mecanismos￿de￿protección
de￿la￿memoria, es decir, tendría que garantizar que un proceso no pudiera
acceder a la memoria física asignada a otro proceso o al sistema operativo.
También es deseable que, si los procesos lo autorizan, acepte compartir￿la
memoria y permita, así, espacios comunes para los procesos interesados.


Presentamos la implementación de un gestor de memoria sencillo que, con
la ayuda del hardware, cumple la mayoría de los requerimientos indicados.
Una vez analizadas sus limitaciones, describimos el gestor de memoria virtual.
Este último sistema será capaz de independizar los procesos de la cantidad de
memoria física instalada en la máquina, con lo cual permitirá ejecutar procesos
que no caben en la memoria física.


Finalmente, reflexionamos sobre las posibilidades de ampliar, en tiempo de
ejecución, el espacio lógico de un proceso. También comentamos algunos erro-
res de programación típicos relacionados con el uso de la memoria.

## Página 6

<!-- source-page: 6 -->

GNUFDL • PID_00169383                                                                                   6                                                                                                   La gestión de la memoria

Objetivos







Los materiales didácticos de este módulo contienen las herramientas necesa-
rias para que el estudiante alcance los objetivos siguientes:



1.  Justificar la existencia de diversos espacios de direcciones y de los meca-
     nismos de traducción de direcciones en tiempo de ejecución.


2.  Conocer las funcionalidades que tienen que ofrecer los sistemas de gestión
     de la memoria en un sistema operativo multiproceso de propósito general.


3.  Saber cómo se puede aumentar, en tiempo de ejecución, el espacio lógico
     de los procesos.

## Página 7

<!-- source-page: 7 -->

GNUFDL • PID_00169383                                                                                   7                                                                                                   La gestión de la memoria

1.Espacios de direcciones







La memoria física (RAM) del computador es un vector de palabras (típicamente
del tamaño de un byte), cada una de las cuales se identifica mediante una
dirección (@).


En los sistemas operativos multiproceso, los procesos en ejecución (y el sistema
operativo mismo) comparten la memoria física. Cada proceso (y el sistema
operativo) tiene asignado un conjunto de direcciones físicas para almacenar
su código, sus datos y su pila de ejecución. Ahora bien, el sistema operativo
tiene que garantizar que ningún otro proceso podrá acceder al conjunto de
direcciones asignado al resto de procesos (y al sistema operativo).


Una posible solución pasa por considerar dos tipos de espacios de direcciones
(el espacio físico y el espacio lógico) y un mecanismo de traducción de direc-
ciones lógicas a direcciones físicas:


1)￿Espacio￿físico: está determinado por la memoria física instalada en el sis-
tema computador. Las direcciones de memoria de este espacio se llaman di-
recciones físicas. Asumiremos que el rango de direcciones físicas del espacio
físico es lineal y que empieza en la dirección física 0 y finaliza a la dirección
Memoria_Física_Instalada - 1.

2)￿Espacio￿lógico: este espacio es la visión que el sistema operativo ofrece del                         (1)En este módulo, mostramos las
espacio físico. Cada proceso tiene asociado un espacio lógico, independien-                              direcciones lógicas y las direccio-
                                                                                                         nes físicas codificadas en hexadeci-
te de los del resto de procesos, a través del cual puede acceder a su código,                            mal.
a sus datos y a su pila de ejecución. Las direcciones de memoria de este es-
pacio se llaman direcciones lógicas. Asumiremos que este espacio es lineal.
Potencialmente, el rango de direcciones lógicas del espacio lógico empieza
a la dirección lógica 0 y finaliza a la dirección 2Tamaño_Bus_Direcciones-1, donde
Tamaño_Bus_Direcciones está determinada por el tamaño del bus de direccio-
nes del procesador (típicamente, 32 o 64 bits en los procesadores actuales).
Cabe destacar que, para cada proceso, existe un rango de direcciones lógicas
válidas, que dependerá de la cantidad de memoria que utilice el proceso. La
traducción de dirección lógica a dirección física dependerá del proceso que
la realice; por ejemplo, la dirección lógica 0x0bc000001 puede ser traducida a
direcciones físicas diferentes para cada proceso del sistema.


Existen dos alternativas para implementar esta traducción de direcciones:

## Página 8

<!-- source-page: 8 -->

GNUFDL • PID_00169383                                                                                   8                                                                                                   La gestión de la memoria

1)￿Estática (en tiempo de carga): al cargar un fichero ejecutable en la memoria
se realiza la traducción de cada dirección lógica a la dirección física correspon-
diente. Por lo tanto, cada dirección lógica se traduce una única vez a lo largo
de la ejecución del programa.


2)￿Dinámica (en tiempo de ejecución): al cargar un fichero ejecutable en la
memoria no se realiza ningún tipo de traducción. La ejecución del proceso
hará que el procesador genere direcciones lógicas y un hardware especializa-
do (la MMU, Memory Management Unit) traducirá cada dirección lógica en la
dirección física correspondiente. A diferencia del caso anterior, en el que cada
dirección lógica se traducía exactamente una vez, en este caso cada dirección
lógica se traduce tantas veces como sea referenciada.


Los sistemas operativos multiproceso actuales utilizan mecanismos basados
en la traducción dinámica porque son más flexibles que los basados en la tra-
ducción estática.

## Página 9

<!-- source-page: 9 -->

GNUFDL • PID_00169383                                                                                   9                                                                                                   La gestión de la memoria

2.Un primer mecanismo de traducción dinámica







A continuación, presentamos un mecanismo sencillo de traducción dinámica
de direcciones. Aunque este mecanismo permite aislar el espacio lógico de un
proceso (y del sistema operativo) de los del resto de procesos, veremos que
tiene algunas limitaciones que lo convierten en inapropiado para los sistemas
computadores actuales.


Cada proceso tendrá asociado un espacio lógico. El rango de direcciones vá-
lidas del espacio lógico del proceso i-ésimo será [0, tamañoi-1], donde tama-
ñoi es el tamaño del espacio lógico del proceso i-ésimo (podemos asumir que
coincide con la suma de los tamaños de sus regiones de código, datos y pila
de ejecución). Cada proceso se cargará en una serie de posiciones consecutivas
de la memoria física; basei será la dirección de memoria física base a partir de
la cual se carga el proceso i-ésimo.


La MMU de este sistema llevará a cabo dos tareas:


•    Comprobará que las direcciones lógicas (@L) generadas por un proceso se
    encuentren dentro del rango de direcciones válidas para el proceso. En
    caso de que una @L no sea válida, la MMU generará una excepción del
    tipo "acceso a memoria inválido".


•    Traducirá las direcciones lógicas en direcciones físicas (@F) mediante una
    suma de la dirección lógica con la dirección base.


La MMU se programará con dos registros de control:


•    Base: indica la dirección física inicial asignada al proceso en ejecución.
•    Tamaño: indica el tamaño en bytes del espacio lógico del proceso en eje-
    cución.


La figura 1 muestra el hardware que lleva a cabo estas tareas. El procesador
genera direcciones lógicas para acceder al código, a los datos o a la pila alma-
cenados en la memoria física. La MMU comprueba si la dirección lógica gene-
rada es válida para el proceso (es decir, si pertenece al rango [0 ... tamaño-1])
utilizando un comparador. Si no está dentro del rango, la MMU genera una
excepción del tipo "dirección lógica inválida" y no realiza ninguna traducción.
Si se encuentra dentro del rango, suma la dirección lógica a la dirección física
base y obtiene la dirección física.

## Página 10

<!-- source-page: 10 -->

GNUFDL • PID_00169383                                                                                  10                                                                                                  La gestión de la memoria




























Figura 1. Esquema de una MMU sencilla que lleva a cabo traducción dinámica de direcciones y que permite aislar el espacio
lógico de un proceso del resto de procesos.

Con el fin de garantizar que el mecanismo aísle el rango de direcciones de                                                      Ved también
un proceso del resto de procesos, las instrucciones del lenguaje máquina que
permitan modificar el valor de los registros de control de la MMU tendrán que                                                     En el apartado 3 del módulo 2,
                                                                                                                                  encontraréis más información
ser privilegiadas. Cada vez que cambie de contexto será necesario modificar el                                                    relacionada con las instruccio-
                                                                                                                                  nes privilegiadas del lenguaje
valor de estos registros de control.                                                                                              máquina.


     La figura 2 presenta un ejemplo en el que asumimos que la memoria física instalada es                                    (2)Como el espacio físico es de 220
     de 1 MB (1.024 KB) y que está ocupada por el sistema operativo (256 KB a partir de la                                    posiciones, cinco dígitos hexadeci-
     dirección 0x000002), por el proceso 1 (128 KB a partir de la dirección 0x80000) y por el                                 males nos permiten codificar cual-
     proceso 2 (64 KB a partir de la dirección 0xC0000).                                                                      quier dirección del espacio.

     Queremos crear un proceso (proceso 3) a partir de un ejecutable que define las regiones
     siguientes: código (64 KB), datos inicializados (16 KB), datos no inicializados (32 KB)                                    Ved también
     y pila de ejecución (16 KB). Si se crea un proceso y se carga este fichero ejecutable en
     la memoria, el sistema operativo tiene que saber cuánta memoria necesita. La memoria                                         Consultad el ejemplo de com-
     necesaria viene dada por el tamaño de las regiones de código, datos (inicializados y no                                      pilación en el anexo del módu-
     inicializados) y pila. En este caso, serían necesarios 128 KB.                                                               lo didáctico 2.

     El sistema operativo tiene que buscar memoria física para incluir este proceso. Para con-
     seguirlo, necesitará alguna estructura de datos que represente el espacio libre en la me-
     moria física. Asumimos que el sistema operativo decide cargar el proceso en el rango de
     direcciones físicas que empieza a partir de la dirección 0x40000. El sistema operativo
     tendrá que guardar en alguna estructura de datos el tamaño (128 KB) y la dirección física
     base (0x40000) asociados a este nuevo proceso.





































     Figura 2. Ejemplo en el que el sistema operativo y tres procesos comparten el espacio físico y en el que el mecanismo de traducción dinámica presentado en la sección 2 traduce las
     direcciones lógicas en direcciones físicas.

## Página 11

<!-- source-page: 11 -->

GNUFDL • PID_00169383                                                                                  11                                                                                                  La gestión de la memoria

    Notad que cada proceso (y el sistema operativo) tiene un espacio lógico independiente del
    resto de procesos. Aunque aparentemente estos espacios lógicos están superpuestos (por
    ejemplo, en todos los espacios lógicos existe la dirección lógica 0x00FFF), el mecanismo
    de traducción los transforma en regiones disjuntas del espacio físico.

    Notad que el código almacenado en la memoria física utilizará direcciones lógicas (dentro
    del espacio lógico del proceso correspondiente) para codificar las direcciones de salto y
    las direcciones de rutinas.

2.1.  Limitaciones de este sistema


A causa de su simplicidad, este sistema de gestión de la memoria presenta una
serie de problemas:


1)￿Contigüidad: el esquema presentado requiere que la memoria física en la
que se carga un proceso sea contigua. Por ejemplo, en el ejemplo de la figura
2 no será posible cargar un proceso que necesite 200 KB porque, a pesar de
disponer de 448 KB (128 KB + 128 KB + 192 KB) de memoria libre, no es posible
encontrar un fragmento contiguo de 200 KB libres. Este problema se conoce
con el nombre de fragmentación externa.


    Fragmentación externa

    El problema de la fragmentación externa también aparece en situaciones cotidianas, co-
    mo el aparcamiento de coches en línea en una calle que no señalice las plazas de aparca-
    miento. Aunque pueden existir diversos agujeros disponibles para estacionar un vehícu-
    lo, para poder aparcarlo es necesario que exista un agujero lo bastante grande para que
    quepa. La suma de los tamaños de los agujeros disponibles puede ser muy superior al
    tamaño del vehículo, pero no podremos aparcar el vehículo si el espacio libre necesario
    no está disponible de forma contigua.

2)￿Dificultad￿de￿crecimiento￿dinámico￿del￿espacio￿lógico￿de￿un￿proceso:
algunos procesos pueden necesitar aumentar dinámicamente el tamaño de
su espacio lógico para poder invocar procedimientos recursivos o para crear
estructuras de datos en tiempos de ejecución. A causa de la contigüidad de este
sistema de gestión de la memoria, para aumentar el espacio lógico del proceso
habría que disponer de memoria física libre contigua a la que tiene asignada
el proceso o bien, al cargar el proceso, reservar más memoria de la necesaria.
En general, eso no siempre será factible.


3)￿No￿permite￿compartir￿porciones￿de￿código￿o￿datos￿entre￿diversos￿pro-
cesos: si diversos procesos están ejecutando el mismo programa (por ejemplo,
el intérprete de comandos o un editor de texto), no es razonable que el código
esté replicado en la memoria física para cada proceso que lo está ejecutando.
Sería más efectivo, si fuera posible, que el código estuviera cargado una única
vez en la memoria física; los procesos compartirían este código y cada uno
trabajaría con sus regiones de datos y de pila privadas. También sería factible
que diversos procesos quisieran compartir un fragmento de su región de da-
tos. El esquema presentado en este apartado no permite la compartición de
memoria entre procesos.


4)￿No￿permite￿la￿carga￿de￿un￿proceso￿que￿no￿quepa￿en￿la￿memoria￿física.

## Página 12

<!-- source-page: 12 -->

GNUFDL • PID_00169383                                                                                  12                                                                                                  La gestión de la memoria

Por lo tanto, este sistema de gestión de la memoria no es adecuado para los
sistemas operativos multiproceso de propósito general. En el apartado 3, da-
remos las pinceladas básicas de un sistema de gestión de la memoria con tra-
ducción dinámica que resuelve estos problemas.

## Página 13

<!-- source-page: 13 -->

GNUFDL • PID_00169383                                                                                  13                                                                                                  La gestión de la memoria

3.Memoria virtual







Existen diversas implementaciones posibles de un sistema de gestión de la
memoria que resuelva los problemas del sistema presentado en el apartado
anterior. En este apartado, presentaremos un sistema de gestión de la memoria
basado en paginación, aunque hay otras alternativas. Veremos que este sistema
permitirá independizar los procesos de la cantidad de memoria física instalada
en la máquina, con lo cual será posible ejecutar procesos que requieran más
memoria de la disponible. Se dice que estos sistemas ofrecen memoria virtual.


3.1.  Paginación

De forma transparente para el programador, un sistema de gestión de la me-                                 (3)La arquitectura IA-32 de Intel
moria basado en paginación divide el espacio lógico del proceso en trozos de                               utiliza páginas de un tamaño de 4
                                                                                                           KB (212 bytes).
tamaño fijo, que llamamos páginas3. El espacio físico también se divide en
trozos del tamaño de una página, llamados frames. Este sistema de traducción
ubicará cada página en un frame de memoria física.


La figura 3 muestra un esquema del hardware que se necesita para implemen-
tar la paginación.





































Figura 3. Esquema de una MMU que implementa paginación pura.

El mecanismo de traducción divide las direcciones lógicas en dos componen-
tes, que son el identificador de página lógica y el desplazamiento dentro de la
página. Utilizando una tabla, llamada tabla de páginas, se determina el iden-
tificador de frame en el espacio físico donde se encuentra la página lógica.
Finalmente, se construye la dirección física concatenando el identificador de
frame y el desplazamiento.

## Página 14

<!-- source-page: 14 -->

GNUFDL • PID_00169383                                                                                  14                                                                                                  La gestión de la memoria

    División de las direcciones lógicas

    Como el procesador codifica las direcciones de memoria en base 2 y el tamaño de página
    es una potencia de 2 (2log2(tamaño_página)), la división de las direcciones lógicas en identifi-
    cador de página lógica y el desplazamiento dentro de la página se hace de forma trivial. El
    desplazamiento son los log2(tamaño_página) bits bajos de la dirección lógica y el iden-
    tificador de página lógica son el resto de bits de la dirección lógica.

La tabla de páginas es propia de cada proceso y tiene tantas entradas como pá-                                (4)Como la granularidad de estas
                                                                                                              protecciones es la de la página,
ginas pueda llegar a tener el espacio lógico de un proceso (2tamaño_bus_direcciones/                          dentro de la misma página no se-
tamaño_página). En cada una de las entradas se almacena un identificador de                                   rá posible mezclar información co-
                                                                                                              rrespondiente a regiones diferen-
frame y una serie de bits de control, entre los cuales está, como mínimo, el bit                              tes.
de validez, que indica si esta página lógica pertenece al espacio lógico del pro-
ceso. Otros bits de control posibles serían los bits de protección (read, readw-
rite, execute), que indican qué operaciones es posible ejecutar en la página4.


En caso de intentar acceder a una página lógica marcada como inválida en la
tabla de páginas, se provocará una excepción que notificará este hecho al sis-
tema operativo. Normalmente, esta excepción provocará que el sistema ope-
rativo haga finalizar inmediatamente este proceso porque se considera que el
proceso presenta un error de programación.


Este sistema de gestión de la memoria presenta algunos problemas prácticos
que complican su implementación real:

•    El tamaño de la tabla de páginas puede ser muy grande. Por ejemplo, si                                   (5)Todos los procesos del sistema
     el tamaño del bus de direcciones es de 32 bits y el tamaño de la página                                  tendrán una tabla de páginas de
                                                                                                              este tamaño, independientemen-
     es de 4 KB, la tabla de páginas tiene 220 entradas (1.048.576 entradas5). Si                             te de la cantidad de páginas que
                                                                                                              ocupe el proceso. El bit de validez
     cada entrada ocupa 4 bytes, representa 4 MB. Este tamaño resulta imprac-                                 indicará qué entradas son las que
     ticable y son necesarias organizaciones que permitan reducir el tamaño de                                realmente utiliza el proceso.

     la tabla de páginas, como por ejemplo estructurar la tabla de páginas en                                 (6)Es la solución adoptada por los
     dos niveles6.                                                                                            procesadores que implementan la
                                                                                                              arquitectura IA-32 de Intel. No es
                                                                                                              el objetivo de este documento pre-
•    A causa del tamaño, la tabla de páginas no se puede almacenar en registros                               sentar esta solución.

     y hay que almacenarla en la memoria7. Por lo tanto, cada referencia a la                                 (7)La MMU tendrá un registro de
     memoria lógica implicaría dos accesos a la memoria física: uno a la tabla de                             control que indicará a partir de
     páginas y otro a la dirección física calculada. Este sobrecoste es inaceptable,                          qué posición de memoria física se
                                                                                                              encuentra la tabla de páginas del
     por lo que el hardware proporciona la TLB (Translation Lookaside Buffer),                                proceso en ejecución.
     una memoria caché especializada en almacenar las entradas de la tabla de
     páginas más utilizadas recientemente.


Un sistema operativo que utilice la paginación necesitará una serie de estruc-
turas de datos para llevar a cabo la gestión de la memoria. Además de las tablas
de páginas de cada proceso (almacenadas en el espacio de datos del sistema
operativo), será necesaria alguna estructura que indique si los frames de la me-
moria física están libres u ocupados (tabla de frames) y algún procedimiento
para obtener frames libres.

## Página 15

<!-- source-page: 15 -->

GNUFDL • PID_00169383                                                                                  15                                                                                                  La gestión de la memoria

3.1.1.  Ubicación de las regiones de código, datos y pila dentro del
           espacio lógico


En el primer esquema presentado en el apartado 2, ubicábamos las regiones
de código, datos y pila contiguamente dentro del espacio lógico.


Utilizando la paginación, las regiones de código y de datos se ubican típica-
mente en un extremo del espacio lógico, mientras que la de pila se ubica en
el otro; todas las páginas intermedias estarán marcadas como inválidas. Esta
distribución facilitará el hecho de que las regiones de datos y de pila del pro-
ceso puedan crecer dinámicamente.


Utilizando la paginación, este agujero en el espacio lógico no implica un des-
perdicio de memoria física porque todas las páginas lógicas correspondientes
al agujero están marcadas como inválidas, con lo cual no tendrán asociado
ningún frame de memoria física. En cambio, en el esquema presentado en el
apartado 2, esta disposición sí provocaría un desperdicio de memoria física.


    La figura 4 presenta un ejemplo en el que asumimos que el espacio lógico puede llegar a
    tener ocho páginas y el espacio físico tiene dieciséis frames. Cargamos dos ejecutables, el
    primero con dos páginas de código, una de datos y una de pila, y el segundo con tres de
    código, una de datos y una de pila. Ahora bien, el segundo ejecutable está cargado dos
    veces (dos usuarios diferentes están ejecutando este programa) y así demostraremos que
    no hay que duplicar el código en la memoria física.

## Página 16

<!-- source-page: 16 -->

GNUFDL • PID_00169383                                                                                  16                                                                                                  La gestión de la memoria





















































































    Figura 4. Ejemplo de carga de tres procesos en un sistema de gestión de la memoria paginado. Las páginas inválidas se
    han marcado con el símbolo -.

    La figura muestra los espacios lógicos correspondientes a los tres procesos, así como una
    posible carga de los procesos en el espacio físico y las tablas de páginas correspondientes.
    Notad que la paginación permite que los dos procesos compartan las páginas de código.

3.1.2.  ¿Evita la paginación las deficiencias del sistema
            presentado en el apartado 2?


Un mecanismo de gestión de la memoria basado en la paginación permite
solucionar la mayoría de problemas descritos para el sistema anterior:


1) No es necesario que páginas contiguas en el espacio lógico tengan que serlo
también en el espacio físico. Por lo tanto, la paginación no presenta el proble-
ma de la fragmentación externa; cuando se carga un ejecutable en la memo-
ria, es posible utilizar cualquier frame libre de memoria física, independiente-

## Página 17

<!-- source-page: 17 -->

GNUFDL • PID_00169383                                                                                  17                                                                                                  La gestión de la memoria

mente de si es contiguo o no con el resto de frames. En cambio, la paginación
presenta otro problema, ya que la unidad mínima de asignación es la página,
con lo cual las peticiones de memoria de tamaño no múltiple del tamaño de
página provocarán un cierto desperdicio de memoria. Este problema se conoce
como fragmentación interna y es inherente a todos los sistemas de almacena-
miento (ya sea en memoria o en disco) que dividen el espacio en bloques de
un tamaño fijo.


    Fragmentación interna

    El problema de la fragmentación interna también aparece en situaciones cotidianas, co-
    mo las reservas de mesas en los restaurantes. Típicamente, en una mesa no se mezclan
    comensales correspondientes a reservas diferentes (es decir, la mesa es la unidad mínima
    de asignación de espacio). Por lo tanto, aunque el restaurante puede tener sillas libres,
    éstas no se pueden asignar a nuevas reservas si estas sillas libres pertenecen a mesas ya
    asignadas a otras reservas.

2) La paginación permite que el espacio lógico de un proceso pueda crecer
y decrecer. Gracias al agujero producido al ubicar los datos y la pila a cada
extremo del espacio lógico, disponemos de páginas lógicas para poder variar el
tamaño tanto de la región de datos como de la pila sin desperdiciar memoria
física.


3) La paginación permite que diversos procesos compartan frames del espacio
físico. Sólo es necesario que las entradas correspondientes de las tablas de pá-
ginas de los procesos hagan referencia a estos frames compartidos.


En cambio, la paginación no permite cargar procesos que no quepan en el                                    Ved también
espacio físico.
                                                                                                             En el subapartado 3.2, vere-
                                                                                                             mos cómo podemos extender
3.2.  Paginación bajo demanda                                                                                la paginación para poder car-
                                                                                                             gar estos procesos.

Hasta ahora, todos los esquemas que hemos presentado partían de la base de
que, cuando un proceso se ejecuta, es necesario que esté cargado totalmente
en la memoria principal, pero eso no tiene que ser necesariamente así. La me-
moria virtual es un esquema de gestión de la memoria con el que un proce-
so puede estar sólo parcialmente cargado (residente) en la memoria principal.
Con este esquema, la suma de los espacios lógicos de los procesos que se están
ejecutando puede ser mayor que la memoria física disponible.


El esquema también permite ejecutar procesos que tengan un espacio lógico
mayor que el espacio físico, cosa que con los esquemas anteriores era imposi-
ble. Este hecho se consigue manteniendo una imagen del espacio lógico del
proceso en la memoria secundaria (disco) en una zona llamada área de inter-
cambio (swap area). En cada instante, en la memoria principal sólo está carga-
da la parte del proceso que es necesaria para su ejecución, o bien la parte del
proceso que el sistema operativo permite cargar en la memoria. La decisión de
qué parte del proceso se carga en la memoria y cuándo se carga la toma el sis-
tema operativo y lo hace en función de la carga y la disponibilidad del sistema.

## Página 18

<!-- source-page: 18 -->

GNUFDL • PID_00169383                                                                                  18                                                                                                  La gestión de la memoria

La memoria virtual se puede implementar extendiendo la idea de paginación
(figura 5). Esta extensión recibe el nombre de paginación￿bajo￿demanda. Hay
que añadir un bit (bit de presencia) a cada entrada de la tabla de páginas para
indicar si la página en cuestión está cargada o no en la memoria física. En caso
de que no lo esté, se producirá una excepción del tipo "fallo de página" (page
fault) y la rutina de atención tendrá que ir a buscar la página al área de inter-
cambio, cargarla en la memoria principal, hacer que se repita el acceso en la
memoria que ha provocado el fallo y hacer continuar la ejecución del proceso.







































Figura 5. Extensión de la MMU de la figura 3 con el fin de permitir el uso de memoria virtual.

Además, es necesario que el sistema operativo disponga de algún tipo de es-
tructura de datos que indique cómo está distribuido el proceso en el área de
intercambio.


La gestión más habitual es que en un principio no haya ninguna página car-
gada en la memoria física y que las páginas del proceso se carguen a medida
que se van necesitando. Cuando se ejecuta un proceso, cada referencia a la
memoria lógica supone la ejecución de los pasos siguientes:


•    Primero, se comprueba si la página correspondiente a la dirección es válida
     con el bit de validez (v).


•    A continuación, se determina si la página está cargada en la memoria com-
     probando el bit de presencia (p). En caso de que no se encuentre en la me-
     moria, se genera un fallo de página y el sistema operativo tiene que hacer
     las gestiones necesarias con el fin de ir a buscar la página en el área de
     intercambio y cargarla en la memoria principal en un frame libre. La cosa
     se complica todavía más si no queda ningún frame libre, ya que entonces
     el sistema de gestión de la memoria tiene que quitar alguna página de la
     memoria principal y llevarla al disco, siempre que haya modificaciones.
     Además, tiene que actualizar la tabla de páginas del proceso al que perte-
     nece la página que se ha llevado al área de intercambio. Una vez el frame

## Página 19

<!-- source-page: 19 -->

GNUFDL • PID_00169383                                                                                  19                                                                                                  La gestión de la memoria

    ya ha quedado libre, se puede asignar al proceso que se estaba ejecutando,
    actualizando su tabla de páginas.


•    Finalmente, si la página lógica es válida y presente, se genera la dirección
    física.

Los sistemas de memoria virtual tienen que gestionar las páginas de la manera                           (8)En esta asignatura, no entrare-
más eficiente posible a fin de que el tiempo de ejecución de los procesos no                            mos en detalle a considerar estas
                                                                                                        políticas.
sea excesivamente alto a causa de un número muy grande de fallos de página.
Es importante establecer buenas políticas8, como las siguientes:


•  Políticas￿de￿asignación￿de￿páginas: determinan cuántas páginas puede
    tener cargadas un proceso en la memoria física en un momento dado, es
    decir, determina lo que se llama working set.


•  Políticas￿de￿sustitución￿de￿páginas: estas políticas determinan qué frame
    conviene llevar al disco cuando se tiene que llevar una página a la memo-
    ria física y no quedan frames libres. ¿Hay que escoger entre los frames del
    mismo proceso que se está ejecutando? ¿O bien hay que considerar los
    frames de otros procesos? ¿Páginas que sólo se hayan leído? (en este caso
    se tendría que considerar que en cada entrada de la tabla de páginas o de
    la tabla de frames hay un bit que indica que la página se ha modificado).


•  Políticas￿de￿carga￿de￿páginas: determinan cuándo se cargan las páginas
    en la memoria. Existe la posibilidad de cargar páginas sólo cuando hay
    un fallo de página (paginación bajo demanda) o bien se puede intentar
    adelantar la carga de páginas aprovechando la localidad espacial de los
    programas (prefetching).


Consideraciones finales:


•    Este mecanismo es totalmente transparente para el usuario.


•    Se ha comprobado que las referencias a la memoria hechas por un pro-
    grama no se distribuyen uniformemente por todas las páginas del espacio
    lógico. A causa de la localidad espacial y temporal de las referencias a la
    memoria, la mayoría de referencias se concentran en un conjunto reduci-
    do de páginas. Por lo tanto, la paginación bajo demanda no incrementa
    necesariamente el tiempo de ejecución del programa.


•    La memoria virtual permite incrementar el grado de multiprogramación
    porque, como cada proceso necesita menos memoria física, será posible
    cargar más procesos. De todas formas, aumentar excesivamente este grado
    puede afectar al rendimiento del sistema operativo (thrashing).


•    A lo largo de la ejecución de un proceso, una misma página se puede in-
    tercambiar del disco a la memoria y de la memoria al disco varias veces.

## Página 20

<!-- source-page: 20 -->

GNUFDL • PID_00169383                                                                                  20                                                                                                  La gestión de la memoria

       Notad que cada vez que vuelve a la memoria física puede utilizar un frame
       diferente de memoria física (el sistema de gestión permite movilidad).

## Página 21

<!-- source-page: 21 -->

GNUFDL • PID_00169383                                                                                  21                                                                                                  La gestión de la memoria

4.Modificación dinámica del espacio lógico







En tiempo de ejecución, los procesos pueden tener que modificar el tamaño
de su espacio lógico. Ahora bien, la forma de hacerlo depende de la región
(código/datos/pila) de la que se quiera variar el tamaño.

1)￿Región￿de￿código: Existen diversas posibilidades para modificar dinámica-                           (9)En los sistemas Windows, tam-
mente la región de código del espacio lógico de un proceso, como overlays,                             bién reciben el nombre de DLL
                                                                                                       (dynamic-link libraries).
código automodificable o bibliotecas cargadas en tiempo de ejecución9. Salvo
las bibliotecas cargadas en tiempo de ejecución, estas opciones están en desuso
o se utilizan únicamente en escenarios muy concretos. En esta asignatura, no
vamos a considerar ninguna de estas opciones.

2)￿Región￿de￿pila￿de￿ejecución: La pila es transparente para el programador                            (10)El sistema operativo puede limi-
de aplicaciones de alto nivel. Al crear cada proceso, el sistema operativo le                          tar el tamaño máximo que puede
                                                                                                       llegar a alcanzar la pila de ejecu-
asigna un tamaño inicial de pila. Si en algún momento este tamaño resulta                              ción de los procesos.
insuficiente (el proceso ejecuta una instrucción push que intenta escribir más
allá del tamaño asignado a la pila), la MMU generará una excepción. La rutina
de atención a la excepción comprobará si el problema es debido al tamaño de
la pila y, a ser posible10, aumentará el tamaño y permitirá que el proceso repita
la ejecución de la instrucción push y continúe su ejecución. Por lo tanto, el
crecimiento de la región de pila es completamente transparente para el pro-
gramador y tampoco nos ocuparemos de él.


3)￿Región￿de￿datos: el tamaño de la región de datos es responsabilidad del
programador. Éste dispondrá de llamadas al sistema con el fin de poder mo-
dificar dinámicamente esta región del espacio lógico. Eso puede resultar útil
porque el tamaño de algunas estructuras de datos puede depender de un valor
desconocido en tiempo de compilación y que no se conocerá hasta el tiempo
de ejecución del programa. En esta asignatura, nos centraremos en cómo mo-
dificar dinámicamente el tamaño de esta región.


4.1.  Modificación dinámica del tamaño de la región de datos


El sistema operativo acostumbra a ofrecer llamadas al sistema para aumentar
y disminuir la región de datos del espacio lógico del proceso.


En el caso del Unix, ambas tareas se pueden hacer con la llamada al sistema
brk. Desgraciadamente, esta llamada tiene una interfaz poco intuitiva y pre-
senta algunos problemas de portabilidad. Por lo tanto, no es habitual que los
programas utilicen directamente esta llamada al sistema.

## Página 22

<!-- source-page: 22 -->

GNUFDL • PID_00169383                                                                                  22                                                                                                  La gestión de la memoria

La biblioteca del lenguaje C ofrece diversas rutinas para modificar el tamaño
de la región de datos: calloc, malloc, free y realloc. Las rutinas calloc, malloc
y realloc permiten ampliar la región de datos, pero difieren en la interfaz. La
rutina free permite liberar la memoria obtenida previamente con calloc/ma-
lloc/realloc.


Por ejemplo, la interfaz de la rutina malloc es void *malloc(size_t size) y recibe
como parámetro la cantidad de bytes en los que queremos ampliar la región
de datos. Si no es posible realizar esta operación, la rutina devuelve el puntero
NULL; de lo contrario, devuelve la dirección lógica de la memoria correspon-
diente al primer byte que se ha añadido en la región de datos y el resto de
bytes se encuentran en posiciones de memoria consecutivas. La interfaz de la
rutina free es void free(void *ptr) y recibe como parámetro una dirección de
memoria obtenida previamente con calloc/malloc/realloc.


A continuación, mostramos un par de fragmentos de código en los que se
crean dinámicamente un vector (figura 6) y una matriz (figura 7).


    int *vector;

    vector = malloc(N*sizeof(int)); /* Pide espacio para N enteros */
    if (vector == NULL) error("Memoria no disponible");
    for (i=0; i<N; i++)

         vector[i] =. ...; /* Llena el vector */
    ...
    free(vector);    /* Libera el espacio */


Figura 6. Fragmento de código que crea dinámicamente un vector de enteros de N posiciones.


    int **matrix;


    /* Pide espacio para un vector de N punteros, uno para cada fila */
    matrix = malloc(N*sizeof(int *));
    if (matrix == NULL) error("Memoria no disponible");

    for (i=0; i<N; i++) {
       /* Pide espacio para la fila i-ésima (M enteros) */

       matrix[i] = malloc(M*sizeof(int));
       if (matrix[i] == NULL) error("Memoria no disponible");
    }

    for (i=0; i<N; i++)
      for (j=0; j<M; j++)
        matrix[i][j] = ...;  /* Llena la matriz */

    ...
    for (i=0; i<N; i++)
       free(matrix[i]);     /* Libera la fila i-ésima */

    free(matrix);       /* Libera el vector de punteros


Figura 7. Fragmento de código que crea dinámicamente una matriz de enteros de N filas y
M columnas.

## Página 23

<!-- source-page: 23 -->

GNUFDL • PID_00169383                                                                                  23                                                                                                  La gestión de la memoria

5.Errores de programación relacionados con el acceso
    a la memoria







Finalmente, haremos algunas consideraciones sobre los errores de programa-
ción relacionados con el acceso a la memoria, es decir, los errores de progra-
mación que provocan que un proceso acceda a una dirección de memoria a la
que no tendría que acceder. Son especialmente típicos de programas escritos
en lenguaje C o C++. La figura 8 muestra algunos ejemplos de estos errores.


Figura 8. Ejemplo de algunos errores de programación relacionados con el ac-
ceso a la memoria


    int vector[10]; unsigned int n; char s[10]; int *k; char *p;


    /* Error de programación si n >= 10 */
    vector[n] = valor;


    /* Error de programación porque la memoria intermedia s es demasiado pequeña (buffer overflow) */
    sprintf(s, "El valor de vector[3] es %d\n", vector[3]);


    /* Error de programación porque no tiene sentido referenciar variables locales de un
    procedimiento una vez éste ha acabado */

    int *rut()
    {
     int n;

     n = valor;
     return(&n);

    }
    ...
    k = rut();

    n = *k;


    /* Error de programación porque se accede a memoria liberada */

    p = malloc(100);
    ...
    free(p);

    p[4] = valor;


En general, el compilador de lenguaje C no puede detectar estos tipos de erro-
res. Además, pueden ser muy difíciles de localizar por el programador porque:


•    Es posible que, para la mayoría de datos de entrada, estos errores no afecten
    al comportamiento correcto del programa.

## Página 24

<!-- source-page: 24 -->

GNUFDL • PID_00169383                                                                                  24                                                                                                  La gestión de la memoria

•    Pueden manifestarse muchas sentencias más allá de la que ha realizado el
     acceso erróneo.


•    Pueden manifestarse (o no) en función de las versiones del sistema opera-
     tivo/compilador/bibliotecas y demás, así como de los parámetros de com-
     pilación o de los datos de entrada del proceso, entre otros.


En los apartados anteriores, hemos visto que la MMU detecta accesos a la me-
moria inválidos, pero tenemos que tener en cuenta que:

•    La MMU no podrá detectar un error de programación que provoque el ac-                               (11)Esta biblioteca guarda informa-
     ceso a otra dirección válida del proceso. Por lo tanto, el proceso puede leer                       ción en el espacio lógico de cada
                                                                                                         usuario que la utiliza.
     o modificar datos que no tienen nada que ver con la operación que se está
     realizando. Por ejemplo, un acceso a la memoria incorrecto puede estar
     modificando datos de control de la biblioteca de entrada/salida11, cosa que
     puede provocar un error de ejecución la siguiente vez que utilicemos una
     rutina de esta biblioteca.


•    En un sistema basado en la paginación, si el tamaño de las regiones de
     código/datos/pila no es múltiplo del tamaño de página, podemos tener
     páginas marcadas como válidas en las que no todas las direcciones de estas
     páginas son correctas desde el punto de vista del programador. La MMU
     no podrá detectar un acceso incorrecto dentro de esta página.


Los accesos incorrectos pueden producirse en cualquier modo de ejecución
(privilegiado y no privilegiado), pero el tratamiento es diferente.

1)￿Modo￿de￿ejecución￿no￿privilegiado: si la MMU determina que un acceso                                  (12)El usuario puede indicar si quie-
es inválido, la MMU provocará una excepción. La rutina del sistema operativo                             re que se generen estos ficheros y
                                                                                                         qué tamaño máximo pueden te-
que atiende esta excepción hace abortar el proceso. En el caso del Unix, la                              ner.
rutina de atención acostumbra a crear un fichero12 llamado core en el que
se almacena el estado completo del proceso (contenido de los registros y de
la memoria) en el momento que se provoca la excepción. Este fichero se po-
drá examinar posteriormente con el depurador (debugger). Cuando un proceso
creado desde el intérprete de comandos ha sido abortado a causa de un acceso
a memoria inválido, los intérpretes de comandos del Unix suelen mostrar el
mensaje Segmentation fault. Core dumped (error de segmentación).

2)￿Modo￿de￿ejecución￿privilegiado: siempre que alguna llamada al sistema                                 (13)Por ejemplo, si un proceso in-
tiene que acceder a algún rango de direcciones lógicas del proceso13, antes el                           voca la llamada al sistema write
                                                                                                         del Unix, la rutina de atención ten-
sistema operativo comprueba por software que este rango de direcciones sea                               drá que leer datos de un fichero y
                                                                                                         escribirlos en el espacio lógico del
válido para el proceso. El código del sistema operativo accederá a estas direc-                          usuario, en el rango de direcciones
ciones únicamente si la comprobación indica que todo el rango de direcciones                             especificado por una dirección ló-
                                                                                                         gica inicial y un tamaño.
es válido; ahora bien, aunque el rango de direcciones sea válido, no quiere de-
cir que el acceso a la memoria sea correcto desde el punto de vista del progra-
mador. En el caso de que alguna dirección del rango sea inválida, la llamada al

## Página 25

<!-- source-page: 25 -->

GNUFDL • PID_00169383                                                                                  25                                                                                                  La gestión de la memoria

sistema no se realizará y devolverá el código de error adecuado. Si, a pesar de
todo, la MMU detecta un acceso a la memoria inválido en modo de ejecución
privilegiado, por precaución el sistema operativo suele dejar de prestar servicio
y aparece un Kernel panic (Linux) o la Blue screen of death (Windows).


Para ayudar a los programadores a detectar o corregir estos tipos de errores,
existen herramientas como:


•    depuradores (debuggers), que permiten analizar los ficheros core,
•    versiones sofisticadas de las bibliotecas de asignación de memoria diná-
     mica.


Es importante que los programas no presenten estos tipos de errores. Hay que
pensar que una cantidad significativa de ataques a sistemas informáticos apro-
vechan un tipo particular de estos errores (los buffer overflows).

## Página 26

<!-- source-page: 26 -->

GNUFDL • PID_00169383                                                                                  26                                                                                                  La gestión de la memoria

Resumen







En este módulo didáctico, hemos visto la manera como el sistema operativo,
con la ayuda del hardware, puede ofrecer una visión de la memoria idealizada
a los procesos en ejecución. Mientras que la memoria física está limitada y es
compartida por todos los procesos, la visión que tendrá cada proceso es que
dispone de un espacio de direcciones no compartido con ningún otro proceso,
independientemente de la ocupación actual de la memoria física y que puede
tener un tamaño mayor que la memoria física instalada. El sistema operativo
realiza esta tarea de forma transparente para los procesos utilizando mecanis-
mos de traducción dinámicos (en tiempo de ejecución) implementados den-
tro de un hardware especializado llamado MMU (Memory Management Unit).

## Página 27

<!-- source-page: 27 -->

GNUFDL • PID_00169383                                                                                  27                                                                                                  La gestión de la memoria

Actividades

1. Explicad la diferencia que existe entre fragmentación interna y fragmentación externa.

2. Se quiere reducir la fragmentación interna en un sistema de gestión de la memoria basado
en la paginación reduciendo el tamaño de las páginas (por ejemplo, de 4 KB a 1 KB). ¿Qué
impacto tiene esta reducción en el tamaño de la tabla de páginas de los procesos?

3. En la figura 3 no se especifica el número de bits que circula por cada línea del circuito
de traducción. Determinadlo asumiendo que el tamaño de página es de 4 KB, que el bus de
direcciones es de 32 bits y que la cantidad máxima de memoria física instalada es de 2 GB.

4. El operador & del lenguaje C se aplica a una variable y nos devuelve la dirección de me-
moria donde se almacena. ¿Esta dirección es lógica o física?

5. Buscad información sobre la manera como Linux estructura el espacio lógico en los proce-
sadores IA-32 de Intel. ¿Dónde ubica Linux las regiones de código, datos y pila de un proceso?
¿Por qué creéis que, a partir de la dirección lógica 0xC0000000, todos los espacios lógicos
tienen el mismo contenido (código, datos y pila del sistema operativo)? ¿Por qué creéis que
el código del programa no se empieza a cargar a partir de la dirección lógica 0x00000000?

6. Buscad información sobre la estructura de dos niveles de la tabla de páginas aplicada por
los procesadores que implementan la arquitectura IA-32 de Intel.

7. Buscad información sobre cuáles son los bits de control presentes en las entradas de las
tablas de página de los procesadores que implementan la arquitectura IA-32 de Intel.

8. En un sistema paginado con memoria virtual queremos controlar mediante un bit (dirty
bit) si una página ha sido modificada. ¿En qué tabla situaríais este bit: en la tabla de páginas
del proceso, en la tabla de frames o en la tabla de páginas del disco?

9. ¿En un sistema paginado podemos afirmar que la MMU detectará todos los accesos a la
memoria en una posición de memoria incorrecta (por ejemplo, un acceso más allá del tamaño
de un vector)?

10. Buscad información sobre los stack overflows. ¿En qué consisten? ¿Por qué son peligrosos?
Buscad información sobre el Execute-Disable (NX) bit que algunos procesadores Intel incor-
poran en la tabla de páginas.


Ejercicios de autoevaluación

1. Disponemos de una máquina con un espacio lógico de procesador de 1.024 Kbytes y una                                   Nota
memoria física instalada de 128 Kbytes. El sistema de gestión de la memoria del sistema
operativo instalado en esta máquina se basa en la técnica de la paginación bajo demanda, en
la que las páginas tienen un tamaño de 2 Kbytes. Inicialmente, el proceso no tiene ninguna                                 Por espacio lógico de procesador
página cargada en la memoria. Suponemos que en una página sólo habrá o bien código, o                                      entendemos el tamaño máxi-
bien datos del proceso, o bien la pila de ejecución del proceso.                                                           mo que puede llegar a tener el
                                                                                                                           espacio lógico de un proceso.
En esta máquina queremos ejecutar un programa. La cabecera del ejecutable de este programa
nos indica que el código del programa ocupa 10 Kbytes, que tenemos 6 Kbytes de datos
inicializados, que los datos no inicializados ocuparán 15 Kbytes y que la pila tiene 12 Kbytes.
La cabecera del ejecutable ocupa 128 bytes. Con esta información, contestad a las preguntas
siguientes:

a) ¿Podéis decir aproximadamente el tamaño que tendrá el fichero ejecutable del programa
que hemos descrito? Si el tamaño de las páginas de la memoria fuera de 1 Kbyte, ¿cuál sería
el tamaño del fichero ejecutable?

b) Una vez cargado este programa y creado el espacio lógico del proceso correspondiente y
suponiendo que todas las páginas que ocupa el proceso estuvieran presentes en la memoria
física, ¿cuál sería la cantidad de memoria física que ocuparía nuestro proceso? Responded a
la misma pregunta considerando que las páginas fueran de 1 Kbyte.

c) ¿Cuál es la fragmentación interna que produciría este proceso en caso de que las páginas
fueran de 2 Kbytes? ¿Y si fueran de 1 Kbyte?

d) ¿Qué efecto tendría un cambio en la cantidad de memoria física instalada que tiene esta
máquina sobre los espacios de direcciones siguientes: fichero ejecutable, espacio lógico del
procesador y espacio lógico del proceso?

## Página 28

<!-- source-page: 28 -->

GNUFDL • PID_00169383                                                                                  28                                                                                                  La gestión de la memoria

2. Suponemos que una máquina tiene un sistema de gestión de la memoria en el que la
traducción de direcciones se efectúa dinámicamente (en ejecución) y que ofrece memoria
virtual. Contestad a las preguntas siguientes justificando brevemente vuestra respuesta.

a) ¿Puede ser mayor el tamaño del espacio lógico de un proceso que la cantidad total de la
memoria física instalada en la máquina?

b) ¿Qué efecto tendría un aumento de la cantidad de memoria física instalada sobre el tamaño
del espacio lógico del procesador?

c) ¿Es posible que la misma dirección lógica de dos procesos diferentes sea traducida en la
misma dirección física en un mismo momento?

d) ¿Es posible que una dirección lógica de un programa en ejecución sea traducida en direc-
ciones físicas diferentes en diferentes instantes de la misma ejecución?

e) ¿Es necesario que la pila de ejecución de un proceso se almacene en direcciones lógicas
consecutivas? ¿Y en direcciones físicas consecutivas?

f) Compilamos un mismo programa de dos maneras diferentes; en la primera, indicamos que
el tamaño inicial de la pila será de 10 K y en la segunda indicamos que será de 20 K. ¿Cuál
creéis que será la diferencia de tamaño entre los dos ficheros ejecutables generados?

g) ¿Permite ampliar el grado de multiprogramación el hecho de disponer de la memoria
virtual?

3. Contestad a las preguntas siguientes:

a) ¿Puede el espacio lógico del procesador ser mayor que la suma de los tamaños de la me-
moria física instalada y del dispositivo de almacenamiento (área de intercambio) de páginas
sacadas de la memoria física?

b) ¿Puede el espacio lógico del proceso ser mayor que la suma de los tamaños de la memoria
física instalada y del tamaño del dispositivo de almacenamiento (disco) de páginas sacadas
de la memoria física?

c) ¿Tiene cualquier proceso de usuario partes de su espacio lógico de proceso que tienen que
encontrarse permanentemente en la memoria física durante la ejecución del proceso?

d) Si durante la ejecución concurrente de dos procesos ambos intentan acceder a la misma
dirección lógica, ¿quiere decir que están compartiendo la memoria?

## Página 29

<!-- source-page: 29 -->

GNUFDL • PID_00169383                                                                                  29                                                                                                  La gestión de la memoria

Solucionario

Ejercicios de autoevaluación

1.a) Un ejecutable está formado por el código y los datos inicializados. La pila y los datos
no inicializados se crean en tiempo de ejecución. Así pues, el tamaño del ejecutable es igual
al tamaño de la cabecera + el tamaño del código + el tamaño de los datos inicializados (128
bytes + 10 Kbytes + 6 Kbytes). En el caso de páginas de memoria de 1 Kbyte, el tamaño del
ejecutable sería el mismo porque es independiente del tamaño de la página.

b) Con páginas de 2 Kbytes, el tamaño de la memoria física ocupado sería igual en 22 páginas
(44 Kbytes) y, con páginas de 1 Kbyte, el tamaño sería igual a 43 páginas (43 Kbytes).

c) Con páginas de 2 Kbytes, tendríamos una fragmentación interna de 1 Kbyte y con páginas
de 1 Kbyte no habría fragmentación interna.

d) No les afectaría de ningún modo.

2.a) Sí, ya que el sistema de gestión de la memoria permite ejecutar procesos sin que todo el
espacio lógico esté en la memoria física simultáneamente.

b) Ninguno, ya que el espacio lógico del procesador está determinado por los bits de dirección
de memoria de los que dispone el procesador.

c) Sí, en el caso de que los dos procesos estén compartiendo código o datos.

d) Sí, ya que el sistema de gestión permite que una página se pueda mover dentro de la
memoria física.

e) Es necesario que se encuentre en direcciones lógicas consecutivas, pero no hace falta que
esté en direcciones físicas consecutivas.

f) Los ejecutables tendrán el mismo tamaño, ya que en el ejecutable se guarda información
del tamaño inicial de la pila, pero no se reserva espacio.

g) Sí, ya que en un sistema no entero no hay que tener todo el espacio lógico de los procesos
simultáneamente en la memoria física y, por lo tanto, permite que entren más.

3.a) Puede ser mayor porque el espacio lógico del procesador sólo depende del número de
bits que tiene el bus de direcciones del procesador.

b) El espacio lógico de un proceso no puede ser mayor que la suma de los tamaños de estas
dos zonas.

c) Un sistema de gestión de la memoria que sea no entero permite que todo el espacio lógico
de un proceso (código, datos y pila) esté en el disco durante la ejecución. A medida que se
van referenciando páginas, la rutina de atención en el fallo de página ya las irá llevando del
disco a la memoria física. Las estructuras de datos del sistema operativo (tablas de páginas y
otras informaciones relativas al proceso) no forman parte del espacio lógico de proceso.

d) No necesariamente, porque procesos diferentes tienen programaciones de gestores de la
memoria diferentes; por lo tanto, los dos pueden generar la misma dirección lógica, pero la
traducción dinámica puede hacer que esta dirección lógica vaya a parar a direcciones físicas
diferentes.

## Página 30

<!-- source-page: 30 -->

GNUFDL • PID_00169383                                                                                  30                                                                                                  La gestión de la memoria

Glosario

bit de presencia  m  Bit utilizado en los sistemas de gestión de la memoria virtual para
indicar si el fragmento del espacio lógico del proceso al que se hace referencia está cargado
en la memoria.

bit de validez  m  Bit utilizado en los sistemas de gestión de la memoria para indicar si el
fragmento del espacio lógico al que se hace referencia pertenece al espacio lógico del proceso.

fallo de página  f  Excepción generada por la MMU en un sistema de gestión de la memoria
que ofrece memoria virtual cuando el procesador genera una dirección lógica que se traduce
en una página válida, pero que no está cargada (no está presente) en la memoria física.

fragmentación externa  f  Espacios de memoria no utilizables que se crean en sistemas
de gestión de la memoria en los que los procesos se cargan en posiciones de la memoria
física contiguas. Tiene lugar cuando no hay un espacio de memoria contiguo libre lo bastante
grande para cargar un proceso, aunque haya trozos libres más pequeños cuya suma de las
capacidades sería suficiente para cargarlo.

fragmentación interna  f  Espacios de memoria no utilizables que se crean cuando la
memoria se divide en partes de tamaño fijo (por ejemplo, frames de memoria principal o
bloques de disco) y una de estas partes se asigna a un conjunto de datos más pequeño que
la capacidad de la parte en cuestión.

hiperpaginación  m  Situación que se da cuando la memoria disponible en un momento
dado para la ejecución de un proceso es inferior a la mínima necesaria (working set) para su
ejecución, lo que provoca una elevada actividad de intercambio. Un sistema se encuentra
en thrashing si se pasa más tiempo intercambiando páginas que ejecutando código de las
aplicaciones. Una causa habitual es que el grado de multiprogramación es excesivamente
elevado para la configuración del hardware.
en thrashing

intercambio  m  Acción de llevar páginas de un proceso de la memoria secundaria (disco)
a la memoria principal o swap in. El proceso inverso, es decir, el hecho de llevar páginas de
un proceso desde la memoria principal hasta la secundaria, se llama swap out.
en swapping

memoria virtual  f  Sistema de gestión de la memoria que permite ejecutar un proceso
a pesar de tener sólo parte del proceso cargada en la memoria. Mediante técnicas como la
paginación bajo demanda, el sistema irá cargando otras partes del proceso a medida que se
necesiten.

paginación  f  Sistema de gestión de la memoria que divide el espacio lógico y el espacio
físico en bloques de tamaño fijo y asigna a cada bloque del espacio lógico (página) un bloque
del espacio físico (frame).

## Página 31

<!-- source-page: 31 -->

GNUFDL • PID_00169383                                                                                  31                                                                                                  La gestión de la memoria

Bibliografía

Silberschatz, A.; Galvin; Gagne, G. (2008). Operating Systems Concepts (8.ª ed.). John
Wiley & Sons.

Tanembaum, A. (2009). Modern Operating Systems. Prentice-Hall.

## Página 32

<!-- source-page: 32 -->
