<< >> Título

Caché de disco


Un sistema de ficheros es una estructura de datos compleja instalada sobre un soporte persistente, el disco, diferente de la memoria principal. Olvidando esta diferencia crucial, las similitudes entre las estructuras de datos en memoria y en disco son bastantes. Por ejemplo, el principio de localidad se cumple también con los ficheros: es muy probable que los accesos futuros a un fichero se hallen próximos a los hechos en el pasado reciente.

Por otro lado, en todo sistema de ficheros suele haber un conjunto de bloques de disco que contienen información descriptiva del sistema (en nuestro caso, puede ser el superbloque); o bien estructuras de gestión del sistema: mapas de bits, estructuras de directorio, bloques descriptores de fichero, etc. Si todos esos bloques se utilizan con mucha frecuencia, puede ser deseable mantenerlos en memoria de forma más o menos permanente.

La existencia del principio de localidad y de los bloques muy usuados invitan al desarrollo de un sistema de caché que almacene los bloques de disco que se consideren mejores candidatos a ser accedidos en un futuro inmediato.

Se propone así un trabajo práctico en el que se diseñará e implementará una caché de bloques físicos de disco, aplicando varias políticas de las estudiadas en la asignatura.

Interfaz con el disco manejado

La caché operará sobre discos virtuales, implementados sobre ficheros UNIX. La organización del disco y su interfaz funcional serán las definidas en el Sistema de Bloques Físicos (ver página ). Los desarrolladores dispondrán de varios fuentes en C con la interfaz y la implementación de las funciones de manejo del disco.

Los archivos que han de manejar son:

sbfisico.h

Interfaz con el disco virtual
sbfisico.c
Implementación de las funciones del disco
tipos.h
Tipos de datos básicos
errores.h
Constantes de error
superblq.h
Estructura del superbloque

Interfaz de la caché

En este trabajo, ustedes habrán de retocar las funciones de interfaz LeeBloqueFisico y EscribeBloqueFisico de manera que no accedan siempre al disco, sino que se trabaje con una caché que ustedes diseñarán.

La función MontaDisco ha de reconocer el parámetro nbloques_cache, que indica cuántos bloques físicos se desean para la caché. El sistema que implementen tomará este parámetro como una simple indicación. En caso de que, por problemas de espacio, no se pueda habilitar una caché del tamaño solicitado, se dispondrá del máximo tamaño posible. La función MontaDisco nunca producirá un error por problemas de espacio de caché.

Por su parte, la función DesmontaDisco debería descargar la caché: copiar en disco todos aquellos bloques modificados en memoria principal que no hayan sido actualizados en disco.

Por último, es planteable, aunque no obligatorio, modificar las funciones LeeSuperbloque y EscribeSuperbloque de manera que el superbloque del disco sólo se cargue una vez y se mantenga en memoria de forma permanente.

Según se ve, el trabajo consiste principalmente en alterar la implementación de los servicios del Sistema de Bloques Físicos, dejando la interfaz intacta. El punto de partida será una implementación primitiva, sin caché, que encontrarán en /prac/src/sbfisico.c

Aparte de lo anterior, se tendrá que crear una función para imprimir un informe sobre la caché. Su prototipo será

void InformeCache (void);

y devolverá principalmente información sobre estadísticas de uso, como tasa de éxitos de la caché, número de accesos totales, de lectura y de escritura, etc.

Políticas de la caché

En el trabajo se han de probar tres políticas de sustitución. Implementarán la LRU (menos recientemente usada), la LFU (menos recientemente usada) y otra más de su elección.

Las tres políticas se implementarán en respectivas versiones del programa, para poder probarlas por separado.


<< >> Título