• No se han encontrado resultados

Paginado por demanda

In document Conceptos de Sistemas Operativos (página 119-123)

Un sistema de paginado bajo demanda es similar a un sistema de paginado con swapping (Figura 9.2). Los procesos residen en memoria secundaria (el cual es usualmente un disco). Cuando queremos ejecutar un proceso, lo traemos a la memoria (swap in). Pero en realidad no se trae el proceso completo sino aquellas páginas que se necesiten (es decir, que se demanden, que se pidan). Como ahora los procesos se ven como un conjunto de páginas y no como una única unidad, ya no utilizaremos el término swapper sino pager, el cual se relaciona con las páginas de un proceso (swap se relaciona con procesos completos). Ante esto, se utilizara el término pager en relación con el paginado bajo demanda.

Página 0 Página 1 Página 2 . . . Página n

Figura 9.1 Diagrama que muestra la memoria virtual más grande que la memoria física. Memoria

virtual Mapeo de memoria

Memoria física

Cuando un proceso está para ser traído a memoria, el pager adivina cuales son las páginas que serán usadas antes de que el proceso sea nuevamente sacado de la memoria. En lugar de traer el proceso completo, lo que hace el pager es traer a memoria aquellas páginas que se necesitaran. Esto evita traer a memoria páginas que nunca se usaran, disminuyendo el tiempo de swap y la cantidad de memoria física necesitada. Con este esquema, se necesita soporte de hardware para saber cuales son las páginas que están en memoria de aquellas que no lo están. Ante esto, se puede usar el bit de valido-invalido. Sin embargo, esta vez cuando el bit esta seteado a valido indica tanto que la página es legal y además esta en memoria. Si el bit esta seteado a invalido indica o que la página no es valida (es decir, no es del espacio de direcciones lógicas del proceso), o es valida pero la página se encuentra en disco. La entrada de la tabla de páginas para una página que esta siendo traída a memoria es seteada como de costumbre, mientras que la entrada de la tabla de páginas para una página que no esta actualmente en memoria es simplemente marcada como invalida, o contiene la dirección de la página en el disco (Figura 9.3).

Note que marcar una página como invalida no tendrá efecto si el proceso nunca intenta acceder a la misma. De hecho, si el pager adivinó todas las páginas que usará el proceso mientras ejecuta, entonces nunca se verá una página que tenga el bit en inválido. Pero en caso de que el proceso intente acceder a una página que no esta en memoria, el bit marcado como invalido provocara un trap al sistema operativo por fallo de página. Los pasos cuando se intenta acceder a una página que no esta en memoria son los siguientes (Figura 9.4): 0 1 2 3 4 5 6 7 8 9 10 11 swap out swap in Memoria principal Programa A Programa B

Figura 9.2 Transferencia de una memoria paginada a lugares contiguos de memoria.

A 0 B 1 C 2 D 3 E 4 F 5 G 6 H 7 4 0 v 1 i 6 2 v 3 i 4 i 9 5 v 6 i 7 i 0 1 2 3 A 4 5 C 6 7 8 F 9 10 A B C D E F Bit valido-invalido Memoria lógica Tabla de páginas Memoria fisica Frame

Figura 9.3 Tabla de página cuando algunas páginas no están en memoria principal.

1. Chequear en una tabla interna (normalmente mantenida por el PCB) de este proceso, para determinar si fue una referencia de acceso a memoria valida o invalida.

2. Si la referencia fue invalida, terminar el proceso. Si fue valida, pero la página no esta en memoria, se traerá la página.

3. Se encuentra un frame libre (tomando uno de la lista de frames libres, por ejemplo). 4. Traer la página del disco y ubicarla en el frame elegido.

5. Cuando se completo la operación de lectura, modificar la tabla interna para ese proceso y la tabla de página para indicar que la página ahora esta en memoria.

6. Reiniciar la instrucción que fue interrumpida por el trap de dirección ilegal. Ahora, el proceso puede acceder a la página como si siempre hubiera estado en memoria.

Note que como se almacena el estado del proceso interrumpido (registros, código de condición, contador de instrucción) cuando ocurre un fallo de página, podemos continuar el proceso exactamente en el mismo lugar y estado, excepto el hecho de que la página deseada está ahora en memoria y se puede acceder. De esta forma, somos capaces de ejecutar un proceso, aun aunque haya porciones que no estén en memoria. Cuando el proceso trata de acceder a lugares que no están en memoria, el hardware envía un trap al sistema operativo (fallo de página). El sistema operativo lee la página deseada, la ubica en memoria y continúa el proceso como si la página siempre hubiese estado en memoria.

En el caso extremo, el proceso se comenzaría a ejecutar sin páginas en memoria. Cuando el sistema operativo setea el puntero de instrucción con la primer instrucción del proceso, la cual pertenece a una página que no esta en memoria, el proceso provocara inmediatamente un fallo de página. Luego de que esta página fue traída a memoria, el proceso continuara su ejecución fallando hasta que cada página que necesite este en memoria. En este punto, el proceso ejecutara sin fallos. Este esquema es el paginado bajo demanda puro: nunca una página es llevada a memoria hasta que no se necesite.

Teóricamente, algunos programas pueden acceder a varias nuevas páginas de memoria con la ejecución de cada instrucción (una página para la instrucción y muchas para los datos), posiblemente causando muchos fallos de página por instrucción. Esta situación provocaría una caída en la performance, pero generalmente las instrucciones hacen referencia a partes locales.

El hardware para soportar paginado bajo demanda es el mismo que el utilizado para soportar paginado y swapping:

Tabla de páginas: esta tabla tiene la habilidad de marcar una entrada invalida a través del bit

valido-invalido o por valores especiales de bits de protección.

Memoria secundaria: esta memoria almacena aquellas páginas que no están presentes en memoria

principal. La memoria secundaria es usualmente un disco de alta velocidad. Además de este hardware, se necesita considerable software.

También se deben imponer algunas restricciones en cuanto a la arquitectura. Un problema importante es la necesidad de ser capaz de recomenzar cualquier instrucción luego de un fallo de página. Un fallo de página

load M i Frame libre 3 2 1 6 5 4 Tabla de página Sistema operativo Memoria fisica

Figura 9.4 Pasos en el manejo de un fallo de página. 1. Referencia. 2. Trap.

3. La página esta en el almacenamiento secundario. 4. Llevar la página a la memoria principal. 5. Resetear la tabla de páginas.

puede ocurrir en cualquier referencia a memoria. Si el fallo de página ocurre cuando la instrucción se está trayendo (es decir, se fue a buscar la instrucción a la memoria principal y no estaba), es decir, en la parte fetch (se va a ubicar en la CPU), se puede recomenzar la instrucción simplemente ubicando nuevamente la instrucción en la CPU. Si el fallo ocurre cuando se está buscando un operando, se debe reubicar la instrucción completa en la CPU, decodificarla nuevamente, y luego finalmente ir a buscar el operando (ya que de seguro esta porque el fallo fue provocado por dicho operando).

Como el peor caso, consideremos la instrucción de tres direcciones tal como Add el contenido de A a B y ubicar el resultado en C. Las etapas para ejecutar esta instrucción podrían ser:

1. Buscar y decodificar la instrucción (ADD). 2. Buscar A.

3. Buscar B. 4. Sumar A y B.

5. Almacenar la suma en C.

Si el fallo ocurre cuando el resultado se va a almacenar en C (ya que C esta en una página que no esta en memoria), debemos ir a buscar la página deseada, corregir la tabla de página, y recomenzar la instrucción. Este recomenzado requerirá ir a buscar la instrucción nuevamente, buscar nuevamente los dos operandos, y luego sumar nuevamente.

La mayor dificultad ocurre cuando una instrucción puede modificar varios lugares diferentes. Por ejemplo, consideremos la instrucción MVC del sistema IBM 360/370, el cual puede mover hasta 256 caracteres desde un lugar a otro, posiblemente sobreescribiendo lugares. Si el bloque fuente o destino se sobrescriben, el bloque fuente puede estar siendo modificado, por lo que en tal caso no basta con simplemente recomenzar la instrucción. Una solución a este problema es usar registros temporarios para mantener los valores que se vayan a sobreescribir. En caso de que exista un fallo de página, todos estos valores son escritos en memoria antes de que ocurra el trap al sistema operativo. Esta acción restaura la memoria a su estado anterior de que la instrucción sea iniciada, por lo que la instrucción puede ser repetida.

Un problema de arquitectura similar ocurre en maquinas que usan modos de direccionamiento especial, incluyendo modos de autoincremento u autodecremento (por ejemplo, el PDP-11). Estos modos de direccionamiento usan un registro como un puntero y automáticamente decrementan o incrementan el registro como indicado. El autodecremento automáticamente decrementa el registro before usando su contenido como la dirección del operando; autoincremento automáticamente incrementa el registro after

usando su contenido como la dirección del operando. Así, la instrucción: MOV (R2)+, -(R3)

copia el contenido del lugar apuntado por el registro 2 en el lugar apuntado por el registro 3. El registro 2 es incrementado (por 2, ya que PDP-11 es una computadora direccionable a byte) luego de que es usado como un puntero; el registro 3 es decrementado (por 2) antes de que es usado como un puntero. Ahora consideremos que ocurre si ocurre un fallo de página cuando tratamos de almacenar en el lugar apuntado por el registro 3. Para recomenzar la instrucción debemos resetear los dos registros a los valores que tenían antes de que comience la ejecución de la instrucción. Una solución es la de crear un nuevo registro de estado especial para grabar el número de registro y la cantidad modificada por cualquier registro que es modificado durante la ejecución de la instrucción. Este registro de estado permitirá al sistema operativo anular los efectos de una instrucción ejecutada parcialmente que causa un fallo de página. Estos ejemplos muestran algunos de los problemas que puede causar agregar paginación por demanda a una arquitectura existente. La paginación es agregada entre la CPU y la memoria. Así, muchas personas creen que la paginación puede ser agregada a cualquier sistema. Aunque ésta idea es verdadera en un entorno de paginación no a demanda, donde un fallo de página representa un error fatal, esto no es verdadero en el caso donde un fallo de página solo significa que una página adicional debe ser traída a la memoria y el proceso continuara.

In document Conceptos de Sistemas Operativos (página 119-123)