Page Eviction

Si no hay espacio... ¡hacemos el espacio!

Un poco de Explicación

Antes no le dábamos importancia cuando la RAM se llenaba y no había frames disponibles; simplemente PintOS mataba al proceso y terminaba de ejecutarse. A partir de esta sección, ese problema debemos de resolverlo.

Cuando la RAM se llena, se puede dar el caso que un proceso provoca un Page Fault y quiere crecer su Stack, entonces como protocolo, se debe de escoger un frame como víctima, escribirla al Swap si es necesario, escribirle los contenidos necesarios a ese frame libre y por último actualizar la Page Table del proceso.

Entonces, Page Eviction se resume a lo siguiente:

  1. Escoger un frame candidato a ser reemplazado.

  2. Escribir los contenidos de ese frame al Swap File si fuese necesario.

  3. Escribir el contenido deseado en ese frame libre.

  4. Actualizar la Page Table del proceso

Objetivo

Implementar la funcionalidad de Page Eviction en PintOS.

Implementación

Los pasos anteriormente descritos son muy generales, así que no te ilusiones mucho si piensas que es poco lo que tienes que hacer.

Paso 1: Situación cuando debo hacer Page Eviction

Como anteriormente se ha descrito, sabemos que la RAM está llena cuando palloc_get_page() devuelve un valor NULL.

Paso 2: Escoger Frame candidato

En un mundo ideal, la política que debes de escoger es LRU, pero los algoritmos de Clock y Second Chance son opciones bastante accesibles.

La implementación queda a tu discreción.

Para escoger el frame candidato, deberás usar la Frame Table, ya que es el único lugar donde tienes el registro sobre cada frame que está en uso.

Paso 3: Escribir los contenidos al Swap File, si fuese necesario

Como se ha mencionado anteriormente en la guía, tiene sentido escribir al Swap todos aquellos frames que no son read-only y los que son read-only no se escriben ya que se pueden obtener leyendo del ejecutable otra vez.

Si en tal caso escribes la frame al Swap File, debes tomar en cuenta muchas cosas en consideración:

  • Debes saber qué sectores fueron utilizados para escribir ese frame.

  • Debes de ser capaz de indicar que los contenidos de ese frame pasaron de estar en la RAM al Swap File.

Por algo se tiene la Supplementary Page Table

Además de ello, no se te olvide que debes invalidar la página en la Page Table del proceso que estaba asociado a este frame candidato.

Paso 4: Escribir el contenido deseado a ese Frame

En este caso, puedes hacer inicializar toda la frame en 0.

Paso 5: Actualizar la Page Table del Proceso

Ahora que ya tenemos un frame disponible, debemos de asociar la página del proceso (que causó el page fault) con ese frame y actualizamos la Page Table del proceso.

Te recomiendo que leas el archivo: userprog/pagedir.c.

FAQ

  • ¿Debo conservar la FTE del frame candidato?

    No, lo debes borrar.

  • ¿Pueden ocurrir cosas extrañas al hacer free()?

    Sí, debes de tener mucho cuidado dependiendo de la estructura que elegiste para la Frame Table. Es buena idea ir a leer todas las funciones que se usen para remover cierto elemento de esa estructura de datos.

  • ¿Debo crear un nuevo FTE cuando asocio el frame con la nueva página del proceso?

    Sí.

  • ¿Debo borrar algún SPTE?

    No, esos se conservan.

Última actualización