Read & Write

Nuestros viejos amigos... un gusto volverlos aver

Un poco de Explicación...

En la fase 2 no tenías que lidiar con reads o write que usen más de una página, pero en esta fase, es un problema tedioso.

Cuando se hace un read o un write, se deben de pre-cargar las páginas y frames que el proceso utilizará.

¿Por qué se deben de pre-cargar? Asume un archivo que su tamaño total ocupa 5 frames y quieres leer todo contenido, entonces dentro del proceso existirán 5 páginas adicionales que luego en el proceso de traducción se traducen a esos 5 frames.

Si no los pre-cargas, se generan page faults. La diferencia de estos page faults con los anteriores que has lidiado, es que en los anteriores se provocan en el modo user. Estos page faults generados por los syscalls hacen que el sistema transicione del modo user a modo kernel.

Como anteriormente lo planteamos, si ocurre un page fault en modo kernel y no dependes exclusivamente de page_fault() para manejar validaciones de direcciones, entonces matas al proceso de manera inmediata.

Para evitar lo anterior, es por ello que se pre-cargan los frames y las páginas que el proceso utilizará.

Estos frames que son pre-cargados, por ninguna razón deben de ser posibles candidatos a ser reemplazados por algún Page Eviction que pueda ocurrir. A partir de esta premisa surge el concepto de "pin", que es dejar la frame y la página asociada intactas en la RAM y pueden ser candidatos a reemplazo una vez el read/write se haya efectuado.

Esto significa que debes modificar el algoritmo que implementaste para escoger un frame candidato y debes guardar información adicional que pueda decirte si es un pinned frame o no.

Implementación

Te dejaré el código base sobre las 2 funciones que debes implementar:

// El tipo de retorno de ambas funciones puedes modificarlo

void preload_and_pin(void * buffer, size_t size) {
    // Aqui va tu codigo
}

void unpin(void * buffer, size_t size) {
    // Aqui va tu codigo
}

Yo sé, soy una guía muy generosa :D

Te divertirás haciendo un poco de matemática.

FAQ

  • ¿En dónde coloco estas funciones?

    Te he dado una pista en la sección de "Un poco de Explicación...".

  • ¿Solo es necesario hacer esto en el Syscall de Read y Write?

    Sí.

Make Grade

Con estos syscalls implementados, pasas todas las pruebas que no utilizan Mmap o Unmap.

Al correr las pruebas, aprobarás exitosamente los siguientes:

Functionality

Robustness

Última actualización