[003] sistemas operativos - gestion de memoria

78
$SXQWHVGH62, *HVWLyQGH0HPRULD Para ejecutar un proceso, éste debe encontrarse en memoria principal. Como hemos visto en el capítulo anterior, para mejorar el aprovechamiento de la CPU, ésta se reparte entre varios procesos, por lo tanto, también habrá que repartir la memoria principal. A la parte del sistema operativo que se ocupa de gestionar la memoria se le denomina Gestor de Memoria. Su cometido consiste en llevar la cuenta de las partes de memoria que se están utilizando y las que están libres, así como de gestionar el trasvase de información entre la memoria principal y la secundaria cuando la memoria RAM no sea suficientemente grande para acoger a todos los procesos. En este capítulo trataremos los distintos enfoques que hay en la gestión de memoria. Los algoritmos varían desde el correspondiente a una simple máquina desnuda, hasta las estrategias de paginación y segmentación.

Upload: gust-alva

Post on 12-Jun-2015

14.138 views

Category:

Documents


2 download

DESCRIPTION

El Gestor de Memoria en el SO, lleva la cuenta de las partes de memoria que se están utilizando y las que están libres.

TRANSCRIPT

Page 1: [003] Sistemas Operativos - Gestion de Memoria

�������������� ���

������������� ����

Para ejecutar un proceso, éste debe encontrarse en memoria principal. Comohemos visto en el capítulo anterior, para mejorar el aprovechamiento de la CPU,ésta se reparte entre varios procesos, por lo tanto, también habrá que repartir lamemoria principal.

A la parte del sistema operativo que se ocupa de gestionar la memoria se ledenomina Gestor de Memoria. Su cometido consiste en llevar la cuenta de laspartes de memoria que se están utilizando y las que están libres, así como degestionar el trasvase de información entre la memoria principal y la secundariacuando la memoria RAM no sea suficientemente grande para acoger a todos losprocesos.

En este capítulo trataremos los distintos enfoques que hay en la gestión dememoria. Los algoritmos varían desde el correspondiente a una simple máquinadesnuda, hasta las estrategias de paginación y segmentación.

Page 2: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��� ��������������

������������������������En la evolución de la arquitectura de ordenadores, la cantidad de memoria principalha ido creciendo. Pero el tamaño de los programas crece aún más rápido que lamemoria disponible. El primer intento para resolver el problema de la limitación dememoria fue la utilización de una técnica denominada �������� (solapamientos). Unprograma con solapamientos se dividía en varias partes. Una de estas partessiempre estaba presente en memoria principal y controlaba la carga sucesiva de lasdemás partes (��������) desde la memoria secundaria a la principal. Estas otraspartes se cargaban en memoria de tal forma que ocupaban la misma región dememoria en la que había residido otra parte previamente utilizada, sobreescribiendoasí (solapando) a la parte anterior. Los programadores pasaron mucho tiempodividiendo un programa en trozos, en lugar de concentrarse simplemente en laescritura del programa. Posteriormente, la necesidad de repartir la memoria entrevarios usuarios redujo la cantidad de memoria para cada uno, e hizo necesaria laintroducción de algún mecanismo de protección para aislar entre sí las actividadesde los programas.

Así, tenemos que en la gestión de memoria se deben perseguir los siguientesobjetivos:

• ����������Si varios procesos comparten la memoria principal, se debe asegurar queninguno de ellos pueda modificar posiciones de memoria de otro proceso.Aunque la escritura de memoria tiene efectos más desastrosos, la lectura dememoria ajena tampoco debe estar permitida, pues cada proceso debe mantenersu privacidad. Ya que muchos lenguajes de programación disponen de punterosdinámicos e indexación de vectores o matrices, las comprobaciones en tiempo decompilación no son suficientes y se requiere que el sistema de gestión dememoria realice chequeos adicionales durante la ejecución. Debe disponerse deun sistema de permisos de acceso que especifique los derechos que tiene cadaproceso en el acceso a zonas de memoria de otros procesos.

• ��������������El compartimiento de la memoria parece estar en contradicción con la protección,pero es que a menudo también es necesario que varios procesos puedancompartir y actualizar estructuras de datos comunes, por ejemplo, en un sistemade bases de datos. En otras ocasiones, lo que se requiere es compartir zonas decódigo, por ejemplo, en rutinas de biblioteca, para no tener en memoria distintascopias de la misma rutina. En este caso, se hace necesaria alguna protecciónpara que un proceso no modifique inadvertidamente el código de las rutinas.

• �����������La multiprogramación requiere que varios procesos residan simultáneamente enmemoria. Lo que no se puede saber antes de llevarlo a memoria es la direcciónabsoluta en la que se va a cargar el proceso, por lo que no es práctico utilizardirecciones absolutas en el programa. En su lugar, es preferible realizardireccionamientos relativos para permitir que un programa pueda ser cargado yejecutado en cualquier parte de la memoria.

Page 3: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���

• ������ ��������!���������La memoria se debe organizar tanto física como lógicamente.

Debido al coste de la rápida memoria RAM, normalmente se necesita ampliarlacon memoria secundaria más barata (y más lenta), utilizando para ellodispositivos tales como discos o cintas magnéticas. Por el contrario, tambiénpuede resultar conveniente añadir memoria de acceso más rápido que la RAMprincipal, como es el caso de la memoria caché, en la que se mantienen los datosde acceso más frecuente. Esta jerarquía física de memorias hace necesario unsistema que controle el flujo de información entre los distintos dispositivos dealmacenamiento. Esta tarea la realizaba el programador utilizando ��������, peroconsume una gran cantidad de tiempo y, debido a la reubicación dinámica, elprogramador no siempre sabe la cantidad y lugar de la memoria que se va anecesitar. Por esto, parece conveniente que sea el gestor de memoria el que seocupe de esta labor.

Aunque la mayoría de las memorias están organizadas como un único espaciolineal de direcciones secuenciales, que van desde 0 hasta un máximo, esto norefleja la estructura lógica de los programas, que utilizan estructuras lógicas deinstrucciones y datos, tales como módulos, rutinas o procedimientos, matrices,registros, etc. Si una gestión de memoria pudiera proporcionar varios espacios dedirecciones, cada estructura lógica podría ser una entidad independiente: un��������. Esto sería ventajoso por varias razones, pues los segmentos puedencompilarse y cargarse de forma independiente, teniendo cada uno de ellos suspropios derechos de acceso (lectura, escritura, ejecución). Un sistema simple desegmentación puede constar de sólo dos segmentos: uno para código (conpermiso de ejecución) y otro para datos (con permiso de lectura y escritura). Unasegmentación más sofisticada podría utilizar un segmento para cada estructuralógica.

Los sistemas de gestión de memoria pueden dividirse en dos clases: los quemueven los procesos entre memoria principal y secundaria (intercambio ypaginación), y los que no lo hacen. Tanto el intercambio como la paginación sonmecanismos originados por la insuficiencia de memoria principal para contenertodos los procesos en memoria simultáneamente. A medida que la memoria se vayahaciendo más barata, puede que los argumentos en favor de unos u otros tipos degestión vayan cambiando, aunque teniendo en cuenta la ley de Parkinson: “Losprogramas tienden a expandirse hasta llenar la memoria que los contiene”, parecedifícil que puedan cambiar radicalmente.

Pasemos a ver, en los siguientes apartados, las distintas técnicas de gestión dememoria.

Page 4: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

������������� ����������������������������������

�������������������������

��������������������

�������������������������������

�����������������������������������

�� ! "#$$�%&�� ����������'���

��$ � '!"���#&" ��������(������

��!#)*�$'$�%&�����������������������������

�� !�'&�+'$�%&�,#��'��#� !�' -./��� 0������/��

-���������������

� �$��� �&�#�������������� $������������

����������������

���������������������� ��������.���

�����������1������ ��������2�������

���������2�����

����������������������

Page 5: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��#

�������������� ������������ ���En los sistemas de gestión de memoria sin intercambio, la idea básica consiste encargar el programa a ejecutar en algún lugar de la memoria principal, dondepermanece hasta que finaliza su ejecución, momento en el que abandona el espaciode memoria utilizado.

Veamos a continuación las técnicas más habituales para los diferentes modelos deprogramación sin intercambio de memoria.

������ ��������� ����El esquema de memoria más simple consiste en mantener la memoria ocupada conun único proceso. Cuando se carga un programa que se hace cargo de toda lamemoria y del control completo de la máquina, se dice que el programa se cargasobre una �$%����������, es decir, una máquina en la que solamente se ofreceel hardware puro, sin ninguna ayuda software que lo recubra. Las máquinasdesnudas se utilizaron de forma general hasta principios de los años 60, yactualmente se suelen utilizar en sistemas empotrados de control.

Más tarde, a las máquinas desnudas se les añadió una especie de sistemaoperativo muy rudimentario al que se le denominó �������. Las funciones queofrecía el monitor eran las estrictamente necesarias para cargar un programa enmemoria y controlar su ejecución, todo de forma muy manual y con una completasupervisión del usuario.

La técnica actual más utilizada en los pequeños ordenadores es la que se muestraen la parte inferior de la Figura 3. La memoria está ocupada por el sistemaoperativo, que suele estar en RAM, y por el cargador inicial del sistema operativo(IPL) y los ����� de dispositivos, que suelen estar en memoria ROM. El resto de lamemoria RAM queda disponible como área de usuario.

Cuando el sistema está organizado de esta manera (por ejemplo MS-DOS), sólo seejecuta un proceso a la vez. El usuario teclea un comando en el terminal, y elsistema operativo carga el programa correspondiente de disco a memoria principal ylo ejecuta. Cuando el programa termina, el sistema queda a la espera de que elusuario escriba otro comando, para cargar otro programa en la misma zona dememoria que el anterior.

������ ����������� ���������������������Ya que, en general, es deseable que haya varios procesos de usuario residiendo enmemoria al mismo tiempo, se hace necesario considerar el problema de cómoasignar memoria disponible a varios de los procesos que están en la cola de esperapara ser traídos a memoria principal. Lo más inmediato y simple es dividir la

Page 6: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��& ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

�����������������������������

&������������������������������������������������������

�� �&� � �!� ���!�'���'�$���%�&

)��)����� 3 )�� ����� 3 �������� ����4��

���5�����,������

��$���������� ��������!��������������6�5���������������������������7

#��������������������������������������������������������

�����������������8

������� �������8

$������������

!'�

����������������

������

����������������

�1� 1

� ��8�������� ! �

!'�

Page 7: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��'

memoria en � particiones (posiblemente de distinto tamaño), de tal forma que encada partición se mete un proceso, donde permanece hasta que finaliza suejecución. Una vez terminado el proceso, la partición queda libre para acoger a unnuevo trabajo.

Con la llegada de la multiprogramación y este esquema de memoria aparecenalgunos problemas y cuestiones que deben solventarse, como la planificación deprocesos a largo plazo, la determinación del número y tamaño de las particiones, laubicación de los programas y la protección de las particiones de memoria.

• �!���(�������Un esquema posible para la planificación de procesos a largo plazo, o sea, paraseleccionar los procesos que van cargarse en memoria para ser ejecutados,puede consistir en que cada una de las particiones tenga una cola asociada, detal manera que en cada una de ellas se van encolando los trabajos o procesosdependiendo del espacio de memoria requerido.

Cuando hay que cargar un trabajo, se le pone en la cola de entrada de la particiónmás pequeña en la que quepa. Ya que en este esquema las particiones son detamaño fijo preestablecido, cualquier espacio de una partición no utilizado por elproceso cargado, se desaprovecha.

La desventaja de meter en colas los trabajos según su tamaño se hace patentecuando la cola de una partición grande está vacía, pero la cola de una particiónpequeña tiene muchos trabajos. Una solución consiste en tener una única cola(Ver la Figura 4-inferior). Cuando una partición se queda libre, el primer trabajo dela cola que quepa en esa partición, se carga en ella y se ejecuta. Ya que no esdeseable malgastar una partición grande con un trabajo pequeño, una alternativapuede ser el recorrer la cola entera y elegir el trabajo más grande que se puedacargar en la partición que acaba de quedar libre. No obstante, esto supone unadiscriminación de los trabajos con pocos requisitos de memoria, que no sonmerecedores de tener una partición grande, mientras que normalmente a lostrabajos pequeños se les suele dar el mejor servicio, no el peor.

Para solucionarlo, se suele disponer siempre de alguna partición de poco tamaño,para permitir que los pequeños trabajos también se ejecuten sin necesidad deasignarles grandes particiones de memoria. No obstante, debe tenerse en cuentaque un proceso que requiera poca memoria y mucha CPU puede entonces formaruna larga cola de espera por su partición.

• )���*����!��������������El tamaño de cada una de las particiones lo puede establecer el operador en elmomento de arranque del sistema o figurar en algún fichero de configuración delsistema.

Como se puede ver, el grado de multiprogramación está directamente ligado alnúmero de particiones del sistema. A más particiones, más procesos cargados y,

Page 8: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

������������ ��������1���� ��������.���

!�������9���������������������������5������������������

������������������������������

�1� 1

�������������������������������������������

�� ���(��������������

��"���4��������������

��!������

�� ������

:�;�

<�;�

=:�;�

!'�

Page 9: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��,

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

��������.��� ���(������� ���������9�������$��������#������

��)���>���$�������#������

�1� 1

:�;�

<�;�

=:�;�? @=:==A

B @<CD

: @:=:

#�� ���������������$�����2�/���E�F

�1� 1

:�;�

<�;�

=:�;�

D @:CA=

Page 10: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���- ��������������

por lo tanto, mayor aprovechamiento de la CPU. Así, cuanta más memoria sedesperdicie, menos procesos se podrán tener en memoria.

Para lograr el mayor aprovechamiento de la memoria los procesos deberíancargarse en particiones cuyo tamaño se ajuste lo más posible (por exceso) al delproceso. Por una parte tenemos que si dividimos la memoria del sistema enmuchas particiones pequeñas, puede dar lugar a que algunos programas grandesno puedan cargarse en memoria aunque haya suficiente memoria disponible, siésta no se encuentra adyacente en una única partición, dando lugar, en estecaso, a una (������������� �.����� de la memoria. Si por el contrario, sedispone de unas pocas particiones grandes, los programas pequeñosdesaprovecharán la memoria sobrante de la partición que ocupen, lo que da lugara una (���������������������.

Los tamaños de las particiones suelen establecerse después de un estudio sobrelos tamaños habituales de los programas que se ejecutan en cada máquina.

6 LV W H P D V �2 S H U D W L Y R V � , * H V W L y Q �G H �0 H P R U L D � � ��

3 D U W L F L R Q H V �) L M D V " � � � 4 � �� � � � � � � � � � �

G $ � 5 � � � � � � � � � � � � H

G , � � � � I �" � � � 4 � H

1 LY H O � G HP X O W LS U R J U D P D F Ly Q

$ S U R Y H F K D P LH Q W RG H � O D � & 3 8

$ �P D \ R U � Q ~ P H U R �G HS U R F H V R V � H Q �P H P R U L D

0 D \ R U � Q L Y H O � G HP X O W LS U R J U D P D F Ly Q

$ �P i V �P H P R U L DG H V S H U G LF L D G D

0 H Q R V � S U R F H V R VH Q �P H P R U L D

1 R U P D OP H Q W H

3 D U W LF L y Q � 3 H T X H x D ) U D J P H Q W D F L y Q �( [ W H U Q D

3 D U W L F L y Q �* U D Q G H ) U D J P H Q W D F L y Q � , Q W H U Q D

( O � W D P D x R �G H � O D V � S D U W L F L R Q H V � G H S H Q G HG H � O R V � U H T X L V L W R V � G H � O R V � S U R J U D P D V � K D E L W X D OH V�

Page 11: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

• �����������������������Cuando se monta o enlaza un programa compuesto por diferentes módulos,todos ellos se combinan en un único módulo cargable, en el que las referencias asus objetos locales (rutinas o datos) son direcciones que van desde cero hasta lacorrespondiente al tamaño del módulo. Así, si el módulo se carga en la direccióncero de memoria principal, se ejecutará correctamente, pero no si se carga encualquier otra dirección. Según esto, habría que decirle al montador en quédirección se va a cargar ese programa. Pero observando cualquiera de losesquemas de la Figura 7, se puede ver que cada proceso se puede cargar encualquier dirección de memoria, y no hay forma de conocerla hasta llegar elmomento de su ejecución.

Supongamos que la primera instrucción de un programa es una llamada a unprocedimiento en la dirección 100 dentro del fichero binario producido por elmontador. Si este programa se carga en la partición 1, esa instrucción saltará a ladirección absoluta 100, la cual, muy posiblemente, corresponderá a un área delsistema operativo. Lo que se necesita es que la instrucción salte a la direcciónBase_Partición + 100. Así, siempre se realizará la llamada correcta,independientemente de la partición en la que se cargue el programa.

Una posible solución consiste en modificar las direcciones del programa a medidaque se carga en memoria. O sea, que a los programas que se carguen en lapartición 1 se les añadirá Base_Partición_1 a todas las direcciones a las quehaga referencia, Base_Partición_2 a los que se carguen en la partición 2, etc.;siendo la base de la partición, su dirección de comienzo. Para realizar esto, elmontador debe incluir en el módulo cargable una lista con las direccionesrelativas del programa en las que hay bytes o palabras cuyo contenido sonreferencias a memoria, de tal forma que puedan ser reubicadas en la carga.

Con esta solución se consiguen programas� ���$��������� ��������!��(reubicables en tiempo de carga), pero tienen una pega:

“No permite que un programa cargado en una partición pueda moversea otra distinta antes de finalizar su ejecución, lo cual resulta de granutilidad, como veremos posteriormente.”

Este problema se solventan con un poco de ayuda del hardware, tal como sedescribe en la parte superior de la Figura 7. Consiste en equipar al procesadorcon un nuevo registro: el ���������/���. Cuando un proceso es seleccionadopara pasar a ejecución, el registro base se carga con la dirección de la particiónque contiene al proceso en cuestión. Una vez que el proceso está en ejecución, acada referencia a memoria se le añade automáticamente el contenido del registrobase, generando así la dirección definitiva, sin necesidad de modificar elcontenido del módulo ejecutable, ni en la carga ni durante la ejecución. A estesistema en el que ya sí se permite ejecutar programas en cualquier partición dememoria e incluso cambiarlos de partición durante su ejecución, se le conocecomo sistema de ��������������$����.

Page 12: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���� ��������������

Solucionado el asunto de la reubicación, debemos afrontar un último problema, puesel sistema de gestión de memoria que hemos visto hasta ahora no asegura que unprograma no pueda construir una instrucción en la que referencie cualquier direcciónde memoria y acceda ilegalmente a datos de áreas no autorizadas. Esto se resuelvecon un “sistema de protección”.

• ����������El sistema de protección se encarga de evitar el acceso indiscriminado acualquier área de memoria. A partir del sistema de reubicación dinámica resultafácil limitar las referencias a memoria que puedan hacerse desde un programa.Para ello añadimos un registro más al procesador: el ���������01����.

En la parte inferior de la Figura 7 vemos que para evitar un acceso indiscriminadoo por error a cualquier dirección de memoria, lo que se hace es cargar el registrolímite al mismo tiempo que el registro base. El registro límite expresa el tamañodel programa en ejecución. Cada dirección virtual (relativa) a la que se hacereferencia en el proceso se compara con el valor del registro límite, de tal formaque si tal dirección es menor que el registro límite, quiere decir que hacereferencia a una posición dentro del programa, por lo que simplemente hay queañadirle el contenido del registro base para obtener la dirección efectiva.(También puede realizarse la comprobación del registro límite paralelamente a lasuma del registro base). Si por el contrario, la dirección virtual excede al valor delregistro límite, indica que se intenta un acceso a una posición de memoria fueradel área ocupada por el programa, en cuyo caso habrá que generar lacorrespondiente excepción de ����� � ������������� para darle el tratamientopertinente.

El tamaño que ocupa un proceso suele venir indicado en el módulo cargable, ypuede guardarse en el BCP de cada proceso.

El uso de las particiones fijas es prácticamente nulo hoy día. Como ejemplo de unsistema operativo con esta gestión de memoria tenemos al antiguo OS/MFT,utilizado por los grandes ordenadores de IBM.

Page 13: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

��������.��� !��������� ��������!�#�)�*���$�'�$���%�&

�� �!� �"�#�$�$���%�&

����������������������������������������������������������������J�1

#! �111�������������������������������������������������������������������1

� �)$� &#������(������������������������������

��!����������!�������6��������������7����������6�����������������5��7

,�12�����

!���������!������

,����!���8

6000

5166

4418

4200

2854

512

0

A

B

C

A

B

C

1345

0

747

0

2341

0

#����2�����

#����!���

!��K�:?DB!��K�BB=?!�K�D=:

!�������/���

!������*���

,����2����� 82

#!! !��������������E F

!'�

Page 14: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���" ��������������

���������� ������� ����En un sistema batch, la organización de la memoria en particiones fijas resultasimple y efectiva. Siempre que se puedan mantener en memoria suficientes trabajoscomo para mantener la CPU ocupada, no hay razón para complicar la organización.En cambio, en un sistema de tiempo compartido la situación es diferente, puesnormalmente hay más usuarios que memoria para contener sus procesos, por loque se hace necesario llevar a disco los procesos en exceso. En cualquier caso,debe quedar claro que para que pase a ejecución alguno de estos procesos que sehan llevado a disco, antes hay que traerlo a memoria. Cuando al proceso enejecución se le acabe su porción de tiempo, es posible que se le vuelva a llevar amemoria secundaria para dejar espacio al proceso que haya seleccionado elplanificador. Al trasiego de procesos que se llevan de memoria a disco y de disco amemoria se le denomina ����������� (�������).

El intercambio de memoria requiere un dispositivo de memoria secundaria.Normalmente, éste suele ser un disco rápido, debe tener suficiente capacidad paraacoger las copias de todas las imágenes de memoria de todos los procesos y debeproporcionar un acceso rápido y directo a estas imágenes. El área del disco quecontiene este espacio de memoria virtual con el que se realiza el intercambio desdememoria principal, recibe el nombre de $����������������� o área de �������.

En la cola de Preparados se mantienen todos BCP’s de los procesos dispuestos aejecutarse (cuyas imágenes de memoria se encuentran en memoria principal osecundaria). Cuando el planificador elige un proceso para pasar a ejecución, llamaal dispatcher, el cual, a su vez, comprueba si el proceso seleccionado se encuentraen memoria principal o no. Si no lo está y no hay memoria libre, el �������� saca aun proceso de memoria a disco y trae a memoria el proceso seleccionado.Seguidamente realiza el cambio de contexto.

Está claro que el tiempo de cambio de contexto en un sistema con intercambio esbastante alto. Para obtener un buen aprovechamiento de la CPU, la porción detiempo de los procesos deberá ser alto en comparación con el tiempo dedicado alcambio completo de proceso, es decir, incluyendo el tiempo de intercambio. Peropor otra parte, tenemos que en un sistema de tiempo compartido si la porción detiempo es muy alta, el tiempo de espera de los procesos preparados sube mucho, locual no es en absoluto deseable. Por lo tanto, lo que se debe conseguir es minimizarlo más posible el tiempo de intercambio. Para ello hay dos estrategias claras:

• Utilizar una memoria secundaria muy rápida.• Intercambiar solamente la memoria necesaria.

La necesidad del primero de estos puntos es obvia. El segundo quiere decir que sien un sistema hay un área de usuario de 900 Kbytes, por ejemplo, y hay que sacarun proceso que ocupa 100 Kbytes, no hay por qué mover a disco un área de 900Kbytes, sino solamente los 100 Kbytes ocupados, ya que el tiempo de intercambioes prácticamente proporcional al tiempo de transferencia, que a su vez esproporcional al tamaño del bloque que se lee o escribe en el disco. Esto obliga a

Page 15: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���#

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

����������������������

"����$��������

���������������������������������������������

�������������5��������������������������������������������

E�����������������������������F

'������������������������������111����������������������������������������������������������

� ��������������������

�������J�����(�����������$ )

"���������LL� ��������"����

�����������������������

"������������������������������������

������������������������������ !

��)��J����������������������������5���

��)��J�����������������������������

$������������������������������������������

G2������������������������HE 0 F���������������������������������������#M�

� �)$�%&&�������������������������������

!���J���#M����������((���������1 1

Page 16: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���& ��������������

que el sistema operativo conozca la ocupación de memoria de cada proceso y a quelleve la cuenta de cada petición o devolución de memoria.

Cuando un proceso es sacado a disco, y posteriormente se le vuelve a traer amemoria principal, es posible que no se le instale en la misma partición de memoriaque ocupaba la última vez que estuvo en RAM. Esto puede traer complicaciones siel proceso está realizando operaciones de E/S. Supongamos que un proceso enejecución realiza una operación de E/S, con lo que el sistema operativo lo pone enespera y lo expulsa a memoria secundaria para liberar su área de memoria. Sinembargo, es posible que el dispositivo de E/S acceda asíncronamente a los �������que el proceso le indicó, para dejar/recoger los datos a leer/escribir. Estos ������� seencontraban en el área de memoria que ocupaba el proceso cuando se estabaejecutando, pero cuando pasó a espera y se le expulsó al disco, este área dememoria pasó a estar ocupada por otro proceso. Así, es posible que el dispositivode E/S ahora esté leyendo o escribiendo en un área de memoria que pertenece aotro proceso distinto del que solicito la operación de E/S.

Este problema tiene dos soluciones:

• No sacar nunca de memoria a un proceso que espera por una operación de E/S.

• Que los dispositivos de E/S realicen las operaciones sobre ������� del sistemaoperativo. De esta manera, una vez finalizada la operación de E/S solicitada,cuando el planificador selecciona al proceso para continuar, se le trae amemoria principal y se transfiere la información solicitada (si es que era unalectura) del buffer del sistema al buffer del proceso. Por último se le cede elcontrol del procesador.

Conviene recordar que para que un proceso pueda ocupar distintas particiones dememoria durante una ejecución completa, se requiere que el mecanismo dereubicación sea dinámico.

������ ����������� ���������������� ��������En principio, un sistema de intercambio podría estar basado en particiones detamaño fijo, de tal forma que cuando un proceso queda bloqueado en espera, se lepuede mover al disco y traer otro a la partición que deja libre. Pero este sistema noes aconsejable cuando se dispone de poca memoria principal, pues los programaspequeños desperdician mucha memoria cuando ocupan particiones grandes(fragmentación interna). Otro enfoque mejor es el basado en particiones de tamañovariable.

Cuando se utilizan particiones variables, el número y tamaño de los procesoscargados en memoria varía con el tiempo, como se puede ver en la parte superiorde la Figura 9. Al principio se carga el proceso �, seguidamente el � y el �. Acontinuación el proceso � termina (o se le expulsa al disco) y se carga el proceso �;finaliza el � y se carga el �...

Page 17: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���'

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD����

��������� ��������1���� ��������2�������

#����������������������4��(�������������������������

6"��#�����$��������7

����������������������J�����������������������

'!"�$� &#��,#�"'�'N �2'!�'*�#6����OP�����4�������������/�������������7

�"��#�����$���%�����! $ � '$"'$�%&

G ������������5������������������������������H

�1� 1 �1� 1 �1� 1 �1� 1 �1� 1 �1� 1 �1� 1

A A A

B B B B

C C C C

D D D

C

E

�����

A

�1� 1

B

����������

#�����

����������

#�����

�1� 1

3�������/

��������/

��!����/

3�������/

��������/

��!����/

����������

����������

6�7 6�7

Page 18: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���+ ��������������

La principal diferencia entre las particiones fijas y las de tamaño variable es que enestas últimas el número, la dirección y el tamaño de las particiones varíaconstantemente a medida que los procesos van y vienen; mientras que en las detamaño fijo no varían, son fijos.

La flexibilidad de no estar sujeto a un número fijo de particiones que resultendemasiado grandes o demasiado pequeñas mejora la utilización de la memoria,pero también complica los algoritmos de asignación, liberación y contabilidad de lamemoria disponible.

Inicialmente toda la memoria de usuario está disponible, organizada como un únicoy gran bloque de memoria libre, un �����. Cuando un proceso llega y necesitamemoria, se busca un hueco suficientemente grande para el proceso. Si seencuentra uno, el hueco se parte en dos, asignándole únicamente la memoriarequerida, dejando el resto del hueco como un nuevo hueco más pequeño ydisponible para futuras peticiones.

A medida que se crean procesos, se les pone en una cola de entrada, anotando susrequisitos de memoria. Cuando se le asigna memoria a uno de estos procesos, pasaa la cola de Preparados y puede competir por la CPU. Cuando un proceso terminalibera la memoria utilizada, con lo que el sistema operativo puede utilizarla paraasignársela a otro proceso de la cola de entrada.

En un momento dado, se tiene una lista de bloques libres de memoria y sustamaños. También se dispone de la cola de entrada de procesos. La memoria se vaasignando a los procesos hasta que no haya un hueco suficientemente grande parael primer proceso de la cola de entrada, o bien se busca en la cola un proceso cuyosrequisitos de memoria sean menores y puedan satisfacerse con alguno de losbloques disponibles.

En general siempre hay un conjunto de huecos de distintos tamaños dispersos portoda la memoria. Cuando un proceso llega y necesita memoria, se busca en elconjunto de huecos uno que sea suficientemente grande. Si el hueco es demasiadogrande, se parte en dos: uno se asigna al proceso, y el otro se devuelve al conjuntode huecos. Cuando un proceso finaliza, se libera su bloque de memoria, que sepone de vuelta en el conjunto de huecos. Si este hueco resulta estar adyacente aotros huecos (a otros bloques libres), se unen los bloques adyacentes en un únicobloque del tamaño total. Ahora hay que comprobar si hay más procesos esperandomemoria y si este nuevo bloque liberado y recombinado puede satisfacer lasdemandas de cualquiera de estos procesos que están esperando.

En algún momento puede darse el caso de que haya mucha memoria libre, perodistribuida entre muchos huecos pequeños no adyacentes. Entonces tenemos(������������� �.�����. La única solución a la fragmentación externa es la������������, que consiste en mover los bloques asignados, de tal forma quequeden adyacentes, dejando entonces grandes huecos libres que sí puedenasignarse a procesos. Obsérvese que la compactación es posible gracias a que seutiliza un sistema de reubicación dinámica, por lo que todo lo que hay que hacer es

Page 19: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���,

mover el programa a su nueva posición de memoria y actualizar el registro base conla nueva dirección de comienzo.

La compactación también tiene su coste. Téngase en cuenta que hay que movertodos los procesos hacia un extremo de la memoria, con lo que los huecos se vanmoviendo hacia el extremo opuesto, hasta formar un único gran bloque. Realizareste proceso puede resultar bastante costoso en tiempo.

Consideremos ahora la cantidad de memoria que se le debe asignar a un procesocuando se le crea o se le lleva a memoria principal. Si los procesos se crean con untamaño fijo que nunca cambia, la gestión de memoria es simple: se asignaexactamente lo que necesita, ni más ni menos. Pero si los procesos pueden crecer,por ejemplo porque realizan peticiones dinámicas de memoria, se presenta unproblema cuando los procesos intentan crecer (necesitan más memoria de larequerida inicialmente). Si hay un hueco libre adyacente al proceso, se le puedeasignar el hueco al proceso y permitirle expandirse. Pero si el proceso estáadyacente a otro proceso, el que pretende expandirse tendrá que moverse a otrohueco más grande, o bien habrá que sacar algún proceso a disco para dejar espaciolibre.

Si se espera que los procesos de un sistema puedan aumentar su tamaño a medidaque se ejecutan, es conveniente asignarles inicialmente un poco de memoria extra,para evitar tener que moverles en caso de que necesite más memoria durante laejecución (Figura 9, abajo-a). Si el proceso tiene dos segmentos que pueden crecer,por ejemplo el montículo (����) y la pila, se suele utilizar la alternativa inferior-b dela Figura 9, en la que se puede ver que cada proceso tiene una pila en la partesuperior de su memoria creciendo hacia direcciones bajas y, justo debajo, una zonade montículo creciendo hacia las direcciones altas. La memoria entre estas dosáreas puede asignarse a cualquiera de ellas. Si se acaba este espacio (porqueintenten solaparse la pila y el heap), entonces ya no quedará más remedio quemover el proceso a otro hueco mayor.

El área de ���� es la zona de memoria de donde se sirven las peticiones dinámicasde memoria, mientras que la pila se utiliza para ubicar datos temporales, como porejemplo: las variables locales, resultados intermedios en la evaluación deexpresiones, parámetros y direcciones de retorno en las llamadas a procedimientos.

OS/MVT es uno de los antiguos e importantes sistemas operativos de IBM queutilizaba particiones variables.

������ ��������!��"������� ����En general, hay tres métodos utilizados por los sistemas operativos para llevar lacuenta de la memoria utilizada y de los huecos libres:

• Mapa de bits• Listas• Sistema ���

Page 20: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���- ��������������

Veámoslos en los siguientes apartados.

�������� �������!���

Con este método de gestión de memoria, ésta se divide en ����� � ��������,cuyo tamaño puede ir desde unas cuantas palabras a varios Kbytes. Como sepuede ver en la Figura 10, cada una de estas unidades de asignación secorresponde con un bit en el mapa de bits de memoria; la primera unidad con elprimer bit, la segunda con el segundo, etc., de tal forma que si el bit está a 0 indicaque la unidad de asignación correspondiente se encuentra libre, mientras que si estáa 1 quiere decir que la unidad está ocupada, o sea, asignada a algún proceso.

El tamaño de la unidad de asignación es una cuestión muy importante. Cuanto máspequeña sea la unidad, mayor será el mapa de bits. No obstante, obsérvese queincluso con una unidad de tan solo 4 bytes, tenemos que 32 bits de memoriarequieren solamente 1 bit en el mapa. Si la unidad de asignación es de grantamaño, habrá pocas unidades, luego el mapa de bits ocupará poco espacio; peropor contra, tenemos que puede empezar a ser significativo el espaciocorrespondiente al 50% de memoria que por término medio se desperdicia en laúltima de las unidades asignadas al proceso.

Este método es simple y sencillo de implementar, pero tiene la desventaja de quecuando se buscan � unidades consecutivas de memoria para asignar a algúnproceso, se debe buscar en el mapa de bits hasta encontrar � bits consecutivos a 0.Aunque esta operación es lenta, los procesadores actuales suelen incluirinstrucciones de búsquedas de cadenas de bits, favoreciendo así la utilización de losmapas de bits.

�������� #�������!��"���

Otra forma de llevar la cuenta de la memoria utilizada es manteniendo listasenlazadas de bloques libres y bloques asignados. En este caso, la memoria serepresenta como una lista de bloques (Figura 10 inferior), en la que cada entrada oelemento de la lista indica un hueco (bloque libre), con su dirección, tamaño, ydirección del siguiente elemento.

La lista de huecos suele mantenerse ordenada por la dirección de estos, pues así sefacilita su actualización cuando se lleva un proceso a memoria o termina suejecución. Un proceso que termina tiene dos bloques adyacentes (excepto si está alprincipio o al final de la memoria), cada uno de los cuales puede estar libre uocupado por otro proceso. Si alguno de estos bloques está libre, debe compactarsecon el bloque del proceso finalizado para formar un único bloque libre. Estacompactación requiere actualizar la lista de huecos, pues habrá que modificar, almenos, la nueva longitud del bloque y, dependiendo de la posición relativa de losbloques compactados, su dirección de comienzo.

Page 21: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������������������� ����������*������

���������������������������������������J�����

������������������

����������*��

����������*������������

�����������&&�

����������*��

0 8 16 24 32

' * $ , #

1111100011111111110011111111100000111111

G"���4��������)��������'������H

����4� �������������

������ ������� ����4���.������������������

����������*������������$���J�

D����C �=?���: �:Q���D ��

$������������������������������������������������������

$�����������������������P��������������P����������������P(�������������������������������������������1

$�������������������������G H

��#�����������������

��#������������������

��#���������������������

��#��������������������

�� ���������������4�

Page 22: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���� ��������������

Este sistema de gestión en el que los bloques libres se mantienen en una lista, sepresta muy bien a la implementación de estos algoritmos:

• El primero que sirva (���� ��)• El siguiente que sirva (���� ��)• El que mejor se adapte (���� ��)• El que peor se adapte (����� ��)

El algoritmo más simple es �!���������%������4�. El gestor de memoria recorre lalista hasta encontrar un hueco que sea suficientemente grande para satisfacer lapetición. Si el hueco elegido no es exactamente del tamaño solicitado, se divide endos partes: una (del tamaño solicitado) se le asigna al proceso que lo solicitó, y laotra (con la memoria sobrante) se deja como un hueco de menor tamaño.

La lista de los huecos libres se mantiene como una cabecera con los nodos de lalista encolados a partir de ella. Cada vez que se realiza una búsqueda de un bloque,se comienza por la cabecera, hasta encontrar el primero que sirva. Cuando seencuentra el bloque, normalmente se parte en dos, uno para asignar al proceso, yotro que se convierte en un hueco más pequeño. Pues bien, lo que genera esto, a lalarga, es que cerca de la cabecera de la cola se empiecen a formar una serie debloques no contiguos y de pequeño tamaño, inservibles para ningún proceso. Apartir de esta situación, cada vez que se realiza una búsqueda, hay que recorreresta serie de bloques pequeños de manera infructuosa, hasta llegar a los bloquesque todavía no han sido partidos, o no se han fraccionado demasiado. Estafragmentación externa es inevitable, pero lo malo es la pérdida de tiempo quesupone el atravesar reiteradamente la lista de los bloques pequeños agolpados alcomienzo de la lista.

Este problema se soluciona con �!�����������%������4�. Con este algoritmo, la listaes circular, es decir, que el último nodo apunta al primero y la cabecera no essiempre la misma, sino que va rotando por la lista, es decir, que el orden de la listava rotando. Comienza por apuntar al primer bloque (en orden creciente dedirección), pero tras realizar la primera búsqueda de un bloque, la cabecera apuntaahora al bloque siguiente al asignado y así sucesivamente. Esto hace que losbloques fraccionados no se amontonen en una parte de la lista sino que sedistribuyan de manera uniforme. Así, cada vez que se comienza una búsqueda, nohabrá que atravesar todos los bloques pequeños, sino solamente alguno, con laconsecuente ganancia de tiempo.

Si bien en �� ������ ��� ���� se amontonaban los huecos pequeños al comienzode la lista, dejando al final grandes particiones libres, ahora la fragmentación de lamemoria es uniforme en el espacio de direcciones, encontrándonos con que, a lalarga, ya no tenemos huecos grandes como en el algoritmo anterior, lo cual es unproblema si llega un proceso con grandes necesidades de memoria.

Otro algoritmo muy conocido es �!� %��� ��5��� ��� �����, que recorre la listacompleta para seleccionar el hueco que mejor se adapte, o sea, el menor de los quesirvan, para no fraccionar un bloque grande que pudiera servir para alguna peticiónposterior.

Page 23: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

Este algoritmo es más lento que los anteriores, pues tiene que recorrer la listaentera por cada petición. Sorprendentemente también desperdicia más memoria,pues tiende a ir rellenando la memoria con huecos tan pequeños que resultaninservibles. En cambio, �� ������ ��� ���� y �� ������� ��� ����, al irfraccionando bloques, por termino medio generan bloques más grandes que sípueden ser aprovechables.

Para solucionar el problema de �� ��� ����� �� �����, se pensó en utilizar lapolítica opuesta, es decir, elegir �� ��� ���� �� �����; o sea, que se selecciona elbloque más grande de la lista y se parte en dos, generando así un nuevo bloquelibre que, aunque más pequeño, seguramente tendrá un tamaño significativo,evitando así la generación de huecos pequeños. Sin embargo, la simulación hademostrado que tampoco ha resultado ser una buena idea.

Para acelerar las búsquedas, puede ordenarse la lista por orden creciente de lostamaños de los bloques. En este caso, los algoritmos �� ������ ��� ���� y �� �������� �� ����� coinciden, y �� ������� ��� ���� no tiene sentido, pues la listatiene un orden fijo no circular. El inconveniente que aparece con esta ordenación esla sobrecarga que se genera para mantener la lista ordenada cada vez que se pideo se libera un bloque.

Para acelerar la búsqueda de los bloques se ha desarrollado otro algoritmo conocidocomo ��! "�, que mantiene listas separadas de bloques para los tamaños másusuales, por ejemplo, una lista para bloques de 4 Kbytes, otra para los de 8 Kbytes,12 Kbytes, etc. Así, encontrar un bloque del tamaño requerido es extremadamenterápido. Su desventaja es la de todos los esquemas basados en el orden de bloquespor su tamaño, o sea, la sobrecarga que se produce a la hora de liberar un bloque,pues resulta difícil encontrar a sus vecinos para comprobar si se pueden compactarcon él.

En cuanto a la implementación, conviene observar que los nodos de la lista notienen por que ser estructuras de datos que contienen la dirección y el tamaño delos bloques correspondientes. Cada nodo puede ser el propio bloque de memoria,tal que los primeros y los últimos bytes del bloque están reservados (no sonutilizables por los procesos) e indican el tamaño del bloque y la dirección delsiguiente bloque libre. Todos los bloques, los libres y los asignados tienen en el áreareservada un campo booleano indicador de si dicho bloque está libre u ocupado,facilitando así la tarea de la compactación.

�������� $���� �!����

Como hemos visto, el problema de los algoritmos basados en el orden de losbloques por su tamaño es la lentitud en la fase de liberación de un bloque. Elsistema ��� (o de los compañeros) es un algoritmo que aprovecha el hecho deque los ordenadores utilizan números binarios en las direcciones, para así facilitar latarea de la compactación de huecos adyacentes cuando se libera un bloque.Veamos en qué consiste.

Page 24: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

*HVWLyQ�GH�%ORTXHV ���������&&�3�/RV�EORTXHV�VH�SDUWHQ�HQ�IUDFFLRQHV�FX\R�WDPDxR�HV�SRWHQFLD�GH���

3�6H�PDQWLHQHQ�WDQWDV�OLVWDV�FRPR�WDPDxRV�GLVWLQWRV�KD\D�HQ�FDGD�PRPHQWR�

,QLFLDO

$�SLGH���

%�SLGH���

&�SLGH���

'HYXHOYH�$

'�SLGH���

'HYXHOYH�%

'HYXHOYH�'

'HYXHOYH�&

%ORTXHVOLEUHV

&

&

&

&

&

$

$

$

%

%

%

% '

'

��������.E

��������.E

���

���

���

���

���

���

���

���

���

���

���

���

���

���

���

���

���

��� ��

��

��

��

���

J�(V�IiFLO�HQFRQWUDU�HO�PHMRU�EORTXH�OLEUH

J�(V�IiFLO�FRPELQDU�EORTXHV�OLEUHV 6ROR�KD\�TXH�EXVFDU�HQ�OD�OLVWD�FRUUHVSRQGLHQWH

L�2ULJLQD�PXFKD�IUDJPHQWDFLyQ�LQWHUQD

El gestor de memoria mantiene una serie de listas de bloques libres, una para los detamaño 1 byte, otra para 2, otra para 4, 8, 16, etc. hasta llegar a �, siendo � eltamaño total del área de memoria libre inicial. Atendiendo al ejemplo de la Figura 11,vemos que si, por ejemplo, partimos de un área de memoria de usuario de 1Mbyte,inicialmente toda ella está libre, se tiene una lista con una única entradacorrespondiente a un bloque de 1 Mbyte y el resto de las listas están vacías.Cuando se recibe una petición de un proceso � de un bloque de 70 Kbytes, sebusca un bloque cuyo tamaño sea la potencia de 2 que más se aproxime por excesoa los 70 K, esto es, 128 K. Pero no hay ningún bloque de 128 K, ni de 256 ni de 512.Entonces se parte el bloque de 1M en dos bloques de 512 K (a los que se les llama���� o compañeros). Uno de estos bloques se divide a su vez en dos nuevosbloques de 256 K y por último uno de estos se vuelve a partir en otros dos bloquesde 128 K. De estos dos últimos bloques, uno de ellos se asigna al proceso querealizó la petición de los 70 K.

A continuación, se recibe una petición � de 35 K, cuya potencia de 2 más cercanaes la de 64 K, pero no hay ningún bloque de 64 K disponible, así que partimos unode los bloques de 128 K en dos de 64, y uno de ellos se le asigna a �. Para servir lapetición � de 80 K, es necesario partir uno de los bloques de 256 K en dos de 128,asignando uno de ellos.

Obsérvese que cada vez que se ha dividido un bloque, se generan dos nuevosbloques �6������� de la mitad del tamaño.

Page 25: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���#

Ahora tenemos que el proceso � libera el bloque de 128 K (de los que sólo utilizaba70). Se acude a la lista de bloques de 128 K para ver si alguno de los bloques de128 K es el compañero del liberado. En nuestro caso no lo es, por lo quesimplemente se mete el bloque liberado en esta lista de bloques de 128 K.

Seguidamente vuelve a haber una petición � de 60 K, y se asigna un bloque de 64K que había disponible. Ahora se libera el bloque del proceso �, de 64 K (ocupaba35), pero como su compañero no está libre, no hay ninguna compactación. Acontinuación finaliza el proceso �, liberando un bloque de 64 K (ocupaba 60). Eneste caso, tenemos que el compañero de este bloque sí esta libre, por lo que secompactan formando un bloque de 128 K. Seguidamente se comprueba que estenuevo bloque de 128 K tiene su compañero libre, por lo que se vuelven a compactarpara formar un único bloque de 256 K. Cuando se libera el bloque del proceso �, de128 K (ocupadas 80) se pueden realizar 3 compactaciones consecutivas dandolugar al bloque original de 1 Mb de memoria libre.

La ventaja de este algoritmo sobre otros que también ordenan conforme al tamaño,es que cuando se libera un bloque de tamaño 2k bytes, el gestor de memoriasolamente tiene que buscar en la lista de huecos de longitud 2k para ver si lacompactación es posible.

La desventaja es su ineficiencia en el aprovechamiento de la memoria, debido a losredondeos hasta una potencia de 2 en el tamaño de los bloques asignados, dandolugar, en consecuencia, a una fragmentación interna.

La gestión de memoria del sistema operativo Linux tiene lugar en dos niveles,disponiendo de gestión de memoria virtual (a alto nivel) y de gestión de memoriafísica a bajo nivel. Para la gestión de memoria física utiliza este algoritmo ��� ode los Compañeros.

Page 26: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���& ��������������

��%��� ���� ������En las distintas estrategias de gestión de memoria vistas hasta ahora, todas tienenun objetivo común: mantener muchos procesos en memoria simultáneamente parapermitir la multiprogramación. Y en cualquier caso, siempre hemos visto que serequiere que un proceso esté completamente en memoria principal antes de que sepueda ejecutar.

Sabemos que para ejecutar las instrucciones de un programa, éstas, al igual quesus operandos, tienen que estar en memoria principal. Esta imposición parecenecesaria y razonable, pero por desgracia limita el tamaño de un programa alespacio de memoria física (RAM).

Sin embargo, el examen de los programas reales nos muestra que en muchos casosno es necesario que el programa entero permanezca siempre en memoria. Porejemplo:

• Los programas suelen tener código para manejar condiciones de errorinusuales. Ya que estos errores raramente se producen en la práctica, estecódigo casi nunca se ejecuta.

• A veces, las tablas, listas o matrices se declaran con más tamaño del que luegorealmente necesitan. Una matriz se puede declarar de 100 por 100 aunqueraramente ocupe más de 10 por 10; o un ensamblador puede tener una tablapara albergar a 3000 símbolos, aunque la media de los programas no tenganmás de 200.

• Ciertos programas pueden ofrecer ciertas características que nunca o raramentese utilizan. Por ejemplo ciertas funcionalidades de programas como editores detexto, hojas de cálculo, bases de datos, etc.

Incluso aunque en algunos casos sea necesario ejecutar o recurrir a todas las partesde un programa, no se necesita todo al mismo tiempo. Mediante el sistema de los�������� ya se conseguía esto, pero se lograba gracias a la intervención directa delpropio programador. En cambio, mediante la memoria virtual, esto se va a conseguirde forma transparente al programador.

La memoria virtual es una técnica que permite la ejecución de procesos que puedenno estar completamente en memoria principal. La principal ventaja de este esquemaes que los programas pueden ser mayores que la memoria principal. Esto se debe aque se crea una abstracción de la memoria principal, separando la memoria lógica,tal como la ve el usuario, de la memoria física de la que realmente se dispone. Estatécnica libera al programador de las preocupaciones concernientes a las limitacionesde la memoria.

La habilidad de poder ejecutar un programa que sólo está parcialmente en memoriaprincipal acarrea los siguientes beneficios:

Page 27: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���'

• El tamaño de un programa no está limitado por la cantidad de memoria físicadisponible. Los usuarios escriben programas contando con un espacio dedirecciones virtuales extremadamente grande.

• Debido a que cada programa puede necesitar para ejecutarse menos memoriaque la que ocupa su tamaño total, se pueden cargar más programas enmemoria para ejecutarlos al mismo tiempo, con la consiguiente mejora en elaprovechamiento de la CPU.

• Ya que de cada programa solamente hay que cargar la parte necesaria en unmomento dado, a la hora de cargar un proceso o expulsarlo a disco, senecesitan menos operaciones de E/S debidas al intercambio, por lo que seconsigue una ejecución global más rápida.

Hasta ahora hemos dicho que con memoria virtual, el programador tiene a sudisposición una cantidad de memoria extremadamente grande, y también hemosdicho que para que un programa se ejecute, no tiene por qué estar completamenteen memoria en cada momento de su ejecución. Va siendo hora de empezar aaclarar cuál es el fundamento de esta técnica para ofrecer tanta memoria.

Sabemos que para ejecutar una instrucción, ésta y sus operandos debenencontrarse en memoria principal. ¿Por qué no en memoria secundaria?Simplemente porque el acceso es mucho más rápido a memoria RAM que a losdiscos, y por lo tanto los mecanismos de direccionamiento que se han establecidoen el procesador para hacer obtener los operandos de las instruccionesconvencionales saben hacer referencia directa a memoria principal, no a losdispositivos periféricos.

Pues bien, se trata de tener cargada en el disco la imagen del proceso en ejecución,y en memoria principal solamente la parte necesaria para la ejecución de la seccióndel programa que se está ejecutando en cada momento.

El ancho del bus de direcciones establece el rango de direcciones que puedegenerar la CPU (�����������4�����!��). Por otra parte tenemos la memoria física,es decir, los transistores que forman bytes o palabras, tal que cada uno de los bytestiene una dirección (������������!). Normalmente pensamos que a cada direcciónque sale del procesador le corresponde una dirección física, pero claro, puedesuceder que haya instalada menos memoria de la permitida por el bus dedirecciones.

Así, el procesador va alimentándose de instrucciones y datos que están en RAM,hasta que en un momento dado hace referencia a una dirección de memoria querealmente no existe, es decir, que no tiene su correspondiente memoria física. Sinembargo, la instrucción o dato que se está referenciando sí se encuentra en laimagen del proceso que reside en el disco duro, por lo tanto, lo que hay que haceres traerlo a memoria principal para permitir que la CPU termine de obtener el datosolicitado a la memoria.

Page 28: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

�������2�����#���������������������������������������������

��$��������������������������������������"�������������������������������� ��������������/������������������J����

���������������������������������������������������J��P������������������������������������J�����

���������������������������������������1

� '�����������������������������������P���������������������������������������������������

���������/������������������������������������!'����������/����������5����������������������������������#M�������������� �5���������

����������2�����������������������������������������������������������������������������������������1

"!'&� '!#&"#�'�� ! �!'�', !

"��J���������� "��J���������4���������

'��&'$�%& �#��#&"'$�%&

Page 29: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���,

Esto es lo que realizaba el programador mediante la técnica de los �������� osolapamientos, pero con la memoria virtual, ahora se realiza de forma transparenteal programador, mediante software del sistema operativo, y soportado por la ayudadel hardware que proporciona la MMU (#����� #������ $��).

En la memoria virtual vamos a tener que separar muy bien el conjunto de lasdirecciones virtuales (las que salen de la CPU) de las direcciones físicas o reales(las que corresponden a memoria física instalada) y mediante los mecanismossoftware y hardware pertinentes habrá que traducir cada dirección virtual en sucorrespondiente dirección real. Lo que puede pasar es que la dirección real de undato no corresponda a memoria principal, sino a memoria secundaria, por lo queentonces habrá que traer dicho dato a memoria principal para que la CPU puedacontinuar su ejecución.

Para implementar los sistemas de memoria virtual, normalmente se utiliza la����������, que la veremos en el siguiente apartado. También se puedeimplementar mediante ������������, como lo hace el sistema OS/2 de IBM, perolos algoritmos son bastante más complejos que los de la paginación, pues adiferencia de las páginas, los segmentos son de tamaño variable.

��%��� ��������En la gestión de memoria con intercambio, cuando había que pasar un proceso aejecución, era necesario traer el proceso entero de disco a memoria principal. Conmemoria virtual hemos dicho que no se trae todo el proceso, sino que cuando sehace referencia a una dirección de memoria virtual cuya correspondiente memoriafísica reside en disco, se trae el contenido de disco a RAM. ¿Quiere esto decir quela unidad de intercambio de memoria es el byte? Si lo fuera, daría lugar a quecontinuamente se estuviesen generando operaciones de E/S, lo cual sería pocoeficaz. Claramente, parece más conveniente utilizar bloques más grandes, paraaprovechar de manera más eficiente cada operación de E/S.

Si el tamaño de los bloques de intercambio es variable, por ejemplo de 1, 2, 3 y 4Kb, podría fácilmente darse el caso de que sea necesario traer de disco a memoriaun bloque de 3 Kb y en memoria tener dos huecos libres de 1 Kb y 2 Kb, pero nocontiguos, con lo que a primera vista no podríamos traer el bloque de 3 Kb a pesarde disponer de 3 Kb libres en memoria principal, debido a la fragmentación externaexistente. Para eliminar el problema de la fragmentación externa, lo que se hace esutilizar bloques de intercambio de tamaño único y dividir la memoria principal entrozos del mismo tamaño (de 512 bytes a 8 Kb), con lo cual a la hora de traercualquier bloque de disco a memoria, si hay un hueco libre, seguro que cabe, yademás no se desperdicia ningún espacio sobrante. A cada uno de los bloques deintercambio que están en el disco o en memoria principal le llamaremos �$���� y acada uno de los huecos en que está dividida la memoria principal (esté libre uocupado) le denominaremos �����. O sea, que los marcos son espacios dememoria principal de tamaño fijo y de direcciones consecutivas, que puedenalbergar bloques de información, exactamente del mismo tamaño, denominadospáginas.

Page 30: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���- ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

0HPRULD�9LUWXDO ������

$� �)

3DJ���

3DJ���

3DJ���

3DJ���

�����

�����

�����

�����

�����

�����

�����

3DJ��Q

(VSDFLR�GH

'LUHFFLRQHV�9LUWXDOHV

0DUFR��

0DUFR��

0DUFR��

�����

�����

�����

�����

0DUFR�P

3DJ���

3DJ���

3DJ���

3DJ���

�����

�����

�����

�����

�����

�����

�����

3DJ��Q

GLU�

YLUWXDO

GLU�

ItVLFD

0HPRULD

6HFXQGDULD

0HPRULD

3ULQFLSDO

7DEOD�GH

3iJLQDV

Nos encontramos, entonces, con que el espacio de direccionamiento virtual estádividido en páginas y el espacio de direccionamiento físico está dividido en marcos.Así pues, cuando la CPU genera una dirección virtual, ésta estará contenida en unade las páginas. Si tal página se encuentra en alguno de los marcos de memoriafísica, se accede al dato; si no, habrá que cargar esa página, residente en el discoduro, en alguno de los marcos de memoria principal, y a continuación acceder aldato.

En un sistema sin memoria virtual, la dirección virtual 1 se corresponde con ladirección física 1, la 2 con la 2, etc. ¿Sigue siendo esto válido con la memoriavirtual? Pues no. Si fuese así, en un sistema con una espacio de direccionamientovirtual de 24 Mb y una memoria física de 4 Mb, por ejemplo, esto querría decir queuna referencia a una dirección comprendida en el rango de los 4 primerosmegabytes de memoria, siempre encontraría la página correspondiente en memoriaprincipal, pero ¿qué pasaría al hacer referencia a una dirección superior? habría quetraerla a memoria principal, pero ¿a dónde? si no existen las direcciones físicascorrespondientes.

Esto nos lleva a que hay que desligar la correspondencia directa y estática entredirecciones físicas y virtuales, o lo que es lo mismo, hay que desligar una relaciónestática entre páginas y marcos, y hacer que su relación se establezca dinámica eindirectamente mediante una tabla, a la que llamaremos ���!�� �� �$�����. Estatabla, además de guardar la correspondencia entre páginas y marcos, mantiene másinformación de control, como por ejemplo, el denominado �� � ��������, queindica si una página dada se encuentra en un marco de memoria o no. El resto de lainformación de control la iremos comentando a lo largo de este capítulo.

Page 31: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

Así pues, veamos a grandes rasgos y con ayuda de la Figura 13, qué pasos sesuceden a partir de una referencia generada por la CPU:

1. La CPU hace referencia a una dirección virtual de memoria.

2. Se calcula a qué página corresponde tal dirección.

3. Mediante la tabla de páginas se comprueba si la página se encuentra en algún marco de memoriafísica o en disco.

4. Si se encuentra en un marco, se traduce la dirección virtual a la dirección física que ocupa lapágina.

5. Si no se encuentra en un marco, hay que traer la página desde disco a un marco libre dememoria. Posteriormente habrá que traducir la dirección virtual a la dirección física,dependiendo del marco asignado a la página.

6. Por último, se realiza la operación de L/E sobre memoria principal solicitada por la CPU.

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

Comencemos con el �$!��!����!���$�����������������������������4�����!. Parasaber a qué página corresponde una dirección, simplemente hay que dividir ladirección dada entre el tamaño de las páginas. El cociente es la páginacorrespondiente; el resto es el desplazamiento dentro de la página.

Este cálculo se puede facilitar mucho si el tamaño de la página es una potencia dedos. Sabemos que con números binarios, las multiplicaciones por 2, 4, 8, 16, etc., seconsiguen con 1, 2, 3, 4, etc. desplazamientos a la izquierda, y una división serealiza con los correspondientes desplazamientos a la derecha. Esto quiere decirque si, por ejemplo, se tiene un espacio de direccionamiento virtual de 1 Mb (220) yun tamaño de página de 4 Kb (212), habrá 220/212 = 28 = 256 páginas de 4 Kb cadauna. O sea, que de los 20 bits que ocupa una dirección virtual, el número de páginase obtiene desplazando la dirección 12 bits a la derecha, lo cual es lo mismo quetomar directamente los 8 bits de mayor peso. Para cada una de las páginas, losdesplazamientos posibles van a ir variando de 0 a 212. Ahora, seguramente, noresulta difícil ver que, en nuestro ejemplo, el número de página de una direcciónvirtual viene indicado por los 8 bits de mayor peso y el desplazamiento que ocupadicha dirección dentro de la página viene indicada por los 12 bits de menor peso dela dirección.

Así pues, habiendo elegido un tamaño de página que sea potencia de 2, con ayudade un hardware muy elemental se puede conocer directa y rápidamente la página yel desplazamiento de cada dirección.

Una vez descrito el algoritmo para obtener el número de la página referenciada, nosinteresa saber cómo se realiza la ���������� �� ����������� 4�����!��� �������������(1�����.

El espacio de direcciones virtuales está dividido en bloques del tamaño de unapágina. Por lo tanto, una dirección virtual está formada por una pagina � y undesplazamiento dentro de la página, o sea por el par (�%), mientras que el espaciode direcciones físicas o reales está dividido en � marcos del mismo tamaño de lapágina, por lo que las direcciones físicas estarán formadas por un marco m y un

Page 32: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���� ��������������

desplazamiento dentro del marco, es decir, por el par (�%). (Ver Figura 14). Por lotanto, para realizar la traducción de direcciones virtuales a reales hay que construirla función de correspondencia (�%) → (�%). Recordamos que siendo �&! el númerode bits de una dirección virtual, � ocupa los � bits de mayor peso de la dirección, y viene dado por los ! bits de menor peso de la dirección, siendo 2j el número depáginas del sistema y 2k el tamaño de la página.

Sabemos que una página que se encuentre en memoria principal se encuentra enuno de los marcos. Puesto que el tamaño de las páginas y de los marcos es elmismo, parece obvio que para una dirección virtual (�%) a la que le corresponde ladirección física (�%), el desplazamiento será el mismo, tanto dentro de la páginacomo dentro del marco asignado. Así, únicamente será necesario realizar latraducción de página a marco (� → �), por lo que la tabla de traducción (tabla depáginas) solamente tendrá que tener tantas entradas como páginas, no tantas comodirecciones virtuales.

Pues bien, a partir de una dirección virtual (�%), se comprueba en la tabla depáginas si la página � se encuentra en alguno de los marcos de memoria. Si es así,se obtiene de la tabla el marco � que contiene la página. La dirección física esentonces (�%).

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

3DJLQDFLyQ "����������,������

$� �) ������'LU�

9LUWXDO����� 'LU�

)tVLFD

������

�����

P

"������� 5����

Page 33: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ����

Obsérvese que, dado que el número de páginas puede ser mayor que el número demarcos de memoria física, el número de bits de la dirección virtual puede ser mayorque el de la dirección física.

Conviene saber que en el bus de direcciones, que se dirige desde la CPU a lamemoria principal, se encuentra interceptado por el hardware que nos ayuda arealizar el proceso de traducción, o sea, la Unidad de Gestión de Memoria (#�����#��������� $�� o MMU). Ésta recibe las direcciones virtuales y con ayuda de latabla de páginas genera las direcciones físicas correspondientes, sin necesidad desoftware adicional. (No obstante, hoy día la MMU suele estar integrada dentro de lapropia CPU).

Cuando en la referencia a una dirección virtual, la página correspondiente no seencuentra en memoria principal, entonces decimos que se produce una (�!��� ��$����. En este caso, las acciones a realizar son, como se indica en la Figura 15,las siguientes:

1. La CPU genera una dirección virtual.

2. La MMU consulta el bit de presencia de la tabla de páginas y se comprueba quela página de la dirección referenciada no se encuentra en memoria principal.

3. La MMU pone la CPU en espera y genera una interrupción (que suele ser ������ ���) que es capturada por el sistema operativo.

4. Las rutinas de carga de páginas del sistema operativo se encargan de localizar lapágina referenciada en el disco y cargarla en un marco libre de la memoriaprincipal.

5. Se actualiza la tabla de páginas indicando que está presente y el marco en el queha sido cargada.

6. Termina el tratamiento de la excepción.

7. La MMU indica a la CPU que debe rearrancar la instrucción que provocó la faltade página.

8. Se continua la ejecución de la instrucción a partir del direccionamiento queprodujo la falta de página. Esta vez ya no se producirá la falta de página.

Obsérvese que en el intercambio de memoria se traían y llevaban procesos enterossi había un área de memoria contigua suficientemente grande; con páginación bastacon que se disponga de la memoria necesaria, aunque no sea contigua, pues elproceso puede estar repartido entre varias páginas.

En principio, parece que cuando se produce una falta de página, son necesarias dostransferencias entre memoria y disco: una para llevar la víctima al área deintercambio y otra para traer la página referenciada al marco que se acaba deliberar. Esto duplica el tiempo de servicio de una falta de página, incrementando, porlo tanto, el tiempo medio de acceso a memoria. Esta sobrecarga en tiempo puedealiviarse utilizando el �������������� o bit de página modificada. En cada entradade la tabla de páginas hay un bit de ensuciado que se pone a “falso” cuando secarga la página en memoria. Este bit permanece así hasta que se produzca una

Page 34: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

3DJLQDFLyQ .�������� 5���

...

...

MOVE A,B

...

...

"������� 5����

5HIHUHQFLD

5HDUUDQFDU

LQVWUXFFLyQ

�1� 1

��1��

0DUFR

/LEUH

3URJUDPD

0HPRULD

3ULQFLSDO

)DOWD�GH�SiJLQD

£([FHSFLyQ�

/OHYDU�SiJLQD�D

PHPRULD�SULQFLSDO

$FWXDOL]DU�7�3�

��

escritura en la página, en cuyo momento el hardware lo pone a “cierto”, indicandoque la página ha sido modificada desde que se trajo de disco. De este modo, si enalgún momento esta página es elegida como víctima en una sustitución, seconsultará el bit de ensuciado; si la página no ha sido modificada quiere decir que lacopia en memoria es idéntica a la copia en disco, luego no hay motivo para escribirlade nuevo en el disco. Si por el contrario ha sido modificada, habrá que actualizarlaen el área de intercambio. Con esta técnica, el tiempo de sustitución de páginas sereduce a la mitad en el caso de que la víctima no haya sido modificada.

Una pregunta que nos podemos hacer es: Cuando en un sistema paginado, unproceso va a pasar a ejecución ¿cuántas páginas se cargan? Si se carga un ciertonúmero de las páginas del proceso que va a pasar a ejecución, decimos que es unsistema de �������������������!����������. Esto tiene la ventaja de que evita losretardos debidos a las faltas de página, pues ya no se producen; pero por contra,cada cambio de contexto implica la carga de muchas páginas, de las que la mayoríaquizás no se van a referenciar en su porción de tiempo, y sin embargo va a conllevarun gran tiempo en operaciones de E/S para cargar tales páginas. Por esto, lamayoría de los sistemas van cargando cada página a medida que se referencia,bien para alimentar una instrucción o para obtener un operando, es decir, realizanuna ��������������������.

Page 35: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���#

7������������!��)��!�����$�����Ya dijimos que la función de correspondencia entre las direcciones virtuales y lasfísicas o reales se realiza mediante una tabla de páginas. Esta tabla tiene tantasentradas como páginas existentes y cada entrada contiene información que, aunquevaría de unos sistemas a otros, suele estar compuesta de los siguientes campos:

• ����������. Expresa los permisos de acceso del proceso. En caso de tenerpermiso para la operación de lectura/escritura que se va a realizar, se consultael resto de los campos.

• /��������������. Indica si la página está presente en memoria principal o no. Sise encuentra en RAM, también tienen sentido los siguientes campos.

• ������������. Si la página se encuentra en memoria principal, este campoexpresa el marco que la contiene.

• ���(�����8��������������9. Este campo indica si el contenido de la páginaha sido modificado desde que se trajo de la memoria secundaria.

• ��(��������. Este campo booleano se pone a cierto cada vez que se hacereferencia a cualquier dirección de la página. Lo utiliza el sistema operativo paraayudar a los algoritmos de sustitución de páginas.

En caso de que la página referenciada no esté cargada en memoria, sabemos quese encuentra en el área de intercambio del disco, pero ¿en qué lugar concreto? Ladirección concreta de cada página virtual en el disco (cilindro, pista, sector), no seindica explícitamente en ningún campo de la tabla de páginas. En su lugar, lo que sehace es calcular la dirección. Esto se puede realizar fácilmente ya que el área deintercambio ocupa una porción contigua del disco, o sea, que no está fragmentada,bien sea por estar en una partición reservada para ello (caso de Unix y Linux), o porestar en un fichero creado en por el sistema operativo en la generación del sistema(caso de Windows: Pagefile.sys) y que tampoco está fragmentado. Conociendola dirección de comienzo del área de intercambio y el tamaño de la página, el cálculode la dirección de cada página es inmediato. De esta forma se ahorra muchoespacio en la tabla de páginas.

Suele haber una tabla de páginas para cada proceso, en la que se expresan lospermisos de acceso que tiene a cada página. Así, se consigue que un proceso nopueda acceder o realizar operaciones indebidas con información que no lepertenece o que no comparte con otros procesos.

Ya que puede haber varias tablas de páginas, los procesadores suelen disponer deun registro denominado RBTP (Registro Base de la Tabla de Páginas) que apuntaen todo momento a la dirección de comienzo de la tabla activa. De esta manera, ladirección de la entrada correspondiente a una página dada se obtiene así:

Dir. Entrada = [RBTP] + (Nº_página x Tamaño_de_entrada)

En los sistemas de hoy día, dado su amplio espectro de direccionamiento, las tablasde páginas pueden tener miles o millones de entradas, por lo que normalmente se

Page 36: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���& ��������������

tendrá cargada en memoria principal solamente una parte de una tabla de páginas(la correspondiente al proceso en ejecución), el resto se mantendrá en disco. Elcambio de contexto tendrá que incluir por tanto la carga y actualización de la tablade páginas del proceso que pasa a ejecución, lo que viene a incrementar el tiemponecesitado para realizar dicho cambio.

Dado el enorme rango de direccionamiento del que se dispone en los ordenadoresactuales, y teniendo en cuenta que los procesos suelen referenciar sólo unas pocaspáginas durante su ejecución, normalmente se utilizan unas pocas de los miles omillones de entradas que contiene la tabla de páginas, con el consiguientedesperdicio del espacio de memoria utilizado por las entradas de las páginas nocorrespondientes al proceso. Para evitar esto, otra posible organización de la tablaes la llamada ���!�����$��������4�����. En esta tabla, hay una entrada por cadamarco de memoria, conteniendo la dirección virtual de la página cargada en cadamarco.

Ahora solamente hay una tabla de páginas en el sistema, y cuando se genera unadirección virtual (�%), hay que buscar en la tabla para ver si alguna de las entradascontiene el número � de la página referenciada. Si la entrada i-ésima contiene elnúmero de página referenciado, se forma la dirección real como (%), siendo elnúmero del marco, y el desplazamiento.

Ya que solamente hay una tabla de páginas, antes de realizar el acceso, se debecomprobar en el campo de protección si el proceso en curso tiene permiso pararealizar la operación de lectura/escritura de esa página.

Ahora bien, ya que la tabla de páginas invertida solamente contiene información delas páginas en memoria, ¿que pasa cuando hay una referencia a una página que noestá cargada en memoria principal? Para esto se debe mantener una tabla depáginas convencional completa. Ya que la tabla completa solamente es necesariacuando se produce una falta de página, no necesita estar disponible con la máximaceleridad y, como puede ser muy voluminosa, suele estar ubicada en el disco duro,paginada como una parte más de la memoria.

Aunque las tablas invertidas reducen radicalmente la cantidad de memoria utilizadapara almacenar la tabla de páginas, también aumentan el tiempo de búsqueda deuna página en la tabla, ya que la tabla está ordenada por direcciones físicas(marcos) y hay que buscar en el contenido de cada entrada para encontrar la páginao dirección virtual buscada, por lo que puede llegar a ser necesario recorrer inclusola tabla entera, lo cual puede suponer demasiado tiempo. Para mejorar estasituación, se pueden utilizar algoritmos ���� o aleatorios para limitar esta búsquedaa unas pocas entradas. También se suele recurrir a la ayuda del hardware,utilizando memoria asociativa para mantener la tabla invertida, o al menos, paracontener las entradas más recientemente referenciadas.

Otra forma de organizar la información de control de las páginas consiste enestructurarla en varios niveles de jerarquía, en lugar de tener una única tabla muygrande, dando lugar a las llamadas ���!��� ��!����4�!, cuya organización latrataremos en la descripción del procesador Pentium de Intel.

Page 37: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���'

�������:��;���Como acabamos de ver, uno de los soportes para la tabla de páginas puede ser unconjunto de registros dedicados a los que la CPU puede acceder con la mismarapidez que a los registros generales. En los cambios de contexto, el ��������tendría que actualizar estos registros como el resto de los registros generales.

Así era en el PDP-11, con direcciones de 16 bits y páginas de 8 Kb, por lo que latabla de páginas constaba de 8 entradas mantenidas en registros de acceso rápido.Para otros pequeños ordenadores, la tabla de páginas puede llegar a tener hasta256 entradas, por ejemplo; pero en la actualidad, la mayoría de los ordenadorespermiten tablas que pueden tener millones de entradas, con lo que el uso deregistros rápidos no es factible. En su lugar, la tabla de páginas se mantienesimplemente en memoria principal, y su dirección, cargada en un registrodenominado '�() (Registro Base de la Tabla de Páginas). Como ya vimosanteriormente, para realizar una referencia a la página � hay que acceder a laenésima entrada de la tabla, obtener el marco � y formar la dirección como yasabemos. Pero según esto, para cada referencia de la CPU a una dirección de RAMse requieren dos accesos a memoria, uno para calcular la dirección real y otro paraacceder a la dirección calculada y realizar la operación de lectura/escritura.Claramente, esto ralentiza los accesos a memoria en un factor de 2, lo cual puederesultar intolerable en ciertas circunstancias.

La solución habitual a este problema consiste en utilizar una pequeña memoriaasociativa de acceso muy rápido conocida como TLB ((��������� *��!��� ������)que contiene las entradas de los últimos accesos a la tabla (de 8 a 2048). De estemodo se consigue un tiempo medio de acceso sólo ligeramente mayor que en losaccesos directos a memoria.

El procesador Pentium de Intel cuenta con una memoria asociativa de 32 registros yconsigue una tasa de aciertos del 98%.

Para finalizar con la ayuda que se recibe del hardware en toda la operación detraducción, solamente recordar que todo el proceso de conversión de direccionesvirtuales en reales se realiza bajo la dirección no de la CPU, sino de un procesadorespecializado en este trabajo denominado MMU (#����� #������ $��), que sesitúa entre la CPU y la memoria principal, recibiendo como entrada la direcciónvirtual que viene por el bus de direcciones y generando a su vez, como salida, unadirección real que va dirigida a la memoria. La utilización de memoria virtual es tancomún hoy día, que los procesadores actuales suelen incluir la MMU en la mismapastilla de la CPU.

��%��� $������������&����Según hemos visto hasta ahora, el tratamiento de una falta de página es como eldescrito en la Figura 15, esto es, simplemente hay que traer la página referenciadadesde disco a un marco libre de la memoria principal y rearrancar la instrucción queoriginó la falta de página. Pero ¿qué pasa si no hay ningún marco libre?

Page 38: [003] Sistemas Operativos - Gestion de Memoria

�����������������

���+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ������������ 5����$�������������������������������������������������

6����������9�����������7

�����������������������

�)�"�")�!)&'� R��&'

:���S���=

:���=���S

��� ���#

5�1������

&�������1

�/���

�#������/���

�� 5����T��������������U

�������/��������

'����J�����������1�#��"1 1

�"������5�����(�������

'�� !�"� �,#�)�"�")$�%&G$��������������5�������������H

�� ������������������������� '�(������&����)���������6AS=:SCSB:CSC:=:S=AS=7

3�&O�������������������

������������������������������������������(����������5���

Page 39: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ���,

Esta situación no es extraña; pensemos que la memoria puede estar completamenteocupada por dos motivos:

• Se utilizan muchas páginas del proceso en ejecución.

• Se ha ido incrementando el grado de multiprogramación hasta ocupar toda lamemoria principal, por lo que ésta se encuentra ocupada por páginas dediversos procesos.

En este último caso, se podría optar por sacar alguno de los procesoscompletamente a disco, es decir, todas sus páginas; pero puede que no sea unabuena idea, porque a lo mejor en la siguiente porción de tiempo hay que volver acargar todas esas páginas. Puesto que lo único que se necesita en este momentoes espacio para una página, la mejor salida para cuando se produce una falta depágina suele ser la sustitución de alguna de las páginas que actualmente residen enmemoria principal por la que acaba de ser referenciada. El proceso de sustitucióntiene los siguientes pasos:

1. Se elige la “víctima”, es decir, una página cargada en memoria principal, parallevarla a disco y dejar un marco libre. La elección se realizará dependiendo dela política de sustitución de páginas.

2. Se lleva la página elegida al área de intercambio del disco.

3. En la entrada de la tabla de páginas correspondiente a la víctima, se indica que“no está presente”.

4. Se trae la página referenciada al marco que se acaba de dejar libre.

5. Se actualiza la entrada de la tabla de páginas correspondiente a la página quese acaba de traer a memoria principal, indicando que está presente yactualizando tanto el número de marco que ocupa como los campos de controlque sean necesarios en cada caso.

Nos queda un problema por resolver: ¿cómo elegir la página a sustituir cuando nohay ningún marco libre? Veamos ahora las distintas políticas de sustitución depáginas.

��%����� '������ ����$������������&����

Hay muchos algoritmos de sustitución; posiblemente cada sistema operativo tiene elsuyo particular; pero en cualquier caso todos persiguen lo mismo: seleccionarpáginas que causen la menor tasa posible de faltas de página.

La eficacia de los algoritmos de sustitución se evalúa ejecutándolos sobre una serieconcreta de referencias a memoria y contabilizando el número de faltas de páginaque se producen. A la serie de referencias a memoria se la denomina ������ ���(������� o cadena de referencia. Las series de referencia se pueden generarartificialmente (mediante un generador de números aleatorios) o capturando todaslas referencias a memoria que se realizan en la ejecución de un programa dado.

Page 40: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��"- ��������������

Esta última alternativa produce una gran cantidad de datos, pues cada direccióncompleta consta de muchos dígitos, y a nosotros solamente nos interesa el númerode página. Además, cuando se hace una referencia a una página �, lo que sabemoscon certeza es que las sucesivas referencias a esa misma página no causarán unafalta de página si se realizan de forma inmediata, pues la página � seguro que estáen memoria; por lo tanto no merece la pena considerar referencias sucesivas a lamisma página.

Por ejemplo, si se comprueba que las direcciones generadas por un programa sonlas siguientes:

0100, 0432, 0101, 0612, 0102, 0103, 0104, 0101, 0611, 0102, 01030104, 0101, 0610, 0102, 0103, 0104, 0101, 0609, 0102, 015

Si las páginas fueran de 100 bytes, la serie de referencia será la siguiente:

1, 4, 1, 6, 1, 6, 1, 6, 1, 6, 1, 0

Para determinar el número de faltas de página que genera un algoritmo desustitución sobre una serie de referencia determinada, también se necesita conocerel número de marcos de memoria disponibles. Obviamente, cuanto mayor sea elnúmero de marcos, menor será el número de faltas de página. Para la serie dereferencia de nuestro ejemplo, con tres marcos se tendrían solamente tres faltas depágina, las correspondientes a la primera referencia a cada página. Si por elcontrario, solamente hubiera un marco, daría lugar a 11 faltas de página.

Para la evaluación de los algoritmos que veremos a continuación, utilizaremos lasiguiente serie de referencia:

7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

sobre una memoria con tres marcos.

�����������7��������������������!���8< <�9Según este algoritmo, cuando hay que dejar libre un marco de memoria, se debeelegir la página que lleva más tiempo en memoria.

En la Figura 17 se puede observar el comportamiento de este algoritmo paranuestra serie de referencia.

La política FIFO es fácil de entender y de implementar, sin embargo sucomportamiento no siempre es bueno. Resulta buena elección cuando se descarganpáginas correspondientes a módulos que no se van a volver a utilizar, por ejemplo,la parte de inicialización de un programa; pero resulta pésimo cuando se elige una

Page 41: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��"�

página que contiene ciertas constantes que se cargaron al principio y que se utilizana lo largo de todo el programa, por lo que enseguida va a ser referenciada. Siaplicamos este algoritmo a las estanterías de un supermercado, el resultado esigualmente desastroso. Supongamos que en un supermercado se recibe una nuevamarca de jabón, y como no hay espacio en las estanterías se decide retirar elproducto más antiguo del supermercado: ¡se elimina el pan del las estanterías!

Hemos comentado anteriormente que, como parece obvio, a mayor número demarcos de memoria, menos faltas de página. Sin embargo hay situaciones (como ladescrita en la Figura 17-inferior) en las que utilizando el algoritmo FIFO, alincrementar el número de marcos, aumentan las faltas de página. Cuando seproduce esto, tenemos lo que se conoce como �����!1����/�!�6.

Para implementar este algoritmo puede bastar con mantener una cola FIFO de laspáginas que entran en memoria principal. Las páginas que entran se van metiendoal final de la cola, mientras que cuando hay que elegir una página para sersustituida, simplemente hay que tomar la que está en la cabeza de la cola.

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�3URFHVRV�����

$OJRULWPRV�GH�6XVWLWXFLyQ � ���������#������3� ��������������6.�. 7

6H�VXVWLWX\H�OD�SiJLQD�TXH�OOHYD�PiV�WLHPSR�HQ�PHPRULD

6H�LPSOHPHQWD�PHGLDQWH�XQD�FROD�GH�SiJLQDV

J�%LHQ��&XDQGR�VH�GHVFDUJD�XQ�PyGXOR�GH�LQLFLDOL]DFLyQ

L�0DO���&XDQGR�VH�GHVFDUJD�XQD�SiJLQD�FRQ�FRQVWDQWHV

�������������PX\�XWLOL]DGDV

6HULH�GH�5HIHUHQFLD�

� � � � � � � � � � � � � � � � � � � �

���)DOWDV�GH�3iJLQD

3DUD�OD�VHULH������������������������������������

&RQ���PDUFRV ����IDOWDV�GH�SiJLQD

&RQ���PDUFRV ��£����IDOWDV��

��������������

Page 42: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��"� ��������������

�!��������=������8��)9El descubrimiento de la Anomalía de Belady fue un incentivo para buscar elalgoritmo óptimo, es decir, el que genera la menor tasa de faltas de página. Elalgoritmo óptimo dice:

Reemplazar la página que más tiempovaya a tardar en ser referenciada.

En la Figura 18 vemos que para nuestra serie de referencia y con tres marcos dememoria, solamente se producen 9 faltas de página, 6 menos que con el algoritmoFIFO. Si ignoramos las seis faltas de página correspondientes a la carga inicial decada página (pues estas faltas son inevitables en cualquier algoritmo), estealgoritmo triplica en eficacia al FIFO.

Por desgracia, este algoritmo tan bueno resulta difícil de implementar, pues requiereun conocimiento anticipado de la serie de referencia. Por lo tanto, suele utilizarseprincipalmente para realizar estudios comparativos de otros algoritmos cuyaimplementación sí es posible.

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�3URFHVRV�����

$OJRULWPRV�GH�6XVWLWXFLyQ �'��������%����

6HULH�GH�5HIHUHQFLD�

� � � � � � � � � � � � � � � � � � � �

+�£���)DOWDV�GH�3iJLQD��

5HHPSOD]DU�OD�SiJLQDTXH�PiV�WLHPSR�YD�D�WDUGDU�HQ�XWLOL]DUVH

J�*DUDQWL]D�OD�PHQRU�WDVD�GH�IDOWDV�GH�SiJLQD��SHUR����

����������� �

6H�XWLOL]D�SDUDHVWXGLRV�FRPSDUDWLYRV

Page 43: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��"�

0����������������������>��!� ���80�>9Ya que la implementación del algoritmo óptimo no es factible, se puede intentarrealizar alguna aproximación que sí sea posible.

La diferencia básica entre el algoritmo OPT y el FIFO es que este último utiliza elmomento en el que la página se cargó en memoria, mientras que el OPT se sirve delmomento en el que la página va a ser utilizada. Puesto que no es posible sabercuándo va a ser referenciada una página, quizás se podría utilizar el pasado másreciente como una aproximación al futuro más cercano, es decir, elegir como víctimaa !���$�����%���!!�4���$�������������������(��������.

La sustitución mediante LRU asocia a cada página la hora a la que fue referenciadapor última vez. Cuando hay que reemplazar una página, simplemente se elige la quetiene la hora de referencia más antigua.

Para la serie de referencia de nuestro ejemplo, el LRU genera 12 faltas de página,que sin llegar a ser el algoritmo óptimo, sí mejora bastante al FIFO.

Ya que en general es una buena política de sustitución de páginas, es el algoritmomás comúnmente utilizado, pues solamente se aprecia un comportamiento erróneocuando se descarga una página que forma parte de un bucle que ocupa variaspáginas. Posiblemente al llegar al final de bucle hay que descargar la página que secargó al comienzo del bucle, por lo que se está eligiendo una página que se va arequerir inmediatamente.

La mayor pega que presenta este algoritmo es su implementación. Hay dosenfoques posibles:

• Implementarlo con ayuda del hardware• Mediante un algoritmo puramente software

Una de las opciones más sencillas consiste en utilizar un campo de las entradas dela tabla de páginas, en el que se indica la hora cada vez que una página esreferenciada. Para elegir una víctima, hay que recorrer la tabla de páginas buscandola entrada con la hora más antigua. Además de la sobrecarga que supone el tiempode búsqueda en la tabla, hay que añadir la escritura que hay que realizar en la tablade páginas cada vez que se referencia una página.

Page 44: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��"" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�3URFHVRV�����

$OJRULWPRV�GH�6XVWLWXFLyQ �������!�����������)��J����6�!)7

6HULH�GH�5HIHUHQFLD�

� � � � � � � � � � � � � � � � � � � �

���)DOWDV�GH�3iJLQD

6H�VXVWLWX\H�OD�SiJLQD�TXH�OOHYD�PiV�WLHPSRVLQ�VHU�UHIHUHFQLDGD

(V�XQD�DSUR[LPDFLyQ�DO�$OJRULWPR�ÐSWLPR

J�(Q�JHQHUDO�HV�XQ�EXHQ�VLVWHPD��0X\�XWLOL]DGR

L�)DOOD�FRQ�DOJXQRV�EXFOHV�TXH�RFXSDQ�YDULDV�SiJLQDV

������������ ��&RQWDGRUHV

��3LOD5HTXLHUH�D\XGD�GHO�KZ���&267262�

'���V���������������(�W���

Una implementación alternativa consiste en mantener una pila de las páginas enmemoria. Cuando se referencia una página, se elimina de la pila y se coloca en lacima de ésta. Así, la página que está en la cima de la pila es la página másrecientemente referenciada, mientras que la página que se encuentra en el fondo dela pila es la que lleva más tiempo sin ser utilizada. El mantenimiento de esta pila escostoso, pues se requiere una lista de doble enlace, aunque al menos no hay querecorrer la tabla de páginas completa como en el caso anterior. No obstante,obsérvese que si cada referencia a memoria supone actualizar esta pila, para nogenerar una sobrecarga inaceptable, debería ser la propia MMU la que se encarguedel mantenimiento de dicha pila.

Como vemos, para que cualquiera de estos mecanismos sea efectivo, debeproporcionarse algún soporte hardware, cosa que muy pocas máquinas ofrecen; poreso se recurre en muchos casos a algoritmos en los que se requiere muy poca oninguna ayuda del hardware, en los que se realizan, mediante algoritmos software,aproximaciones al LRU puro. Veamos a continuación el algoritmo más utilizado enestas aproximaciones.

�!����������!������������������8�!���!�59Para la implementación de este algoritmo, la única asistencia que necesitamos delhardware es la del ���� �� ��(�������. Este bit es un campo más de la tabla depáginas, y se pone a 0 al cargar la página. Cuando una página es referenciada porla CPU (lectura o escritura), el hardware pone el bit de referencia a 1. Así, pasado

Page 45: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��"#

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

�������� '��������������:X� ����������6���������7

"�"��*����&��+��)������&�,

"���������������������������������������.�.

�����������������.�. ���������������5������������1

���������J���������������������������������5�������!KSP������������!KS�����������������J�1

��$����������������������/��������������������5���P���������������������������������������������1

Q:=

A

:B

::

BA

C

BBA

<

C< :=

D

Page 46: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��"& ��������������

un tiempo, examinando el bit de referencia se puede determinar qué páginas hansido accedidas y cuáles no. De esta forma, ya tenemos una primera aproximación alLRU: si una página no ha sido referenciada hasta ahora, se puede suponer quetambién va a tardar en ser accedida; por lo tanto es una aspirante a la sustitución.

Pero en un corto periodo de tiempo, seguramente todas las páginas en memoriaacabarán siendo referenciadas, y no sabemos en qué orden se ha ido accediendo aellas. Por eso se requiere algún refinamiento.

Para ello vamos a mantener una cola FIFO circular de las páginas cargadas (elúltimo elemento apunta al primero de la cola), como se muestra en la Figura 20.

Este algoritmo sigue los siguientes pasos:

1. La lista FIFO circular se empieza a formar a medida que se empiezan a cargar lasprimeras páginas en memoria. Nos serviremos de un puntero que en principioapunta a la primera página.

2. En un momento dado, al ir a cargar una nueva página, se detecta que ya no hayningún marco libre. Hay que elegir una página a sustituir entre las de la lista.

3. Se analiza la página indicada por el puntero.

4. Si su bit de referencia está a 0, es la elegida. Se saca de la lista y en su lugar seinserta la nueva página que se trae de disco. Se avanza el puntero al siguienteelemento de la lista. Finaliza la selección.

5. Si está a 1, se pone a 0 y se avanza el puntero al siguiente elemento de la lista.Vuelta al paso 3.

Aunque pueda ser un poco redundante, vamos a tratar de explicar el algoritmo conun poco más de prosa. Cuando haya que sustituir una página, comenzamos unaexploración de la cola con la ayuda de un puntero. Se consulta el bit de referenciade la página apuntada por el puntero; si el bit está a 0, la página es elegida comovíctima; si está a 1, suponemos que fue referenciada recientemente, por lo que se leda otra oportunidad, o sea, se pone el bit de referencia a 0, y se mueve el puntero ala siguiente página de la lista hasta encontrar una cuyo bit de referencia esté a 0, yponiendo también a 0 el bit de referencia de las páginas que se van analizando yque aparecen como accedidas. De esta manera, una página que acaba de seranalizada para ver si es sustituida, que tenía el bit de referencia a 1 y se le acaba deponer a 0, tiene la oportunidad de volver a ser referenciada antes de que el gestorde memoria de una vuelta completa recorriendo la cola en busca de páginas asustituir.

Téngase en cuenta que cuando se empieza a buscar una página en la lista circular,no se empieza siempre desde el mismo punto, sino desde la posición en la queterminó la búsqueda anterior.

A medida que van siendo necesarias sustituciones de páginas, se va avanzando porla cola circular hasta encontrar una página con el bit de referencia a 0. Una vez quese elige una página, se extrae de la lista y en su lugar se inserta la correspondientea la nueva página que se trae de disco. Si en dar una vuelta completa a la cola se

Page 47: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��"'

tarda un tiempo medio (, esto significa que en un momento dado, si una páginatiene su bit de referencia a 1, quiere decir que ha sido accedida por última vez en unespacio de tiempo menor que (, por lo que no sería una buena elección comopágina a sustituir.

En resumen, este algoritmo indica las páginas que han sido accedidas muyrecientemente, por lo que simplemente hay que elegir cualquiera de las restantes.

Nótese que en el peor de los casos, cuando los bits de referencia de todas laspáginas están a 1, el gestor de memoria recorre toda la cola, y al empezar lasegunda vuelta ya habrá una página con el bit a 0. Esto quiere decir que estesistema degenera en un algoritmo FIFO puro cuando todos los bits de referenciaestán a 1.

Este algoritmo se puede mejorar si entre las páginas que tiene el bit de referencia a0 se busca alguna que también tenga a 0 el bit de ensuciado, pues así no habríanecesidad de escribirla en el disco antes de cargar la nueva página.

��%��� (����������)���*�En los apartados anteriores hemos explicado cómo funciona un sistema de memoriavirtual paginada, así como algoritmos de sustitución de páginas cuando la memoriafísica no puede contener todas las páginas necesarias. Pero esto no es suficientepara hacer que un sistema se comporte de una manera correcta y eficiente. En estasección comentaremos algunas cuestiones que se deben tener en cuenta si sequiere obtener un buen rendimiento de un sistema de memoria paginada.

��%����� +�������

Supongamos que en un momento determinado, sobre un sistema con pocos marcosde página, un proceso que ocupa muchas páginas está ejecutando de forma cíclicauna porción de código que implica a unas cuantas páginas. Vamos a llamar a éstas“páginas activas”. Si cuando va a cargar una de estas páginas se encuentra que nohay ningún marco libre, tendrá que elegir una víctima entre las páginas activascargadas (u otra de otro proceso) para sustituirla por la recién referenciada. Pordesgracia, está eligiendo (irremediablemente) una página que va a ser referenciadamuy pronto, por lo que se volverá a producir otra falta de página, y asísucesivamente.

Cuando se produce esta situación, se empieza a dedicar más tiempo a operacionesde E/S por la paginación que a ejecutar las instrucciones propias del programa.Entonces se dice que se produce ��������.

Veamos como se llega a producir el trasiego:

Page 48: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��"+ ��������������

1. Se advierte una baja utilización de la CPU.

2. Se aumenta el grado de multiprogramación, es decir, se cargan más procesos.

3. Se hace necesario utilizar marcos de página de otros procesos cargados.

4. Se producen faltas de página.

5. Al paginar, los procesos causantes pasan a estado de espera.

6. La cola Preparados se vacía, pues empieza a haber muchos procesos enespera.

7. Disminuye el aprovechamiento de la CPU. Vuelta al paso 1.

Este ciclo se repite hasta que se produce un colapso, o sea, que los procesospierden todo el tiempo en paginar y no ejecutan instrucciones propias.

En general, a medida que el grado de multiprogramación crece, también lo hace elaprovechamiento de la CPU, aunque no de forma lineal, sino cada vez máslentamente, hasta que se alcanza el máximo aprovechamiento posible de la CPU. Sillegado este punto se incrementa el grado de multiprogramación, aparece el trasiegoy el rendimiento de la CPU cae drásticamente.

Para evitar el trasiego, a cada proceso se le deben proporcionar los marcos dememoria que necesita para mantener sus páginas activas, para que cuandonecesite cargar una página, sustituya uno de los marcos utilizados por él, no por otroproceso. Pero ¿cómo saber cuántos marcos ocupan las páginas activas? Esto lo vaa indicar el “conjunto de trabajo”, que a su vez se basa en el llamado “principio delocalidad” de los procesos en ejecución.

Una localidad es el conjunto de páginas que realmente se están utilizando de formaactiva en un momento determinado. Normalmente un programa está compuesto porvarias localidades diferentes, que además pueden solaparse. El ���������� �!���!�� dice que a medida que un proceso se ejecuta, se mueve de localidad enlocalidad.

Por ejemplo, cuando se llama a un subprograma, éste define una nueva localidad.En esta localidad las referencias a memoria se realizan a instrucciones y datoslocales del subprograma, y posiblemente a algunas de las variables globales.Cuando se sale del subprograma, el proceso abandona esta localidad, pues lasvariables locales y las instrucciones que lo componen ya no van a estar en usoactivo, aunque quizás posteriormente se vuelva a esta localidad. Así vemos que laslocalidades vienen determinadas por la estructura del programa y por susestructuras de datos.

Supongamos que le asignamos a un proceso suficientes marcos para acomodar sulocalidad actual. Se producirán faltas de página de esta localidad hasta que secarguen todas ellas en memoria; después, no se volverán a producir faltas depágina hasta que se cambie de localidad. Si no se le asignan suficientes marcos, seproducirá trasiego, pues no podrá mantener en memoria todas las páginas que estáutilizando de forma activa.

Page 49: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��",

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

$������������,��4� "������������������������������������������5����������

.�������� 5���

����������������������������5���������

"!'��#�

���������5���������������������

�������������������

!��#& *�������J����������$ )

�������������������������������������������J�������������������������

�����������(����������5���'��������P���������������������������

����������T ���������U������/�,�������������J����������$ )

E�$�������F������������������������������������������

����#��������"���������������������5�����������

��'���������T$�����������"������U

��.����������(���������5���

���������������������

Page 50: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��#- ��������������

Por tanto, tenemos que las referencias a memoria que realiza un proceso, no estánuniformemente distribuidas por el espacio de memoria, sino concentradas sobre lalocalidad en ejecución.

El ���!���!����5������������5� está basado en el principio de localidad, y utilizaun parámetro, ∆, para definir la 4������� �!� ���5����� �� �����5�. La idea esexaminar las ∆ referencias a páginas más recientes. El conjunto de páginasaccedidas en estas ∆ últimas referencias, forman el conjunto de trabajo. Así, si unapágina está en uso activo, estará en el conjunto de trabajo, si deja de utilizarse,posiblemente dejará de formar parte de él ∆ unidades de tiempo después de suúltima referencia. Así es cómo el conjunto de trabajo es una aproximación de lalocalidad del programa.

Por ejemplo, dada la siguiente secuencia de referencias a páginas de memoria,

. . .2 6 1 5 7 7 7 7 5 1 6 2 3 4 1 2 3 4 4 4 3 4 3 4 4 4 1 3 2 3 4 4 4 1 3 . . .

∆ ∆

t1 t2para un tamaño de ventana ∆=10, es decir que tiene en cuenta las últimas 10referencias a memoria, tenemos que el conjunto de trabajo en el momento t1 es

CT (t1, 10) = {1, 2, 5, 6, 7}

mientras que para el momento t2, habrá cambiado a

CT (t2, 10) = {3, 4}

El tamaño del conjunto de trabajo en un momento dado para un proceso lopodemos llamar TCTi, pues bien, la demanda total de marcos (D) de todos losprocesos del sistema en un momento determinado será:

D = Σ TCTi

Si el número de marcos necesarios es mayor que el número de marcos existentes,se producirá trasiego, pues algún proceso no tendrá suficientes marcos para suconjunto de trabajo.

Si el tamaño de la ventana ∆ es igual a todas las referencias a memoria realizadaspor el programa, el conjunto de trabajo a su terminación tendrá el límite máximo, esdecir, todas las páginas utilizadas por el programa; sin embargo, puesto que se haobservado que el conjunto de trabajo varía muy lentamente, se puede elegir untamaño mucho más pequeño, para el que la tasa de faltas de página sea razonableen relación a la memoria disponible.

Lo que al sistema operativo le resulta difícil en la práctica, es llevar la cuenta delconjunto de trabajo de cada proceso para asignarle ese número de marcos. Si

Page 51: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��#�

mediante algún mecanismo se pudiera conocer, a la estrategia planificación deprocesos y de sustitución de páginas se le debería añadir la siguiente condición:

+� �������,�� ����� ��� �-��� ��� ����� ����� �� �������� � ������� ����.� �������% � ����� �� ����� � �������� � �� ������� ���� ��������� ������� �� ���� �������� ������������� �� ������/

��%����� +� �*����&���

Al diseñar un sistema operativo se debe tener en cuenta el tamaño de las páginasde memoria, y no existe un tamaño perfecto, sino que éste depende de una serie defactores que se deben tener en cuenta. Lo que sí es invariable es que el tamaño esuna potencia de 2, y suele estar entre 512 bytes y 4 u 8 Kb.

A los programas se les asigna un número entero de páginas, por ello, normalmente,en la última de ellas queda espacio sin utilizar; es decir, que se producefragmentación interna. Por término medio, se suele desaprovechar media página porcada programa cargado, por lo que parece que cuanto más pequeña fuese lapágina, menor sería el espacio desperdiciado.

Sin embargo, parece obvio que para un espacio virtual dado, cuanto más pequeñassean las páginas, mayor será el número de ellas. Por ejemplo, para una memoria de4 Mb (222) se pueden tener 4096 páginas de 1024 bytes, o 512 páginas de 8192bytes.

Entonces, a más páginas, mayor tamaño de la tabla de páginas. Teniendo encuenta que en algunos sistemas hay una tabla de páginas por cada proceso, vemosque una página pequeña puede dar lugar a un espacio muy voluminoso dedicado atablas de páginas.

Otro problema que radica en el tamaño de la página es el tiempo dedicado a lasoperaciones de E/S para la carga y descarga de páginas. Para cualquier operacióncon el disco, sabemos que el tiempo de posicionamiento del brazo y el tiempo delatencia (o retardo rotacional) son fijos e independientes del tiempo de transferencia.Pues bien, puesto que estos dos tiempos son constantes, son preferibles laspáginas grandes, para realizar pocas operaciones de E/S con gran transferencia dedatos, frente a muchas operaciones de poca cantidad, puesto que crece el tiempodebido a estos dos factores constantes.

Sin embargo hay programas cuyo conjunto de trabajo está formado por un grannúmero de regiones pequeñas y separadas en el espacio de direcciones, por lo quenos encontramos que para la lectura de un cierto dato se hace necesario leer unapágina completa, y si ésta es muy grande, se pierde mucho tiempo de transferenciaen cargar y descargar información que no se va a utilizar.

Como vemos, para determinar el tamaño óptimo de la página es necesario conocerel tipo de programas que se suelen ejecutar en un sistema. No obstante, latendencia histórica es hacia páginas cada vez más grandes, probablemente debido

Page 52: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��#� ��������������

a que crece más deprisa la velocidad y la capacidad en los procesadores y en lasmemorias RAM que en los discos magnéticos.

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

$������������,��4� "���4����� 5������������4�������������������

����������9������V��������5����@�����������������J��

������9�������������E F �������� :<1SSS������"���4������5���� B1SQ<������ &������A��5����

����<��5�������������� <VB1SQ<�K�:B1DA<

,�����9������5��������� :<1SSS3:B1DA<�K�=1=:B

,����������� B1SQ<3=1=:B�K�:1<A:

.����������

�������

�����������4������5�����P�����I���������P�����������������M:�������������

�����������5����������4��

#! 5����������4��

�������5����

"�������� 5�����������

���W1��5�����P�����5������5�����

���5�������������������(������������������������������

����5���������4�����������������������������������������5(��������������������9���������������������4��������������

�������������������������������1

Page 53: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��#�

��,�$�� ������Un aspecto importante de la gestión de memoria es la separación que hay entre lavisión que el usuario tiene de la memoria y la memoria física que realmente existe.La visión que el usuario tiene de la memoria no es la misma que la memoria físicareal, por lo que se requieren las conocidas conversiones entre la memoria lógica y lamemoria física.

Sabemos que la memoria física se representa mediante un espacio de direccionesconsecutivas, sin otra relación que la de orden, tal que cada dirección secorresponde con un byte de memoria física, sin mantener ninguna agrupación lógicaentre ellos, y sin tener propiedades que no sean las características físicas de lamemoria (RAM, ROM, tiempo de acceso, etc.).

Para el programador, un programa consta de varios elementos lógicos que son losque él maneja, tales como el programa principal; un conjunto de procedimientos yfunciones; estructuras de datos, como tablas, registros, pilas, variables elementales,constantes, etc. Y se refiere a ellos en el programa sin preocuparse de la posiciónreal de memoria física que van a ocupar.

Algunas partes del programa pueden ser de tamaño fijo, como las que contienencódigo o instrucciones, pero otras no tienen por qué serlo, sino que estructuras dedatos como las tablas varían de tamaño a medida que discurre la ejecución delprograma. También pueden tener ciertas propiedades dependientes de la estructuradel programa, no de la memoria física que ocupan, como por ejemplo: la porción decódigo de un programa puede tener solamente permiso de lectura, al igual que losdatos declarados como constantes, mientras que las estructuras de datos variablespueden tener permiso de lectura y escritura. Puede haber estructuras de datospúblicas con permiso de lectura para todos los procesos que deseen acceder aellas, mientras que los datos confidenciales pueden tener restringido su acceso aciertos procesos.

Para ir introduciendo el concepto de Segmentación nos serviremos del siguientecuadro comparativo, en el que se comentan algunas diferencias básicas entre lapaginación y la segmentación.

����������

Con la paginación se realiza una organizaciónlógica de la memoria, dividiéndola en páginas,y haciendo referencia a los objetos mediante latupla (página, desplazamiento), pero la divisiónque hace no tiene en cuenta para nada la or-ganización de los programas que se ejecutan,sino que considera solamente característicasdel hardware subyacente, como la cantidad dememoria principal, y peculiaridades del disposi-tivo de almacenamiento secundario, comotiempo de acceso, tamaño del sector, etc. esdecir, que es transparente al proceso que seestá paginando.

�����������

Con la segmentación, la memoria no se divideen páginas de igual longitud, sino en segmen-tos de distinto tamaño; y las referencias a losobjetos no se realizan mediante el par (página,desplazamiento), sino con (segmento, despla-zamiento), donde el segmento se correspondedirectamente con un objeto del programador(con sus propiedades correspondientes), nosimplemente con una mera porción de memoriafísica. Ahora los mecanismos de gestión dememoria se van a referir a los objetos de unaforma parecida al programador, indicando unnúmero de segmento, y el desplazamientodentro de él.

Page 54: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��#" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

�������2����� ����������G$��������������������������������������H

�=���:���C���B���D���<���A���?���Q���=S�==��=:�=C��=B�=D��=<�=A�=?��=Q�:S�:=�::��:C

#�����./������,������

#! P��������������������P��������������������������������������������������������������������P(������P�������P�����P���������P���1

��&�#�*'!� P���������������������(��������������������������������P�����������������������������������������������������1

$�����YV!�J

�������

"��������/������

�� �������

�����

2��"'��%��$'

,#��'

�#� !�'

���/��9��������������������������������������(����������������������������������������������

���������������������������������������P�����5���������������4���������������1

(���-����� �����(

Page 55: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��##

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

�������2����� 111����������#� '$� ��%��$

,#�,�!#$$� &#�

$�����YV���1�B����1�=:?

!�J����������1�:����1�AB?

"��������/���������1�C����1�=:D<

��

������� ��������1�S����1�:BS

�1�=�1�=S:B

����������������������������������������������������5�������������������������1

,�!#$$�%&��#��#&"','

&O���������

,�����J������

#�� ! �!'�', ! �������������������(����������������P������������������������P�������P��������P���1

#��$ � ��', !������ &"', !

��������������������������������������������������������������������������P�������(�������������L���������������J������Z

#��$'!�', ! ������������������������9����������������������������������������������������������������

Page 56: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��#& ��������������

De todas formas, el programador no tiene que encargarse de definir los segmentos ylas referencias a los objetos que contienen. Los programas se siguen escribiendosin preocuparse del mecanismo subyacente de gestión de memoria. Así, al compilarun programa, el compilador construye automáticamente los segmentos necesariospara reflejar la estructura lógica del programa, creando, por ejemplo, un segmentopara las variables globales, otro para la pila y uno para la porción de código de cadasubprograma; cada tabla de datos podría estar también en un segmento distinto. Laestructura en segmentos queda reflejada en el módulo objeto generado por elcompilador. El cargador es el responsable de tomar el módulo objeto, identificarcada segmento con un número y situar a cada uno de ellos en una dirección dememoria libre (Figura 24).

��,��� � ��� ������Aunque en un sistema con memoria segmentada se dispone de múltiples espaciosvirtuales, y las referencias a los objetos se realizan mediante la tupla (segmento,desplazamiento), la memoria física o real sigue siendo una secuenciaunidimensional de bytes. Por lo tanto se debe implementar un mecanismo querealice la representación o proyección del espacio de dos dimensiones del usuariosobre la memoria física unidimensional. En la Figura 25 podemos ver un programaen el espacio de memoria virtual formado por cinco segmentos (0 a 4), así como suubicación en memoria física. La representación de la memoria virtual sobre la físicase realiza mediante la ���!�������������, en la que cada entrada contiene una���� y un !1���� de segmento. La base contiene la dirección de la memoria real enla que reside el segmento, mientras que el límite indica su longitud.

La utilización de la tabla de segmentos se muestra en la Figura 26. La direcciónlógica tiene dos partes: un número de segmento y un desplazamiento dentro dedicho segmento (�%). El número de segmento � se utiliza como un índice paraacceder a la entrada de orden � de la tabla de segmentos; el desplazamiento debeser un valor entre cero y el correspondiente límite de segmento, si está fuera de eserango, se debe producir una excepción de ����� � ������������, pues significaque se intenta acceder a un área de memoria fuera de los límites del segmento. Siel desplazamiento es válido, hay que añadírselo a la base del segmento paraobtener la dirección física de memoria donde se encuentra el objeto referenciado.

Así, una referencia al byte 48 del segmento 2 del programa de la Figura 25, setraducirá a la dirección física 4300+48 = 4348. Un intento de acceso al byte 1227 delsegmento 3 produciría un error de direccionamiento, pues ese segmento tiene unalongitud de 1100.

De forma similar a la paginación, la tabla de segmentos se puede tener en registrosde acceso rápido, de tal forma que, además, la suma de la base y eldesplazamiento, y la comparación con el límite se puede realizar simultáneamentepor hardware para ahorrar tiempo. Pero en el caso en que un programa estécompuesto por un gran número de segmentos, puede que no resulte factiblemantener la tabla en registros, por lo que habría que recurrir a tenerla en memoriaprincipal. En tal caso, el Registro Base de la Tabla de Segmentos (RBTS) nos daría

Page 57: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��#'

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

���������� ������������'������������(�����������������������������������������������������������������������������P�����������(/�������

�������������������������������������1

,����*���������6����������7

,����)���������6����7

'�� !�"� "!',)$" !

8"�������

���������

$�����YV���1�B

!�J����������1�:

"��������/���������1�C

��

������� ��������1�S

���1�=

#������������,������

*��� ����1

S =BSS =SSS= <CSS BSS: BCSS BSSC C:SS ==SSB BASS =SSS

S

=BSS

:BSS

C:SS

BCSS

BASS

DASS

<CSS

<ASS

���1�S

���1�C

���1�:

���1�B

���1�=

������./��

Page 58: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��#+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

���������� 111������������G$�����������J���������(�������������������(/��H

$ ) 6�P��7

�/�����*���

≤ 8

������

./���/

��

#�������,���������� FE

"����������������

G,����� ��������"�����������������H

#�������� #��!�������

������� �����"���������������������������

#��������� �������8��!*"�

#���9����������������������������������� !�"�

$������(������������������������������������������������������E F ��� ����� ����

���������9�������(������

Page 59: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��#,

el comienzo de su posición en todo momento. Puesto que el número de segmentoses variable (depende de cada programa), se necesita saber también el tamaño onúmero de entradas de la tabla de segmentos, lo cual viene expresado por elcontenido del Registro de Longitud de la Tabla de Segmentos (RLTS).

Así, cuando hay que calcular una dirección física, primero hay que comprobar si elsegmento es válido (se encuentra en la tabla de segmentos y la longitud de ésta esmenor que el contenido del '*(0). Si lo es, se accede a la siguiente dirección:

'�(0 + (� x tamaño_de_la_entrada)

donde se encuentra la entrada correspondiente al segmento �, y a continuación setermina de formar la dirección física como ya hemos visto anteriormente.

Al igual que sucedía con la paginación, este mecanismo de traducción requiere dosaccesos a memoria principal por cada referencia a memoria lógica, generando unaralentización del sistema en un factor de 2. Para aliviar este retardo se suelen utilizarmemorias asociativas intermedias, normalmente embebidas en las MMU’s, quecontienen los descriptores de los segmentos referenciados más recientemente. Así,un pequeño número de registros asociativos puede hacer que la ralentización delsistema no suponga más de un 10% sobre un sistema no segmentado.

��,��� ���������������������$�� ������La segmentación de memoria presenta dos ventajas principales: protección ycompartimiento.

• ����������. Ya que los segmentos representan porciones del programa concoherencia semántica (por ejemplo, puede haber segmentos de código ysegmentos de datos), es normal que todo el contenido de cada segmento seutilice de la misma manera; por ejemplo, en las arquitecturas actuales losprogramas no son automodificables, por lo que los segmentos de código puedendefinirse como de sólo-lectura o sólo-ejecución. El hardware de soporte de lagestión de memoria se encarga de comprobar los bits de protección que figuranen la tabla de segmentos para prevenir accesos ilegales a memoria, tales comoel intento de escritura en un área de sólo-lectura o la utilización de un segmentode sólo-ejecución como área de datos. También, poniendo una tabla en unsegmento dedicado, se comprobará automáticamente que todos los accesos ala tabla son válidos (no exceden el tamaño de la tabla). De esta manera,muchos errores comunes de programación se pueden detectar por el hardwareantes de que lleguen a causar un daño de consideración.

• ��������������. La otra ventaja de la segmentación es la posibilidad decompartir código o datos. Cada proceso tiene su propia tabla de segmentos,cuya dirección se mantiene en el BCP de cada proceso, de tal forma que encada cambio de contexto, se establece el RBTS correspondiente al proceso quepasa a ejecución. En la Figura 27 puede verse cómo dos procesos pueden

Page 60: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��&- ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

���������� 2���������.������������������ ������

�/��� *��� ������

0 25286 43062 ej ej ej1 8550 90003 le - -

��.�����������$��������,�������$����

Editor

Seg. 0

,����� =Seg. 1

Editor

Seg. 0

,����� :Seg. 1

�������������� =

�������������� :

�/��� *���0 25286 430621 4425 63384

"�������������������� =

�/��� *���0 25286 430621 8550 90003

"�������������������� :

#����

,�����=

,�����:

BCS<:

<?CBQ

A:AAD

QSSSC

Q?DDB

E 0 F #��������������������������������������9����������������������������������������

Page 61: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��&�

compartir segmentos. Esto es así cuando las entradas de las tablas desegmentos de los dos procesos apuntan a las mismas direcciones físicas.

Ya que el mecanismo de compartimiento reside en el nivel de segmentación,cualquier información puede compartirse si se define en un segmento. Puestoque los segmentos pueden compartirse, un programa compuesto por variossegmentos también puede compartirse entre varios procesos. Un ejemplo puedeser el compartimiento de un editor de texto en un sistema multiusuario, dondeen lugar de tener � copias completas del programa, solamente se requiere unacopia de los segmentos de código. Lo que sí se requiere para cada usuario sonsegmentos separados (no compartidos) de datos para almacenar la informacióno texto particular de cada uno.

A la hora de compartir un segmento de código, se debe tener en cuenta la siguientesutileza. Los segmentos de código contienen instrucciones que suelen hacerreferencia a otras instrucciones del mismo segmento, por ejemplo, una instrucciónde salto. La dirección de destino del salto estará formada por un número desegmento y un desplazamiento, siendo este número de segmento el mismo que elque contiene la instrucción de salto. Si se quiere compartir este segmento, todos losprocesos que lo compartan deben tener definido ese segmento con el mismonúmero. Esto no es necesario si las referencias a las direcciones no son absolutas,es decir si se realiza mediante indirecciones o direccionamientos relativos (respectoal contador de programa o al registro que contiene el número de segmento actual).

El planificador junto con el gestor de memoria deben ocuparse de encontrar yasignar memoria para todos los segmentos de un programa. Esta situación essimilar a la paginación, excepto que los segmentos son de tamaño variable,mientras que las páginas son todas de la misma longitud. Así, aquí nos encontramoscon las mismas características de asignación de memoria que se tenían en elmodelo de particiones de memoria de tamaño variable visto anteriormente; donde laprincipal diferencia está en que aquí, los programas pueden ocupar variossegmentos o particiones.

Uno de los problemas que se tenía con las particiones variables (y que aquí semantiene) era el de la fragmentación externa. En este caso, puede hacersenecesaria una recompactación de la memoria para aprovechar los pequeños huecosno adyacentes. La facilidad para poder ubicar mejor o peor los segmentos dependede su tamaño. Si un programa ocupa un solo segmento, puede hacerse difícil suubicación en memoria; por el contrario, si cada byte del programa se mete en unsegmento separado, serán fáciles de ubicar, pero se necesitaría un registro basepara cada byte, lo cual significa que habría que duplicar la memoria para podercontener los registros base de todos los segmentos.

Por último, veamos otra pega que se nos puede presentar con la segmentación.Puesto que un programa está formado por segmentos, el gestor de memoria puedeocuparse de cargar en memoria, en cada momento, exclusivamente los segmentosnecesarios para la ejecución, por lo que no es preciso tener presentes en memoriatodos los segmentos del programa. No obstante, ¿qué pasa si el tamaño de un

Page 62: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��&� ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

���������� ������������ ��������������������������������������������������������

���������������������������������

�����������������������������������4���������

"���������������������/��������������������������������������4���������E F

�����������I��������������

�������������������

.!'��#&"'$�%&#["#!&'E F

��������������.�����������#V������ #����������������I�����������������������������

��(�����������������6E��������������������F7

� $����������������������������6E����������F7

�������������������(/��������������������������������������������������������

�������������

����������� ������

Page 63: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��&�

segmento sobrepasa el tamaño de la memoria física disponible? ¡Pues que no sepodría ejecutar! Este es otro problema de los sistemas segmentados. En lossistemas paginados, la unidad de carga en memoria es la página, y ésta siempre esde un tamaño bastante menor que la memoria real disponible, mientras que en lossistemas segmentados la unidad de carga en memoria es el segmento, que pordefinición es de tamaño variable y no tiene límites preestablecidos.

��,��� $�� �������������La solución al problema de la fragmentación en el modelo de particiones de tamañovariable fue la paginación. Por otra parte tenemos que con la segmentación sefacilita el sistema de protección y compartimiento de la información, así como unamayor flexibilidad para variar dinámicamente el tamaño de las particiones queocupan los procesos.

Entonces, ¡por qué no combinar los dos sistemas, la paginación y la segmentación?En efecto, la solución ha venido con sistemas híbridos, dando lugar a sistemas dememoria con paginación segmentada y a los más comunes, los de segmentaciónpaginada, es decir, un esquema en el que en primer lugar se establece un sistemade segmentación de cara al usuario y, a continuación, acercándonos al hardware, loque se hace es paginar los segmentos. Lo que tenemos, por tanto, son programasformados por segmentos, y estos a su vez, formados por la siguiente unidad dememoria, es decir, por páginas. Con esta combinación se consiguen los beneficiosde la segmentación sin las conocidas desventajas de la fragmentación externa y conel consiguiente beneficio de poder no solamente ejecutar programas con segmentosmayores que la memoria física, sino de obtener también un mayor grado demultiprogramación al no ser obligatorio cargar segmentos completos de procesos,sino solamente las porciones (páginas) imprescindibles.

Veamos como ejemplo, en el siguiente apartado, el sistema de segmentaciónpaginada utilizada por Intel en sus procesadores Pentium.

Page 64: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��&" ��������������

��-����������� ������������ ������

��-��� (�������.������������������'�"���������El Pentium de Intel es un procesador de propósito general con el soporte paragestión de memoria integrado. Ya que una descripción muy detallada requeriría unseminario en exclusiva, aquí simplemente vamos a intentar dar una visión losuficientemente clara como para entender los mecanismos de soporte para lagestión de memoria que ofrecen estos procesadores.

Puesto que los conceptos de alto nivel de la segmentación y paginación ya se hanvisto, vamos realizar una descripción de abajo hacia arriba, es decir, comenzaremoscomentando conceptos básicos, para irlos agrupando poco a poco hasta llegar alconcepto general.

Para empezar, algunos datos básicos sobre su arquitectura. Este procesador utiliza������� para el ���������������� y &"����� para el de ����, lo que significa quepuede direccionar 4 Gigabytes de memoria física y puede leer o escribir operandosde hasta 8 bytes en una sola operación de lectura/escritura.

Tiene dos modos de funcionamiento: Real y Protegido. El modo Real es el modocompatible con la arquitectura del 8086. Aquí nosotros vamos a referirnosexclusivamente al ���� ��������, que es el modo particular de trabajo delPentium y que ofrece la gestión de memoria que nos ocupa.

En la Figura 29 pueden verse los registros accesibles de este procesador. EAX,EBX, ECX y EDX son registros de uso general; ESI y EDI se utilizan paradireccionamientos indexados; mientras que EBP y ESP están destinados a lagestión de la pila y llamadas a subprogramas. El contador de programa es el EIP yel registro de estado es EFLAGS. De especial interés para nosotros son los registrosde segmento; el CS hace referencia al segmento actual de código y el SS alsegmento de la pila en uso, mientras que DS, ES, FS y GS se utilizan comosegmentos de datos. Por último tenemos 4 registros de control: CR0, CR1, CR2 yCR3, cuya utilidad iremos viendo más adelante.

Ahora entraremos ya en conceptos directamente relacionados con eldireccionamiento y la gestión de memoria. Empecemos por los ����� ��������� ���������������� del Pentium: Virtual, Lineal y Físico.

• La dirección�4�����! o lógica esta formada por una ������������������� y undesplazamiento o ����������(����4�. La dirección efectiva se forma a partir dela información sobre el operando que figura en la instrucción máquina. Puedeestar formada por un registro base, uno de índice, más un desplazamiento. Encaso de que los operandos a los que haga referencia sean bytes, palabras, odobles o cuádruples palabras, puede aplicarse un factor de escala al registro deíndice, por lo que habría que multiplicarlo por 1, 2, 4 u 8. En cuanto a la

Page 65: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��&#

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� $������/��������������

C:

<B

,������

,����

B�����������������./��

,�������?P�=<P�C:���<B����

:���������.����������

3�!#'�

3� ! "#��,

!������� $���������� !������� !���������������� ������� ����������� ���$������

��!��1�#����� 6=<7

#'[P�#*[P�#$[P�#,[ #� P�#.�'�� $�P���P�,� $!SP�$!=

#��P�#,�P #�P�.�P��� $!:P�$!C

#* P�#�

Page 66: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��&& ��������������

dirección de segmento, como ya veremos, se obtiene a partir de un ��!�����. Elselector es el contenido de uno de los registros de segmento, y se describe endetalle un poco más adelante.

• La unidad de segmentación transforma la dirección virtual de 46 bits en una���������!����! de 32 bits. Si no está activa la paginación, la dirección lineal esdirectamente la dirección física.

• Si se trabaja con paginación (está activo el bit PG del CR0), la unidad depaginación convierte la dirección lineal en una ���������(1���� de 32 bits, con laque ya se accede a una posición de memoria física.

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

,QWHO�3HQWLXP #���������,����������

%$6( Ì1',&( '(63/$=$0,(172

[

(6&$/$

����������

8

&iOFXOR�GH�OD�',5(&&,Ð1�()(&7,9$

8QLGDG�GH

6(*0(17$&,Ð1

8QLGDG�GH

3$*,1$&,Ð1

��

'LU�

/LQHDO

��

'LU�

)tVLFD

6(/(&725

'LU��9LUWXDO

'LU��(IHFWLYD

3

*

&5��

!�'��

En primer lugar estudiaremos el mecanismo de segmentación y a continuaciónpasaremos a ver el de paginación.

��-��� ������ ���$�� ������Hasta ahora hemos visto, en los sistemas generales de segmentación, cómo elprocesador al hacer referencia a una posición de memoria, en la dirección que sacapor el bus de direcciones indica explícitamente el segmento correspondiente a esaposición de memoria. Esto lo hacía incluyendo el número de segmento en los bitsmás significativos de la dirección. Como vemos, ���������(���������������������������.�!1�����������!��?�������������������!����������.

Page 67: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��&'

Pues bien hay otro método alternativo para indicar el segmento en una referencia amemoria. En este otro método��!��?������������������������������!1���������dependiendo del tipo de acceso a memoria que se esté realizando. Como ejemplode valores implícitos en los direccionamientos tenemos las instrucciones de pila,tales como push y pop. En estas instrucciones no se indica explícitamente en lapropia instrucción la dirección del operando (la cima de la pila), sino que tal direcciónse asume implícitamente, y realmente se obtiene a partir del registro Puntero dePila.

Los procesadores de Intel con arquitectura de 32 bits (80386, 80486 y Pentium)utilizan este sistema en el que el número de segmento no forma parte de ladirección que figura en el operando de una instrucción, sino que dicho número desegmento se mantiene en unos �������� � �������� dentro del procesador, de talforma que el mecanismo de segmentación se encarga de formar una direccióncompleta a partir de la dirección que figura en el operando de una instrucción (o enel registro Puntero de Instrucción) más el segmento que se obtiene a partir deun registro de segmento.

Hecha esta aclaración sobre el método utilizado por los procesadores de esta familiapara referenciar un segmento, pasemos a ver su mecanismo completo desegmentación.

Empezaremos diciendo que el tamaño máximo de un segmento es 4 Gigabytes, yque un proceso puede acceder hasta un máximo de 8 Ksegmentos locales(particulares del proceso) y a 8 Ksegmentos globales (compartidos con los demásprocesos). Si cada tarea puede tener hasta 16 Ksegmentos (214) y el tamañomáximo de cada segmento es 4 Gb (232 bytes), esto significa un total de 64terabytes (246 bytes) de memoria virtual.

Toda la información relativa a un segmento (dirección base, tamaño o límite,permisos de acceso, atributos, etc.) está contenida en el ��������������������.

Un descriptor de segmento es una estructura de 8 bytes que contiene los siguientescampos de información:

3�������������������

/��� Dirección de comienzo del segmento.

01���� Longitud del segmento

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

3�0 Nivel de privilegio del descriptor

0= Descriptor del sistema; 1= Descriptor de código o datos

)��� Tipo de segmento. Permisos de acceso

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

� Granularidad. 0= Longitud del segmento indicada en bytes1= Longitud expresada en páginas (de 4 Kb)

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

Page 68: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��&+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� ���������������"���4���5V�����������������B�������

���������������������� ���� �������������������������

��$��������������������������������������� ��� ����

*���C=11:B

�/���=Q11=<

����,��S���S

*�����������������=D11S �/�����������������=D11S

��, ������"�������' *���:C11=<

S

8B

SC=

,�������������������

����1�S����1�=����1�:����1�C����1�B����1�D����1�<����1�A

1�1�11�1�11�1�1

�,"! ����1�S����1�=����1�:����1�C����1�B����1�D����1�<����1�A

1�1�11�1�11�1�1

�,"!

"�������,������������������ "��������

,����������������

Page 69: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��&,

Hay una )��!�� �� 3������������ �!���!�� (GDT) que contiene todos losdescriptores de los segmentos globales. Por otra parte, cada proceso tiene una)��!�� �� 3������������ 0���!�� (LDT) que contiene los descriptores de sussegmentos particulares. La dirección de la GDT está contenida en un registro delprocesador, el GDTR, mientras que la dirección de la LDT que se está utilizando enun momento dado, se mantiene en otro registro, el LDTR.

Obsérvese que en un sistema hay una única tabla de descriptores globales ymuchas tablas de descriptores locales, una por cada proceso.

Y cuando se realiza el direccionamiento a un dato en memoria ¿cómo se sabe quédescriptor de segmento hay que utilizar? La respuesta está en el ��!�����, cuyoformato se muestra en la Figura 32. Como vemos, consta de tres campos:

@���� Indica una de las 8 K entradas de la tabla dedescriptores globales o de la tabla dedescriptores locales, dependiendo del valor delcampo TI.

���������)��!�(TI)

TI=0 → Se hace referencia a la tabla dedescriptores globales (GDT)

TI=1 → Se hace referencia a la tabla dedescriptores locales (LDT)

A�4�!������4�!�����!�������������

(RPL)

Contiene el nivel de privilegio del proceso queefectúa el acceso al segmento

�������������!�����

Para hacer referencia a un segmento se utiliza un selector, cuyo campo TI indica sise trata de un segmento global o local del proceso. Una vez identificada la tabla dedescriptores (GDT o LDT), se toma el descriptor señalado por el Índice y acontinuación se comprueba si el nivel de privilegio del proceso (contenido en el RPL)es igual o mayor que el nivel de privilegio del segmento (expresado en el campoDPL del descriptor).

Bien, sabemos que los descriptores de segmentos están en las tablas dedescriptores, pero ¿dónde están los selectores? Los selectores están en losregistros de segmento (CS, DS, SS, ES, FS, GS). Así tenemos que en cadamomento dado hay 6 descriptores que están siendo apuntados por los selectorescontenidos en los 6 registros de segmento del procesador. Pero si hay 6 registros¿cuál se utiliza?

��������$��!������������������������ →����������$���������������������� →�3��������$����!� ����������������������!����!� →�

Page 70: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��'- ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� �������������

����1�S����1�=����1�:����1�C����1�B����1�D����1�<����1�A

1�1�11�1�11�1�1

����1�S����1�=����1�:����1�C����1�B����1�D����1�<����1�A

1�1�11�1�11�1�1

Í N D I C E T I RPL=D C S

��#���#�$�"� �!

"��K�= "��K�S

"�������,���������

������

"�������,���������

��������

������������������� ��������������������

�������

$� �#�#$" !,� �#�#$" !�� �#�#$" !#� �#�#$" !.� �#�#$" !�� �#�#$" !

,�1�*��� ��/��� '�������

!�����������,���������

Page 71: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��'�

La selección del registro a utilizar se realiza automáticamente en función del tipo dedireccionamiento que se está realizando (a código, a datos o a la pila). Para accedera un dato situado en uno de los segmentos auxiliares de datos (ES, FS o GS) hayque indicarlo explícitamente mediante un prefijo de instrucción.

¡Pero según este esquema, cada referencia a memoria generada por la CPUoriginaría realmente dos accesos! uno para obtener el descriptor del segmentoindicado por el selector y otro para acceder propiamente al dato, lo que significaríauna duplicación en el tiempo de acceso.

Para evitar esto, se dispone de una memoria caché, también conocida como'������� � �����������, que contiene los 6 descriptores apuntados por losselectores cargados en los registros de segmento (Ver Figura 33). Elcontenido de estos registros de descriptores solamente se modifica cuando serealiza una operación de “carga de registro de segmento”, momento en el quehabría que acceder a memoria para cargar el descriptor correspondiente al nuevoselector cargado en el registro de segmento.

De esta manera, si está alimentando una instrucción (interviene el registro IP) seutiliza directamente el registro de descriptor de código, cuyo contenido es eldescriptor del segmento de código; si se está accediendo a un dato, se utiliza elregistro de descriptor de datos, etc.

Para ayudar a ver de forma general el sistema de segmentación, presentaremos elescenario completo de un programa desde que se escribe hasta que se ejecuta.

1. El usuario escribe, en un lenguaje de alto nivel, un programa compuesto dedistintos módulos, procedimientos, funciones, variables globales y locales a lossubprogramas, tablas, etc. sin preocuparse de si la máquina en la que se va aejecutar tiene o no una memoria segmentada.

2. Al traducir cada módulo, el compilador, además de producir el códigocorrespondiente, estructura el código y datos generados en varios segmentos decódigo, de datos y de pila.

3. En la fase de montaje, al unir todos los módulos componentes del programa, seresuelven todas las referencias externas y se forma un único módulo cargable,estructurado en múltiples segmentos correspondientes a los subprogramas yestructuras de datos del programa completo. El montador también se encargade numerar cada uno de los segmentos utilizados. El código generado incluyelas instrucciones necesarias para que cada vez que se haga referencia a unanueva sección de datos, se cargue el registro de segmento correspondiente(DS, SS, ...) con el selector apropiado.

4. Una vez cargado el módulo en memoria principal, las primeras instrucciones quese ejecutarán serán las encargadas de cargar los registros de segmento CS, DSy SS con los selectores correspondientes a los segmentos que contienen lasprimeras instrucciones y datos del usuario, así como de la pila de trabajo.

Page 72: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��'� ��������������

5. Al cargar los registros de segmento, se accede a las tablas de descriptores paraobtener los descriptores correspondientes, y automáticamente se almacenan losdescriptores obtenidos en los respectivos registros de descriptores.

6. Ahora, al empezar a ejecutar ya las instrucciones propias del usuario, se utilizandirectamente los registros de descriptores de los segmentos que contienen lasinstrucciones, datos o pila actualmente en uso.

7. Durante la ejecución, si hay una instrucción que hace referencia a un dato de unsegmento distinto de los que se están utilizando, previamente a está instrucción,debe haber otra instrucción que se encargue de cargar uno de los registros desegmento de datos (DS, ES, FS o GS) con el selector correspondiente alsegmento que contiene el dato que se va a referenciar. Las instrucciones decarga de registros de segmento las inserta automáticamente el compilador, osea, que el programador no tiene que preocuparse de ninguna cuestión relativaal mecanismo utilizado en la gestión de memoria.

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

,QWHO�3HQWLXP 2�����������������#������������������

6(/(&725

5HJLVWURVGH�6HJPHQWR

*6��)6����(6������'6��������66����������&6

3HUPLVRV

/tPLWH

'LU��%DVH

5HJLVWURVGH�'HVFULSWRUHV

8

Z

,����#(����

VL

QR

£�(5525��

6�H�J�P�H�Q�W�R

6�H�O�H�F�F�L�R�Q�D�G�R

'LU��%DVH

GHO�6HJPHQWR

',5(&&,Ð1

/,1($/

Page 73: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��'�

��-��� ������ �����������Una vez tratada la etapa de segmentación, en la que se produce como resultadouna dirección lineal de 32 bits, pasemos a ver la fase de paginación, cuya utilizaciónes optativa. Para tener activada la paginación se debe tener a 1 el bit PG ()����������) del registro de control CR0.

El tamaño de las páginas del Pentium se puede establecer en 4 Kb (212) o en 4 Mb(222). Aquí consideraremos un tamaño de 4 Kb, por lo que para un rango dedirecciones de 32 bits, la memoria virtual está dividida en 220 páginas, o sea, 1Mpágina. Si adelantamos que un descriptor de página ocupa 4 bytes, tenemos quela tabla de páginas de cada proceso ocuparía 4 Mb, lo cual, desde luego, resulta seruna ocupación de memoria bastante considerable. Por otra parte, por el principio delocalidad, no es normal que un proceso haga una referencia uniforme a todo elespacio de direccionamiento de memoria, por lo que seguramente la ejecución deun proceso podría realizarse con bastante menos de 1 Mpágina.

Por este motivo, los descriptores de páginas están estructurados en dos niveles:

• El Directorio de Páginas

• La Tabla de Páginas

El contenido, tanto del directorio como de la tabla de páginas, son descriptores depáginas, cuyo formato es el siguiente:

����� Indica el número de marco ocupado por la página

7 Bit de ensuciado.

� Bit de accedida o referenciada

>B Página de Usuario o Supervisor

0B7 Permiso de lectura/escritura

� Bit de presencia

Echémosle un vistazo a la Figura 34. Puesto que el tamaño de la página es de 4 Kb,los 12 bits de menor peso de la dirección lineal corresponden al desplazamiento. Porlo tanto los 20 bits de mayor peso indican la página. Pues bien, tomando los 10 bitsde mayor peso, y teniendo en el registro de control CR3 la dirección de comienzodel directorio, se hace referencia a una de las entradas del directorio de páginas.Esta entrada hará referencia a su vez a una de las 210 tablas de página del sistema.Ahora, tomando como referencia la tabla indicada en el directorio de páginas ytomando la entrada indicada por los siguientes 10 bits (12 a 21) de la direcciónlineal, se obtiene ya el descriptor de la página correspondiente a la direcciónreferenciada por la CPU.

Page 74: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��'" ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� ������

�#�#$" !=D S

,�����#(����C= S

,���!�#�$�$���%�&��������2���!�"�)�'��

��������������������

"��������,���������

8

,������ � 5��� ,�����J������C= :: =: S

,���1�����5�1

,��������� 5����

8

C= S

,���1�����5�1

"������� 5����

C= S

=S =S

8 ,�1�./��

����

!�'��

,�#���$�!��� �"� �!����,�#���� �R�����&�'

C= =: == Q��? S

$!C

,�1��������� 5�1�6=:11C=7 ����������S��S��# '�S��S )�

�#

C: ,�����2�����

"���*

Page 75: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��'#

De esta forma, no es necesario tener cargada en memoria una tabla de1 Megaentrada, sino que simplemente hay que tener en memoria el directorio y lastablas de páginas que utilice el proceso, no todas.

Una vez obtenido el descriptor de la página referenciada por la CPU, se forma ladirección física a partir del marco (si la página está en memoria) y deldesplazamiento.

El mecanismo de paginación de estos procesadores está diseñado para soportarsistemas de memoria virtual mediante paginación por demanda; sin embargo, susprestaciones se verían muy afectadas si el procesador tuviera que acceder a los dosniveles de tablas en cada referencia a memoria. Para resolver este problema, elPentium mantiene una memoria caché con los descriptores de las páginas másrecientemente referenciadas. Esta caché (denominada TLB o ������ � (�������)consiste en una memoria asociativa de 32 entradas, es decir, que contiene losúltimos 32 descriptores de páginas referenciadas. Ya que las páginas son de 4Kbytes, en la TLB se cubre un área de memoria de 128 Kbytes.

Para sistemas multitarea convencionales, el TLB obtiene una tasa de aciertos del98%, lo que significa que solamente el 2% de las referencias a memoria requeriránel acceso a la estructura de tablas de dos niveles.

��-�%� /�� �����)�������� ����Vamos a ver un ejemplo de direccionamiento a memoria virtual con paginaciónsegmentada en el microprocesador de Intel que hemos tratado.

Vamos a suponer que la CPU, durante la ejecución de una instrucción realiza unareferencia a la dirección de memoria 4C703H para leer un operando.

Sabemos que para calcular la dirección física de la memoria, necesitamos tener eldescriptor del segmento correspondiente, y para conseguir el descriptor desegmento previamente se requiere disponer del selector. Como ya sabemos, losselectores se encuentran en los registros de segmento. Ya que se trata del acceso aun dato (no alimentar una instrucción), el selector que nos interesa se encuentra enel registro de segmento de datos DS. Como podemos ver en la Figura 35, el selectordel DS contiene un índice con valor 27 (1B H), el indicador de tabla (TI) referencia ala Tabla de Descriptores Locales, y el nivel de privilegio de acceso (RPL) es 2.

Con estos datos, se puede acceder a la entrada 27 de la Tabla de DescriptoresLocales y obtener el descriptor del segmento de datos. Obtenido el descriptor, sealmacena en su registro de descriptor correspondiente.

Analizando el contenido del descriptor de segmento obtenemos los siguientes datosrelevantes:

Page 76: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��'& ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� #����������,��������������������������������������������B$ASC��6��1������7

,�����#(������B$ASC���6=SS�==SS�S===�SSSS�SS==7

����1�S����1�=����1�:����1�C����1�B����1�D����1�<����1�A

1�1�1����1�=*

1�1�1

00 0000 0001 1011 1 1 0

T I RPL

"��K�=

"�������,���������������

,� �������

!,�$�!,�,�!,���!,�#�!,�.�!,���

!�����������,���������

Base 31..24 G D Lím. 19..16 P DPL S T i p o A Base 23..16

0000 0000 0 0 0 0 0101 1 0 1 0 0 0 0 0 0000 0000

Base del Segmento 15..0

0011 0000 0000 0000Límite del Segmento 15..0

0010 0000 0000 0000

,��������������������,�

*��������������������CSSS� , �� =�/���� D:SSS� 6ZB$ASC7 ������� S�6������7������������ S

,�1� ���������*�������1�8�,�1�#(�����K�CSSS�8�B$ASC�K�B.ASC��

���������������� �!"#$%�&

Page 77: [003] Sistemas Operativos - Gestion de Memoria

�����������������

�������������� ��''

Base del segmento: 3000HLímite del segmento: 52000HDPL: 1Sistema: 0 (de usuario)Granularidad: 0 (byte)

Ya que la dirección efectiva no excede el límite del segmento y que el DPL no esmayor que el RPL (se tiene privilegio de acceso), se puede continuar calculando ladirección lineal, así, ésta se obtiene sumando simplemente la base del segmentomás la dirección efectiva, esto es, 3000H + 4C703H, obteniendo que !����������!����!����"<'-�:.

En la Figura 36 podemos ver que el bit de paginación del registro de control CR0está activado, luego hay que continuar con el proceso de paginación para obtener ladirección física.

Descomponiendo la dirección lineal 4F703 obtenemos un directorio de páginas (0),una página (4FH) y un desplazamiento (703H).

El registro de control CR3 contiene F12000H como dirección de comienzo deldirectorio de páginas. Tomando la entrada 0 de este directorio, obtenemos eldescriptor de la página que contiene la tabla de páginas que nos corresponde, elcual apunta a la dirección 42B74H, dirección en la que se encuentra por tantonuestra tabla de páginas.

Obtenida la tabla de páginas, accedemos ahora al descriptor de la página donde seencuentra la dirección referenciada. La página en cuestión la obtuvimos de ladescomposición de la dirección lineal, resultando ser la página 4FH, por lo queaccedemos a la entrada 4FH de la tabla de páginas (que estará en la dirección42B74H + (4FH x 4), ya que cada entrada ocupa 4 bytes) y obtenemos el descriptorde la página.

Como se puede ver en la parte inferior de la Figura 36, el marco donde se encuentrala página es el 125A3H y está presente en memoria. Ya que el tamaño de cadapágina ( o marco) es de 4 Kb (1000H), la dirección del marco indicado se hallarámultiplicando el número de marco por 212, es decir, 125A3000H.

Ya solamente resta por sumar el desplazamiento a la dirección base de la páginapara obtener la ���������(1����, esto es, 125A3000H + 703H = ��#��'-�:.

Debemos comentar ahora, que al entrar en la etapa de paginación se consulta lamemoria asociativa de direcciones (TLB), y si la dirección lineal se encuentra enesta memoria, no es necesario realizar todo el proceso de paginación puesdirectamente se obtendría la dirección física correspondiente.

Page 78: [003] Sistemas Operativos - Gestion de Memoria

�����������������

��'+ ��������������

6LVWHPDV�2SHUDWLYRV�, *HVWLyQ�GH�0HPRULD�����

������ ����� 111#����������,����������

�,������ � 5��� ,�����J������

,���1�����5�1

,��������� 5����

8

C= S

,���1�����5�1

"������� 5����

C= S

=S =S

8 =:D'CASC,�1�./��

����

!�'��

.=:SSS

SSS�SSS�SS���SS�S=SS�====��S====�SSSS�SS==

!"#$%�&�6,����������7

C:��$��= �

��%

B:*ABSSS

8B.VB =:D'CSSS

ASC��

B�:�*�A�B���� S��S��S �����S���S���=����=���S���S����=���=���=

,�1����������5�1�6=:11C=7�!����������������������#����'���������������M���M���

������ ��'������� � �'��()����

=�:�D�'�C���� S��S��S �����S���S���S���=���S���S����S���S��=

,�1����������5�1�6=:11C=7�!����������������������#����'���������������M���M���

������ ��'�����*�����'��()����