Page Eviction
Si no hay espacio... ¡hacemos el espacio!
Última actualización
Si no hay espacio... ¡hacemos el espacio!
Última actualizació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:
Escoger un frame candidato a ser reemplazado.
Escribir los contenidos de ese frame al Swap File si fuese necesario.
Escribir el contenido deseado en ese frame libre.
Actualizar la Page Table del proceso
Implementar la funcionalidad de Page Eviction en PintOS.
Los pasos anteriormente descritos son muy generales, así que no te ilusiones mucho si piensas que es poco lo que tienes que hacer.
Como anteriormente se ha descrito, sabemos que la RAM está llena cuando palloc_get_page() devuelve un valor NULL.
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.
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.
En este caso, puedes hacer inicializar toda la frame en 0.
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.
¿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.