<< >> Título

Implementación del SFB


Estructura del sistema de ficheros básico

El Sistema de Ficheros Básico define una organización muy simple del disco virtual, como se muestra en la figura:

Salvo el superbloque, las distintas áreas del disco tienen un tamaño variable, que se define cuando se formatea el disco.

El superbloque

El primer bloque del SFB es el superbloque, lo cual viene impuesto por la interfaz del NBF. El Sistema de Ficheros Básico añade alguna información al superbloque, con parámetros del formateo del disco e información de control (p.ej. dónde está el primer bloque de datos libre). Esta es una de las partes más delicadas del SFB, ya que si se guardan valores incorrectos, probablemente el sistema se vuelva inutilizable.

Hay definida una estructura de datos, struct DescriptorSFB, en la cual, entre otras cosas, se declaran los campos que residen en el superbloque. La estructura y sus rutinas de manipulación se encuentran en descr.h (interfaz) y descr.c (implementación).

BFB: Bloques de ficheros básicos

Los bloques de ficheros básicos (BFB) son una serie de estructuras donde se almacena la información de cada uno de los ficheros de este sistema. La cantidad total de BFB se determina en el momento del formateo (args[0] en la función FormateaSFB()).

Cada BFB ocupará un tamaño fijo. Es importante calcular en el formateo cuántos BFB caben en un bloque físico, así como cuántos bloques físicos hacen falta para albergar todos los BFB requeridos.

En la implementación actual, cada BFB contiene: el estado del BFB (libre u ocupado), el nombre del fichero, su IFB y un apuntador al primer bloque de datos. Cuando reformen el código, tendrán que añadir nuevos campos al BFB, por ejemplo, la longitud, u otros apuntadores a bloques de datos.

La gestión de los BFB se encuentra separada en los archivos bfb.h y bfb.c. En ellos se define el tipo estructurado BFB más unas cuantas subrutinas de manipulación.

Bloques de datos

Para almacenar la información de los ficheros, el SFB emplea los bloques de datos. Todos los bloques de datos tendrán el mismo tamaño, que vendrá dado en número de bloques físicos necesarios para un bloque de datos.

La función TamBloqueDatos() devuelve el tamaño en bytes de un bloque de datos. Normalmente, este tamaño será el tamaño de un bloque físico multiplicado por el número de bloques físicos que tiene un bloque de datos. Si van a implementar una asignación de espacio enlazada, parte del bloque de datos se consume en los encadenamientos.

Los bloques de datos se numeran de cero en adelante.

Descriptor del SFB (struct DescriptorSFB)

La estructura DescriptorSFB

Tal y como se ha expuesto anteriormente, el bloque cero del disco virtual almacena información de configuración y estado general del Sistema de Ficheros Básico. Se ha definido un tipo de datos estructurado, llamado struct DescriptorSFB, en el que se guardará información global sobre el sistema de ficheros. Los campos que guarda pueden dividirse en tres categorías:

* Datos del formato del SFB, generados durante FormatoSFB()

* Datos permanentes (se tienen que preservar en disco)

* Datos transitorios (no hace falta guardarlos en disco)

Información permanente en disco (superbloque)

En el bloque cero del disco, el SFB guarda cierta información sobre el formato realizado. Por ejemplo: número de BFBs, tamaño del bloque de datos (medido en bloques físicos), etc. También se guarda información de estado, como un apuntador al primer bloque de datos libre: esta información cambia cuando se crea un fichero o cambia de tamaño, y hay que mantener el dato actualizado en disco, porque si no el SFB no se podría seguir utilizando en el futuro.

La información se guarda en el bloque cero, justo después de los parámetros del disco (ver apartado dedicado al NBF). Las subrutinas LeeSuperbloque() y EscribeSuperbloque() encapsulan la lectura y escritura de todos estos parámetros entre disco y memoria.

En la siguiente gráfica se muestran algunos campos de la estructura DescriptorSFB, indicando lo que representan en la organización del disco.

La variable global DESC

Hay una variable global de este tipo, llamada DESC, que se utiliza profusamente por todo el código. Esta variable guarda todos los parámetros generales de configuración y formato del disco actualmente montado. En el momento del montaje (función MontaSFB()), la variable DESC se carga con los valores propios del sistema que se monta; para ello existe la función LeeSuperbloque().

Cada vez que se altera la información de la variable DESC, se guardan los cambios en el disco, para evitar inconsistencias. La salvaguarda en disco se realiza mediante EscribeSuperbloque(). La variable cambia, por poner algún caso, cuando se crea un nuevo fichero, cuando se borra, etc.

Cuando modifiquen el código, seguramente habrán de añadir nuevos campos en la estructura DescriptorSFB, y retocar en consecuencia las funciones LeeSuperbloque() y EscribeSuperbloque().

El nivel de bloques físicos

Como se comentó al principio, este nivel ofrece una interfaz con un disco virtual. los datos se organizan en forma de bloques contiguos de tamaño fijo (bloques físicos).

El disco virtual se define como un conjunto de bloques físicos contiguos de tamaño fijo, como muestra el diagrama. Los bloques físicos están numerados de cero en adelante.

Las rutinas del Sistema de Bloques Físicos tienen la interfaz preparada para manejar una caché de bloques, pero en este trabajo ustedes no tendrán que tratar con eso.

El bloque cero: parámetros del disco

El primer bloque de un disco virtual se usa para guardar los parámetros del disco, en concreto: el tamaño del bloque físico en bytes y el número de bloques físicos. El bloque cero no es utilizable como bloque de datos corriente, ya que se destruirían los parámetros del disco. Así pues, el primer bloque físico realmente utilizable es el número 1 (uno).

Los campos del bloque cero se muestran en este esquema, en el mismo orden en que se guardan en el disco.

Char magico[8]

Cadena de caracteres para verificar el formato
WORD tam_bloque_fisico
Tamaño en bytes de un bloque físico
DWORD num_bloques_fisicos
Cantidad total de bloques físicos

El único campo que es pertinente resaltar ahora es magico. Este campo es una cadena de ocho caracteres cuyo único propósito es dar un indicio de que el archivo UNIX puede ser un sistema de ficheros válido. Se supone que todos los discos formateados en las prácticas deberían tener la misma cadena en magico. El valor que se propone en los ficheros de interfaz es "SOPA123".

Los datos del bloque cero se recuperan con la función LeeDatosDisco().

Funciones del nivel físico

Todos los accesos al disco virtual serán a través de estas funciones, que aparecen en el fichero cabecera sffisico.h

Instalación y montaje:

int FabricaDisco ( const char* fichero_UNIX,

WORD tam_bloque, DWORD num_bloques );

int MontaDisco ( const char* fichero_UNIX, int nbloques_cache );

int DesmontaDisco (void);

Acceso a bloques e información del disco:

int LeeDatosDisco ( WORD* tam_bloque, DWORD* num_bloques );

int LeeBloqueFisico ( DWORD nbloque, void* bufer );

int EscribeBloqueFisico ( DWORD nbloque, const void* bufer );

Gestión del espacio

El SFB utiliza una zona para los bloques de datos. Cada bloque de datos ocupa una cantidad fija de bloques físicos. El tamaño de los bloques de datos se determina al formatear el sistema de ficheros.

La gestión de espacio libre es mínima en esta implementación. Solamente se mantiene un apuntador al primer bloque de datos libres (campo primer_bloque_libre de la variable DESC). Cada vez que se crea un fichero, se le asigna un espacio fijo a partir de ese apuntador, y se incrementa el apuntador un número fijo de bloques. Nunca se libera espacio.

Precisamente ustedes tendrán que modificar el código para realizar una gestión eficiente de los bloques de datos.


<< >> Título