Aproximación Teórica a los Sistemas de Ficheros
Este es el primer post de lo que debería ser una pequeña serie sobre losSistemas de Ficheros (File System) o F.S. a partir de ahora, en este primerPost vamos a ver el concepto de F.S. y de forma general como se aplican estosconceptos a F.S. reales.
Bien cuando hablamos de F.S. nos referimos a la manera en que guardamosinformación en un dispositivo de almacenamiento secundario, como sabemos enla arquitectura de un PC el dispositivo de almecenamiento principal loconstituye la memoria principal del sistema o la RAM, pero debido a laslimitaciones de esta (tamaño limitado y volatilidad) requerimos de otrosdispositivos de almacenamiento de mayor capacidad y no volatil, estosdispositivos son los HD,CD,DVD,memorias flash,cintas DAT…
NOTA: En un PC para ejecutar las ordenesde un programa este debe estar en memoria principal, no se puede ejecutardesde el HD, por lo que el proceso sería el siguiente:
- Los bytes que componen el programa son llevados desde el HD a la memoria principal del programa (RAM).
- El S.O. bajo demanda va cargando los bytes (que conforman instrucciones) a los registros de la CPU.
En este ejmplo se ha obviado la memoria caché, que es una memoriasituada entre la RAM y la CPU de tamaño más reducido que la anterior peromucho más rápida en la cual se almacenan aquella información que es muydemandada por la CPU ganando en velocidad. Hay dos tipos de memoria caché, lainterna, primer nivel o L1 situada dentro del chip de la CPU y la externa,segundo nivel o L2 situada en la misma placa del micro pero fuera de la CPU(se da siempre que L2>L1).
NOTA: En un disco rígido, lalectura/escritura se realiza mediante un cabezal mecánico que vadesplazandose sobre un disco en rotación, independientemente de la geometríadel disco, la unidad mínima de trabajo del cabezal se denomina sector (unidadelemental física), por encima tenemos la capa software mediante la cualabstraemos esta medida a otra llamada bloque (también llamado cluster, hayalgo de controversia en la nomenclatura) esta medida específica del F.S.constituye la unidad de trabajo del F.S. y es de tamaño fijo e invariabledesde que aplicamos un formato, es por tanto la unidad elemental lógica,siendo la que nos interesa ya que el F.S. trabaja con ella y de formatransparente la implementará con ‘x’ cluster.
CONCEPTO DE FICHERO:
El FS tiene en el fichero la unidad lógica de almacenamiento, el ficheroes una secuencia de bits (enfoque seguido por los S.O.), registros (tarjetasperforadas, casi extinto), arbol(bases de datos)… con un formatoidentificacble por su creador y distinguido por un nombre y unosatributos.
Hay distintos tipos de fichero según la finalidad del mismo y por lo tantocon unas características distintas, veamos por ejemplo los tipos de ficherospara un sistema UNIX:
- Ficheros Regulares: Son ficheros ASCII o binarios.
- Directorios: Ficheros especiales gestionados por el S.O. para mantener una estructura dentro del F.S. contienen una entrada por cada fichero que hay dentro de ellos, pudiendo contener los atributos y las direcciones en disco de los mismos (como MS-DOS) o apuntar a una estructura especial que contiene esta información (como UNIX).
- Ficheros Especiales de Caracteres: Empleados para la comnicación de E/S, se utilizan para mapear dispositivos lineales como impresoras,terminales…
- Ficheros Especiales de Bloques: Empleados para modelar dispositivos de almacenamiento como los HD.
Hay dos tipos de forma de acceso a los ficheros:
- Acceso Aleatorio: Se nos permite posicionarnos en cualquier parte del fichero para realizar una operación sobre él, usado en casi todos los dispositivos típicos de almacenamiento.
- Acceso Secuencial: No se permite el posicionamiento a una parte del fichero sin seguir de manera secuencial un orden, usado en cintas magnéticas, por ejemplo.
En cuanto a los atributos y el nombre que puede tener un fichero demomento sólo diremos que depende del S.O. y del F.S. a usar, partiendo deatributos básicos como el propietario y la fecha de creacción a un repertoriobastante alto de los mismos.
IMPLEMENTACIÓN DE FICHEROS:
Ya hemos dicho que el fichero es la unidad lógica fundamental del F.S.pero vamos a ver como se maneja esa unidad elemental en el disco. Ahora unfichero (unidad lógica) se divide en bloques (unidad elemental lógica) paraser guardado en el disco. La forma de asignar estos bloques en el disco puedeseguir distintas implementaciones, y es un elemento muy importante ycaracterístico de un F.S.
Antes vamos a matizar el concepto de fragmentación, hay dos tipos defragmentación, la "fragmentación externa" que se produce cuando los bloquesque se asignan a un fichero cada vez van asignandose más dispersos, debido aque cuando empezamos a asignar espacio para ficheros en discos recienformateados estos se asignan continuos pero cuando vamos borrando yescribiendo estos van dejando huecos en los que luego no podemos alojar unfichero teniendo que asignarle bloques no contiguos, de esta manera empeorael rendimiento ya que hacemos trabajar más al brazo motor del HD. Lafragmentación interna es relativa al tamaño del bloque, si este tiene untamaño por ejemplo de 4Kb, al ser esta la unidad física mínima, no podremostener archivos de menos de estos 4Kb, con lo que aunque un archivo sea de 2bytes, en disco ocupará 4Kb. La fragmentación externa puede ser evitable conF.S. que optimicen la asignación o con aplicaciones software dedefragmentación que se encargan de reagrupar todos los ficheros del F.S. deforma contigua (defragmentador de Windows), mientras que la interna no puedeser evitada y por tanto es muy importante elegir un tamaño óptimo de bloqueen función de nuestras necesidades, teniendo en cuenta que cuanto mayor elbloque más rápidas las operaciones de r/w pero mayor fragmentacióninterna.
- Asignación Adyacente: Los bloques que conforman un fichero son almacenados de forma adyacente en el disco.
- Ventajas:
Es la implementación más facil.
Los directorios sólo deben de guardar la entrada de la primera posición.
Tiene un rendimiento muy alto ya que una vez encontrado el fichero la lectura del mismo es secuencial y no hay que ir haciendo desplazamientos por todo el disco buscando el siguiente bloque.
- Inconvenientes:
Se ha de saber de antemano el tamaño del fichero para saber si hay espacio contiguo para almecenarlo, y esta función de busqueda de espacio contiguo puede ser costosa.
El fichero no puede crecer.
Enorme fragmentación externa del disco.
Pese a sus pegas no hemos de pensar que no es un método válido, pues lo usamos a diario en CD’s y DVD’s, ya que una compilación para estos sistemas es estática, podremos ir llenando el disco mientras tenga espacio libre, pero sin modificar los archivos ya existentes.
- Ventajas:
- Asignación en forma de Lista Ligada: Los ficheros se foman como una lista ligada (simple o doblemente enlazada) de bloques en disco, donde tenemos en cada bloque un puntero a la dirección del siguiente bloque.
- Ventajas:
No hay fragmentación externa.
Los directorios sólo deben de guardar la entrada de la primera posición.
- Inconvenientes:
Pobre rendimiento, el acceso aleatorio es muy lento.
Se desaprobecha espacio de almacenamiento en cada bloque para guardar el puntero.
El tamaño válido para datos ya no es potencia de 2, lo cual es ineficiente para la forma de trabajar de muchos programas en potencia de 2.
Es un sistema de asignación el cual que yo sepa no se aplica en la práctica pero sirve de base para otros como veremos.
- Ventajas:
- Asignación mediante Lista Ligada y un Índice:
Una modificación del anterior donde el puntero que antes guardabamos en cada bloque, ahora se guarda en una estructura aparte en forma de tabla o de índice. Las ventajas son abismales, el acceso es mucho más rápido ya que tenemos "a mano" todos los punteros para localizar los bloques, y no tenemos que recorrer toda la lista leyendo de cada bloque la posición del siguiente, por otro lado no se pierde espacio de almacenamiento en el bloque y este es potencia de 2.
Este sistema es la base de los F.S. actuales y según implementemos la estructura anterior tendremos métodos de asignación muy diferentes:
FAT (File Allocation Table):
Método en el que los índices son guardados en una tabla unidimensional en la que hay una entrada por cada bloque del disco, en los directorios guardamos un único puntero a la tabla por cada archivo de manera que cuando queremos leerlo vamos leyendo las posiciones del archivo en disco desde la tabla donde en cada entrada de la misma nos apunta hacia la siguiente. El principal inconveniente radica en que la tabla para ser recorrida debe estar en memoria y esta puede crecer bastante en un disco de grandes dimensiones o tamaños de bloque pequeños, y la gran fragmentación externa que se origina en discos con muchas operaciones de escritura y borrado . Es el método usado en MS-DOS, disponible en Windows y ampliamente usado en disquetes y memorias flash.
NODOS-I:
En este método a cada archivo se le asocia una estructura llamada nodo-i (nodo índice) el cual contien los atributos y las direcciones en disco de los bloques del fichero. En el nodo-ise encuentran unas direcciones de disco, suficientes para archivos pequeños, en caso de necesitar más direcciones, una entrada apuntaría a un "Bloque Simplemente Indirecto" que contiene más direcciones de disco. Si aún necesita más, el nodo-i tendrá otra dirección de un "bloque Doblemente Indirecto" que contendrá una lista de bloques simplemente indirectos. Si aún no es suficiente se puede utilizar otra entrada para apuntar a un "Bloque Triplemente Indirecto" que contendrá un lista con bloques doblemente indirectos, que a su vez cada uno contndrá otra lista de bloques simplemente indirectos. Este es el método usado tradicionalmente en UNIX.
Vamos a poner un ejemplo de eficiencia en cuanto a recursos, de los dos tipos de asignaciones, supongamos que tenemos un tamaño de bloque de 4Kbytes y direcciones de 32bits y un tamaño máximo de fichero de 24Gbytes, vamos a ver siguiendo los 2 métodos que recursos necesitariamos:
- FAT:
En un bloque de 4Kbytes podemos guardar 1K de direcciones de bloques de 32 bits cada una.
Para un fichero de 24Gbytes necesitamos 6291456 bloques de 4Kbytes.
Necesitariamos un espacio en la FAT para guardar estas direcciones de 6144 bloques, o lo que es lo mismo necesitariamos ocupar 24Mbytes para almacenar las direcciones del fichero (recordemos que la FAT tiene que estar en memoria principal) y leerla entera para llegar al final del fichero, tendriamos que leer 6144 bloques de una tabla de 24Mbytes que tenemos que tener en memoria para poder encontrar el final del archivo.
- NODOS-I:
Suponemos que el nodo-i guarda 10 direcciones de bloque de datos, una dirección de un bloque simplemente indirecto, una dirección de un bloque doblemente indirecto y un dirección de un bloque triplemente indirecto.
Con las anteriores suposiciones se podría tener 10 direcciones en el nodo-i, en un bloque simplemente indirecto 1024 direcciones, en un doblemente indirecto 1024^2 y en un triplemente indirecto 1024^3 , lo que hace un total de aproximadamente 4TB de tamaño máximo de archivo y para acceder al final del archivo tan sólo tendriamos que leer 4 bloques (el bloque de nodo-i, el bloque triplemente indirecto, el bloque doblemente indirecto y el bloque simplemente indirecto).
Vemos que el método de nodos-i proporciona un mejor rendimiento que el de tablas FAT.
- FAT:
DIRECTORIOS:
Como ya dijimos el directorio es un fichero especial, que asocia un nombrede un fichero con la información necesaria para poder localizarlo, esgestinado por el S.O. y nosotros no podremos modificarlo directamente. Unaspecto importante son las limitaciones de tamaño del nombre de un fichero,em MS-DOS teniamos 8 caracteres para el nombre y 3 caracteres para laextensión, en FAT32 para Windows se llega hasta los 255 carcteres, ensistenas UNIX en un principio encontrabamos las restricciones en 14caracteres aunque posteriormente se aumentó a 255.
Como anecdota, algo curioso que me ha pasado con FAT32 en windows, me haocurrido en varias ocasiones que con programas P2P me ha descargado algúnarchivo con un nombre mayor de estos 255 caracteres, el cual se alojabacorrectamente en el F.S. pero luego no dejaba ser eliminado desde la interfazgráfica, teniendo que recurrir a la consola, desconozco la distinción ni quetipo de primitivas se usan desde la consola y desde la interfaz gráfica paramanejar ficheros, pero es cuanto menos curioso, cuando me vuelvan a llamarpor un caso de estos intentaré estudiarlo mejor.
FICHERO COMPARTIDOS:
Esto viene a ser lo que se llama en entornos Windows "Accesos Directos" yen entornos UNIX "Enlaces", consiste en que un fichero puede aparecer envarias partes del F.S. hay dos implementaciones para hacer estos enlaces:
- Enlaces Físicos: Se crean una entrada en cada parte del F.S. donde queramos situar el enlace apuntando al fichero al que queremos enlazar, es importante destacar que la propiedad NO cambia, tenemos varias entradas en directorios apuntando a un mismo fichero, con lo cual hay que llevar un contador de enlaces para saber cuando se puede eliminar el fichero, ya que si eliminamos el fichero sin tener en cuenta posibles enlaces, tendremos en el F.S. un fichero que apunta a una dirección incorrecta provocando una corrupción del sistema.
- Enlace Simbólico: Entraña menos peligros que el anterior y es más flexible, consiste en crear un fichero de tipo "link" cuyo contenido es la ruta al fichero que se enlaza, cuando el propietario borra el fichero este enlace simplemente quedará roto ( a no ser que otro fichero se cree en la misma ruta). Este es el método empleado en los "Accesos Directos" de los entornos Windows, y los creados en entornos Unix con el parámetro -s en la orden "ln" y reconocibles con el carcter "l" (L minúscula) en la información del fichero.
REGISTRO DE BLOQUES LIBRES:
El F.S. debe de llevar un registro de los bloques libres para poderasignarselos a nuevos ficheros y reciclarlos de los ficheros eliminados,básicamente hay dos formas de implementar este registro:
- Lista Ligada de Bloques: Cada elemento de la lista es un bloque que contiene tantas direcciones de bloques vacios como pueda y una última entrada que apunta hacia el siguiente bloque de la lista.
- Mapa de Bits: Un mapa con tantos bits como bloques tenga el disco, done se activan los bits pertenecientes a bloques ocupados (o viceversa), esta implementación está ligada al hardware ya que hay CPU’s como el x386 que poseen una instrucciòn para devolver el primer bit a 1 de un registro, con lo cual se facilitan las operaciones de manejo del mapa de bits.
MANEJO DE BLOQUES DEFECTUOSOS.
Cuando en el disco aparecen errores físicos que dejan inutilizados algúnsector, necesitamos una manera de saber que ese sector ya no puede serutilizado (estos errores son muy típicos), tenemos distintas soluciones:
- Solución Hardware: El mismo disco se reserve un número de sectores para cuando detecta un bloque defectuso esta dirección sea asociada a un bloque sano.
- Solución Software: El S.O. construye un fichero con los bloques defectuosos (como hemos visto un bloque suele estar formado por varios sectores, luego marcar un bloque como defectuoso implica marcar como defectuoso sectores q están sanos).
CONSISTENCIA DEL F.S.
La consistencia es un factor de vital importancia, la peor característicade un F.S. es que no sea lo suficientemente consistente. Los S.O. suelenincluir aplicaciones para comprobar la consistencia que puede ocurrir cuandose produce un fallo en el equipo que interrumpe su funcionamiento cuandotenemos datos del F.S. en la memoria que aún no han sido volcados al disco,lo peor que pueda pasar es que estos datos se refieran a la FAT o a algúnnodo-i.
Para comprobar esta consistencia se crea una tabla con dos contadores parada bloque del disco. Un contador lleva la cuenta del número de veces que el bloque está presente en un archivo y el otro lleva la cuenta del número de veces que el bloque aparece en la lista de bloques libres.
Se recorre todo el F.S. actualizando la lista para cada bloque, tras lo cual se puden presentar los sigiuentes casos:
- Cada bloque tiene un 1, bien en el primer contador o en el segundo, lo que indica que es un sistema consistente.
- Un bloque tiene a 0 los ods contadores, se le asigna a la lista de bloques libres.
- Un bloque aparece dos veces en la lista de bloques libres, se reconstruye la lista de bloques libres asignando el bloque sólo una vez en dicha lista(sólo puede pasar en listas ligadas no en mapa de bits).
- Un bloque a parece en dos o más ficheros, se copia el bloque en otros bloques tantas veces como n-1 veces aparezca, asignando a cada fichero bloques diferentes.
- Un bloque aparece una vez en cada contador (aparece como libre y como en uso), se elimina de los bloques libres.
Bueno a nivel teórico, esto es una rápida aproximación a lo que es un F.S. y espero que sirva como base para futuros post sobre el tema.
