Download Gestión de E/S y los Sistemas de Archivos
Document related concepts
Transcript
Gestión de E/S y los Sistemas de Archivos Este capítulo trata sobre la gestión de los dispositivos de entrada y salida, centrándonos en los dispositivos de almacenamiento. Comenzaremos describiendo el hardware de E/S y las técnicas para transferir datos desde los dispositivos. Posteriormente nos centraremos en los dispositivos de almacenamiento, su estructura y organización en sistemas de archivos por parte del SO para abstraer al usuario de las complejidades hardware de la amplia variedad tecnológica en la que están basados estos dispositivos. Además, se verán las estrategias más habituales en la planificación de los dispositivos de E/S. Gestión de E/S y los Sistemas de Archivos by Rafael Lozano is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España License. Tabla de contenidos Tabla de contenido 1 Introducción........................................................................................................................................ 1 2 Hardware de E/S................................................................................................................................. 1 2.1 Tipos de dispositivos...................................................................................................................................1 2.2 Controladora.................................................................................................................................................2 3 El SO en la E/S..................................................................................................................................... 2 3.1 E/S programada...........................................................................................................................................3 3.2 E/S controlada por interrupciones..........................................................................................................4 3.3 E/S mediante el uso de DMA....................................................................................................................4 3.4 Políticas de planificación de discos.........................................................................................................5 3.4.1 Planificación FCFS....................................................................................................................................... 6 3.4.2 Planificación SSF......................................................................................................................................... 6 3.4.3 Algoritmo del ascensor............................................................................................................................. 7 4 El sistema de archivos.......................................................................................................................8 4.1 Necesidad de los sistemas de archivos.................................................................................................9 4.2 Sistemas de archivos transaccional........................................................................................................9 4.3 Fragmentación...........................................................................................................................................11 4.3.1 Fragmentación interna........................................................................................................................... 11 4.3.2 Fragmentación externa.......................................................................................................................... 12 4.4 Estructura lógica de un disco duro.......................................................................................................12 4.4.1 MBR............................................................................................................................................................. 12 4.4.2 GPT.............................................................................................................................................................. 13 4.5 Gestión del espacio libre.........................................................................................................................14 4.5.1 Vector de bits............................................................................................................................................ 14 4.5.2 Lista enlazada........................................................................................................................................... 15 4.5.3 Agrupamiento........................................................................................................................................... 15 4.5.4 Recuento.................................................................................................................................................... 15 4.6 Asignación de archivos.............................................................................................................................15 4.6.1 Asignación contigua................................................................................................................................ 15 4.6.2 Asignación enlazada................................................................................................................................ 16 4.6.3 Asignación enlazada usando una tabla en memoria......................................................................18 4.6.4 Asignación indexada............................................................................................................................... 18 5 Sistemas de archivos más conocidos..........................................................................................19 5.1 Sistema de archivos FAT..........................................................................................................................19 5.1.1 La tabla FAT............................................................................................................................................... 20 5.1.2 El directorio raíz....................................................................................................................................... 21 5.1.3 El área de datos........................................................................................................................................ 21 5.2 Sistemas de archivos NTFS.....................................................................................................................22 5.2.1 MFT.............................................................................................................................................................. 23 5.2.2 Los archivos del sistema........................................................................................................................ 26 5.3 Sistema de archivos ext2, ext3 y ext4..................................................................................................26 5.3.1 Grupos de bloques.................................................................................................................................. 27 Índice I 5.3.2 El superbloque......................................................................................................................................... 27 5.3.3 Descriptores de grupo............................................................................................................................ 28 5.3.4 Inodo........................................................................................................................................................... 28 5.3.5 Área de datos............................................................................................................................................ 29 6 Bibliografía......................................................................................................................................... 31 Índice II Rafael Lozano Gestión de E/S y los Sistemas de Archivos Gestión de E/S y los Sistemas de Archivos 1 Introducción Quizás el aspecto más confuso en el diseño de los sistemas operativos sea la Entrada/Salida (E/S). Dada la amplia variedad de dispositivos y aplicaciones de esos dispositivos, resulta difícil desarrollar una solución general y consistente. Un sistema operativo también controla todos los dispositivos de E/S del ordenador. Debe emitir comandos para los dispositivos, captar interrupciones y manejar errores. Además, debe proporcionar una interfaz, simple y fácil de usar, entre los dispositivos y el resto del sistema. Hasta donde sea posible, la interfaz debe ser igual para todos los dispositivos (independencia de dispositivos). El código de E/S representa una fracción considerable del sistema operativo total. Además, una parte fundamental del sistema operativo es el sistema de archivos, el cual se encarga de administrar y facilitar el uso de los dispositivos del almacenamiento. Sus principales funciones son la asignación de espacio a los archivos, la administración del espacio libre y del acceso a los datos guardados. 2 Hardware de E/S En este apartado vamos a describir aspectos hardware relacionados con los dispositivos de E/S. 2.1 Tipos de dispositivos Los dispositivos de E/S se pueden dividir básicamente en dos categorías: ✔ Dispositivo de bloque.- Almacena información en bloques de tamaño fijo, cada uno con su propia dirección. Los tamaños de bloque comunes varían desde 512 bytes hasta 32,768 bytes. Todas las transferencias se realizan en unidades de uno o más bloques completos Página 1 Rafael Lozano Gestión de E/S y los Sistemas de Archivos consecutivos. La propiedad esencial de un dispositivo de bloque es que es posible leer o escribir cada bloque de manera independiente de los demás. Los discos duros, CD-ROMs y memorias USB son dispositivos de bloque comunes. ✔ Dispositivos de carácter.- Acepta un flujo de caracteres, sin importar la estructura del bloque. No es direccionable y no tiene ninguna operación de búsqueda. Las impresoras, las interfaces de red, ratón, teclado y la mayoría de los demás dispositivos que no son parecidos al disco se pueden considerar como dispositivos de carácter. 2.2 Controladora Por lo general, las unidades de E/S consisten en un componente mecánico y un componente electrónico. El componente electrónico se llama tarjeta controladora o adaptador. En los ordenadores personales, comúnmente tiene la forma de un chip en la placa base o una tarjeta de expansión que se puede insertar en una ranura PCI. El componente mecánico es el dispositivo en sí. El trabajo de la controladora es convertir el flujo de bits en serie en un bloque de bytes y realizar cualquier corrección de errores necesaria. Por lo general, primero se ensambla el bloque de bytes, bit por bit, en un búfer dentro de la controladora. Después de haber verificado su suma de comprobación y de que el bloque se haya declarado libre de errores, puede copiarse a la memoria principal. Cada controladora tiene: ✔ Registros de control.- Unos cuantos registros que se utilizan para comunicarse con la CPU. Al escribir en ellos, el sistema operativo puede hacer que el dispositivo envíe o acepte datos, se encienda o se apague, o realice cualquier otra acción. Al leer estos registros, el sistema operativo puede conocer el estado del dispositivo, si está preparado o no para aceptar un nuevo comando, etc. ✔ Búfer.- Además de los registros de control, muchos dispositivos tienen un búfer de datos que el sistema operativo puede leer y escribir. 3 El SO en la E/S A la hora de desarrollar un SO hay que tener en cuenta una serie de cuestiones relacionadas con la E/S que se describen a continuación. ✔ Independencia de dispositivos.- Un concepto clave en el diseño del software de E/S se conoce como independencia de dispositivos. Lo que significa es que debe ser posible escribir programas que puedan acceder a cualquier dispositivo de E/S sin tener que especificar el dispositivo por adelantado. Por ejemplo, un programa que lee un archivo debe tener la capacidad de hacerlo en el disco duro, un CD-ROM, un DVD o una memoria USB sin tener que modificar el programa para cada dispositivo distinto. ✔ Denominación uniforme.- Un objetivo muy relacionado con la independencia de los dispositivos es la denominación uniforme. El nombre de un archivo o dispositivo simplemente debe ser una cadena o un entero sin depender del dispositivo de ninguna forma. ✔ Manejo de errores.- Otra cuestión importante relacionada con el software de E/S es el manejo Página 2 Rafael Lozano Gestión de E/S y los Sistemas de Archivos de errores. En general, los errores se deben manejar lo más cerca del hardware que sea posible. Si el controlador hardware descubre un error de lectura, debe tratar de corregir el error por sí mismo. Si no puede, entonces el software controlador del dispositivo debe manejarlo. Sólo si los niveles inferiores no pueden solucionar el problema, los niveles superiores deben tratarlos. ✔ Modo de transferencia.- Otra cuestión clave es la de las transferencias síncronas (de bloqueo) contra las asíncronas (controladas por interrupciones). La mayoría de las operaciones de E/S son asíncronas: la CPU inicia la transferencia y se va a hacer algo más hasta que llega la interrupción avisando de que ha finalizado. Los programas de usuario son mucho más fáciles de escribir si las operaciones de E/S son de bloqueo: después de iniciar una operación de lectura, el programa se suspende de manera automática hasta que haya datos disponibles en el búfer. Depende del sistema operativo hacer que las operaciones sean síncronas o asíncronas. ✔ Uso de búfer.- A menudo los datos que provienen de un dispositivo no se pueden almacenar directamente en su destino final. Por ejemplo, cuando un paquete llega de la red, el sistema operativo no sabe dónde colocarlo hasta que ha almacenado el paquete en alguna parte y lo examina. Además, algunos dispositivos tienen severas restricciones en tiempo real (por ejemplo, los dispositivos de audio digital), por lo que los datos se deben colocar en un búfer de salida por adelantado para desacoplar la velocidad a la que se llena el búfer, de la velocidad a la que se vacía, de manera que se eviten desbordamientos de búfer. El uso de búfer involucra una cantidad considerable de copiado y a menudo tiene un importante impacto en el rendimiento de la E/S. ✔ Interbloqueos.- Algunos dispositivos de E/S, como los discos, pueden ser utilizados por muchos usuarios a la vez. No se producen problemas debido a que varios usuarios tengan archivos abiertos en el mismo disco al mismo tiempo. Otros dispositivos tienen que estar dedicados a un solo usuario hasta que éste termine. Si dos o más usuarios escriben bloques entremezclados al azar en el mismo dispositivo, definitivamente no funcionará. Al introducir los dispositivos dedicados (no compartidos) también se introduce una variedad de problemas, como los interbloqueos. De nuevo, el sistema operativo debe ser capaz de manejar los dispositivos compartidos y dedicados de una manera que evite problemas. Para las operaciones de E/S son posibles las tres técnicas siguientes: 3.1 E/S programada Cuando el procesador está ejecutando un programa y encuentra una instrucción de E/S, ejecuta dicha instrucción, enviando una orden al dispositivo. Con E/S programada, el dispositivo llevará a cabo la acción requerida y luego activará los bits apropiados en el registro del dispositivo. El dispositivo no lleva a cabo ninguna otra acción para avisar al procesador, de hecho, ni lo interrumpe. Así pues, es responsabilidad del procesador comprobar periódicamente el estado del dispositivo hasta saber que se ha completado la operación. Con esta técnica, el procesador es responsable de extraer los datos de la memoria principal cuando va a realizar una salida o almacenar los datos en la memoria principal cuando se realiza una entrada. El procesador ejecuta unas instrucciones del sistema operativo que le otorgan el control directo sobre la operación de E/S, incluyendo la comprobación del estado de los dispositivos, el envío Página 3 Rafael Lozano Gestión de E/S y los Sistemas de Archivos de órdenes de lectura o escritura y la transferencia de datos. Esta técnica consume tiempo y mantiene al procesador ocupado de forma innecesaria. 3.2 E/S controlada por interrupciones El problema de la E/S programada es que el procesador tiene que esperar un largo rato a que el dispositivo de E/S en cuestión esté listo para recibir o transmitir más datos. El procesador, mientras está esperando, debe interrogar repetidamente por el estado del dispositivo de E/S. Como resultado, el nivel de rendimiento del sistema en conjunto se degrada fuertemente. Una alternativa es que el procesador envíe una orden de E/S al dispositivo y se dedique a hacer alguna otra tarea útil. El dispositivo de E/S interrumpirá entonces al procesador para requerir sus servicios cuando esté listo para intercambiar los datos. El procesador ejecuta entonces la transferencia de los datos y reanuda el procesamiento anterior. Desde el punto de vista del dispositivo de E/S la secuencia de operaciones sería: 1. El dispositivo de E/S recibe una orden de lectura desde la CPU. 2. El dispositivo de E/S procede a leer los datos. 3. Una vez que los datos están en el registro de datos del dispositivo, éste envía una señal de interrupción al procesador. 4. El dispositivo espera entonces a que los datos sean solicitados por el procesador. Cuando se realice esta solicitud, el módulo situará los datos en el bus de datos y estará listo para otra operación de E/S. Desde el punto de vista del procesador la secuencia de operaciones sería: 1. El procesador envía una orden de lectura, salva el contexto (contador de programa y los registros del procesador) del proceso en curso, se sale del mismo y se dedica a hacer otra cosa (puede ejecutar otro proceso). 2. Cuando se produce una interrupción desde el dispositivo de E/S, el procesador salva el contexto del proceso que está ejecutando en ese momento y comienza la ejecución de la rutina de tratamiento de la interrupción. En este caso, el procesador lee los datos del dispositivo de E/S y la almacena en la memoria. 3. Luego restaura el contexto del proceso que emitió la orden de E/S y reanuda la ejecución. La E/S por interrupciones es más eficiente que la E/S programada porque elimina las esperas innecesarias. Sin embargo, la E/S por interrupciones sigue consumiendo una gran cantidad de tiempo del procesador, debido a que cada palabra de datos que va de la memoria al dispositivo de E/S o viceversa debe pasar a través del procesador. 3.3 E/S mediante el uso de DMA La E/S dirigida por interrupciones, aunque es más eficiente que la simple E/S programada, todavía requiere de la intervención activa del procesador para transferir los datos entre la memoria y un dispositivo de E/S y además cualquier transferencia de datos debe recorrer un camino que pasa Página 4 Rafael Lozano Gestión de E/S y los Sistemas de Archivos por el procesador. Así pues, ambas formas de E/S adolecen de dos desventajas inherentes: 1. La velocidad de transferencia de E/S está limitada por la velocidad con la que el procesador puede comprobar y dar servicio a un dispositivo. 2. El procesador participa en la gestión de la transferencia de E/S; debe ejecutarse una serie de instrucciones en cada transferencia de E/S. Cuando se tienen que mover grandes volúmenes de datos, se necesita una técnica más eficiente: el acceso directo a memoria (DMA). La función de DMA se puede llevar a cabo por medio de un controlador separado sobre el bus del sistema o puede estar incorporada dentro de un dispositivo de E/S. En cualquier caso, la técnica funciona como sigue. Cuando el procesador desea leer o escribir un bloque de datos, emite una orden hacia el módulo de DMA, enviándole la información siguiente: 1. Si lo que solicita es una lectura o una escritura. 2. La dirección del dispositivo de E/S involucrado. 3. La dirección inicial de la memoria desde la que se va a leer o a la que se va a escribir. 4. El número de palabras a leer o escribir. El procesador continúa entonces con otro trabajo. Habrá delegado la operación de E/S en el controlador DMA y dicho módulo es el que tendrá que encargarse de ésta. El controlador DMA transfiere los datos directamente hacia o desde la memoria, sin pasar por el procesador. Cuando se completa la transferencia, el controlador DMA envía una señal de interrupción al procesador. De esta manera, el procesador se ve involucrado sólo al inicio y al final de la transferencia. El controlador de DMA necesita tomar el control del bus para transferir los datos con la memoria. Debido a la competencia por la utilización del bus, puede ocurrir que el procesador necesite el bus pero tiene que esperar por el módulo de DMA. Este fenómeno se conoce como robo de ciclo. Nótese que esto no es una interrupción; el procesador no salva el contexto y se dedica a hacer otra cosa. En su lugar, el procesador hace una pausa durante un ciclo del bus. El efecto general es hacer que el procesador ejecute con más lentitud durante una transferencia de DMA. No obstante, para una transferencia de E/S de varias palabras, el DMA es bastante más eficiente que la E/S programada o dirigida por interrupciones. 3.4 Políticas de planificación de discos Puesto que la mayoría de los procesos dependen en gran medida del disco para la carga en memoria, y para los archivos de entrada y salida, es importante que el servicio del disco sea lo más rápido posible. El sistema operativo puede mejorar el tiempo promedio de servicio del disco planificando las solicitudes de acceso. La velocidad del disco se compone de tres partes: 1. Para acceder a un bloque en el disco, el sistema primero debe mover la cabeza a la pista o cilindro correspondiente. A este movimiento se le denomina posicionamiento, y al tiempo para concluirlo se le conoce como tiempo de posicionamiento. 2. Una vez que la cabeza se encuentra en la pista correcta debe esperar a que el bloque deseado pase por debajo de la cabeza de lectura y escritura; a esta demora se le denomina Página 5 Rafael Lozano Gestión de E/S y los Sistemas de Archivos tiempo de latencia rotacional. 3. Por último, puede efectuarse la transferencia real de datos entre el disco y la memoria principal. Esta última parte es el tiempo de transferencia de bloque. El tiempo total para servir una solicitud del disco es la suma de los tiempos de posicionamiento, latencia rotacional y transferencia de bloque. Cada dispositivo de E/S, incluyendo cada unidad de disco, tiene una cola de procesos pendientes. Cada vez que un proceso necesita E/S del disco, emite una llamada al sistema operativo. Esta solicitud necesita varias informaciones necesarias: ✔ Si se trata de una operación de entrada o de salida. ✔ Cuál es la dirección en disco (unidad, cilindro, bloque). ✔ Cuál es la dirección en memoria. ✔ Cuánta información se transferirá (número de bytes o palabras). Si la unidad y el controlador del disco deseado están disponibles, es posible servir de inmediato la solicitud. Sin embargo, si la unidad o el controlador están sirviendo una solicitud, será necesario colocar en una cola todas las solicitudes adicionales, que generalmente provienen de otros procesos. En un sistema de multiprogramación con varios procesos, con frecuencia no estará vacía la cola del disco, por lo que, al concluir una solicitud, debemos seleccionar una nueva de la cola y servirla. Un servicio de disco requiere el movimiento de la cabeza a la pista deseada, esperar el tiempo de latencia rotacional y finalmente transferir los datos. 3.4.1 Planificación FCFS La forma más sencilla para planificar un disco es la planificación servicio por orden de llegada (FCFS, first come, first served). Este algoritmo es fácil de programar e intrínsecamente justo, pero es probable que no ofrezca el mejor tiempo de servicio promedio. Consideremos como ejemplo una cola de disco ordenada por el orden de llegada de las solicitudes que afectan a los siguientes cilindros: 98, 183, 37, 122, 14, 124, 65 y 67 Si en un principio la cabeza de lectura y escritura está en el cilindro 53, se moverá primero del 53 al 98, luego al 183, 37, 122, 14, 124, 65 y por último al 67, lo que da un movimiento total de la cabeza de 640 cilindros. El problema de esta planificación se ilustra con el violento movimiento del 122 al 14 y de vuelta al 124. Si pudieran servirse juntas las solicitudes de los cilindros 37 y 14, antes o después de las solicitudes 122 y 124, se reduciría considerablemente el movimiento total de la cabeza y también el tiempo para servir cada solicitud, mejorando la productividad del disco. 3.4.2 Planificación SSF Parece razonable servir juntas todas las solicitudes próximas a la posición actual del disco, antes de desplazar la cabeza a un punto lejano para servir otra solicitud. Esta suposición es la base del algoritmo primero la de menor tiempo de posicionamiento (SSF, Shortest Seek First) para la planificación del disco. El algoritmo SSF selecciona la solicitud con menor tiempo de posicionamiento Página 6 Rafael Lozano Gestión de E/S y los Sistemas de Archivos a partir de la posición actual de la cabeza. Como el tiempo de posicionamiento normalmente es proporcional a la diferencia entre las solicitudes medida en cilindros, implementamos esta estrategia moviendo la cabeza al cilindro más próxima de la cola de solicitudes. En el ejemplo anterior, el más próximo a la posición inicial de la cabeza (53) es el cilindro 65. Una vez ubicados en el cilindro 65, la siguiente solicitud más cercana está el cilindro 67. En este punto, la distancia al cilindro 37 es 30, mientras que al 98 es 31; por tanto, está más cerca la solicitud del cilindro 37 y se sirve a continuación. Luego servimos la solicitud del cilindro 14, después la 98, 122, 124 y por último la 183. Este método de planificación da como resultado un movimiento total de la cabeza de sólo 236 cilindros, poco más de la tercera parte de la distancia necesaria para la planificación FCFS. Este algoritmo mejoraría considerablemente el promedio del servicio del disco. La planificación SSF puede causar el bloqueo indefinido de algunas solicitudes. Recuerde que, en un sistema real, las solicitudes pueden llegar en cualquier momento. Supongamos que tenemos dos solicitudes en la cola, una para el cilindro 14 y otra para el 186. Si llega una solicitud próxima al 14 mientras servimos esta solicitud será la siguiente en atenderse, por lo que la solicitud del 186 tendría que esperar. Mientras se sirve la nueva solicitud, puede llegar otra próxima a la 14. En teoría, podría llegar una serie continua de solicitudes próximas entre sí, ocasionando que la solicitud del cilindro 186 espere indefinidamente. El algoritmo SSF, aunque representa una considerable mejora con respecto al algoritmo FCFS, no es óptimo. Por ejemplo, si movemos la cabeza del 53 al 37, aunque ésta no sea la pista más próxima, y luego a la 14, antes de regresar y servir a la 65, 67, 98, 122, 124 y 183 podemos reducir el movimiento total de la cabeza a 208 pistas. 3.4.3 Algoritmo del ascensor Previamente hemos visto que la cola de solicitudes de E/S al disco es dinámica, es decir, mientras se atiende una petición pueden llegar más peticiones. Una política que mantiene los requisitos de eficiencia (menor tiempo de respuesta) y equidad (que se atiendan todas las peticiones) es el algoritmo del ascensor. Los ascensores en los edificios altos pueden recibir peticiones mientras están recogiendo clientes en un piso. Sin embargo, en lugar de atender las peticiones más próximas hacen un recorrido completo de abajo a arriba y atienden las peticiones más próximas en ese sentido. Cuando llegan a la última petición en una dirección, invierten su sentido (de arriba a abajo) y atienden las peticiones pendientes en ese orden. Con el disco se puede establecer una similitud. La cabeza de lectura y escritura está atendiendo una solicitud en un cilindro y luego atenderá la solicitud más próxima en la dirección actual. Después de atender la última solicitud en una dirección, invertirá el movimiento de la cabeza y continuará el servicio de solicitudes en la dirección contraria. Usamos de nuevo nuestro ejemplo de la cola de solicitudes 98, 183, 37, 122, 14, 124, 65 y 67. Antes de aplicar la planificación necesitamos conocer la dirección del movimiento de la cabeza, así como su posición más reciente. Si se movía hacia el cilindro 0, el movimiento de la cabeza atendería las solicitudes del cilindro 37 y 14. Al atender la solicitud del cilindro 14 y no haber más peticiones en esa dirección, se invertiría el movimiento de la cabeza y se desplazaría hacia el extremo opuesto, sirviendo las solicitudes en los cilindros 65, 67, 98, 122, 124 y 183 durante el movimiento. Si una Página 7 Rafael Lozano Gestión de E/S y los Sistemas de Archivos solicitud llega a la cola justo delante de la cabeza, se servirá casi de inmediato, mientras que una solicitud correspondiente a una posición inmediatamente detrás de la cabeza tendrá que esperar a que la cabeza invierta su dirección de movimiento y regrese, antes de ser servida. Esta planificación de disco tiene un problema. Supongamos que las peticiones que llegan están uniformemente distribuidas a lo largo del disco. Normalmente, cuando la cabeza invierta la dirección se va a encontrar pocas solicitudes ya que acaba de pasar por esa zona del disco y hará poco tiempo que han sido atendidas. Lo más lógico es que haya un gran número de solicitudes en el extremo opuesto del disco. Así mismo, estas solicitudes son las que más han esperado. Una ligera modificación de este algoritmo que resuelve este inconveniente es atender solicitudes siempre en la misma dirección. Cuando se ha atendido la última petición en una dirección, el brazo se mueve de inmediato hasta la petición que está más cercana al extremo opuesto del disco y después continúa desplazándose en esa dirección. En la práctica estamos considerando que el cilindro más bajo está justo por encima del cilindro más alto. 4 El sistema de archivos El sistema de archivos es el componente del sistema operativo encargado de administrar y facilitar el uso de los dispositivos de almacenamiento. Estructuran la información guardada en un dispositivo de almacenamiento, que luego será representada ya sea textual o gráficamente utilizando un gestor de archivos. Sus principales funciones son: ✔ La asignación de espacio de almacenamiento a los archivos ✔ La administración del espacio libre de la partición. ✔ La administración del acceso a los datos guardados. ✔ Seguridad o permisos: listas de control de acceso (ACLs) por usuarios y grupos. ✔ Asignación de los atributos extendidos (ej.: archivos de solo lectura, etc.) ✔ Mecanismo para evitar la fragmentación. ✔ Integridad del sistema de archivos (Journaling) ✔ Soporte para cuotas de discos El elemento principal en un sistema de archivos es el archivo, o conjunto de información relacionada que se almacena como flujo de bits y es tratada como entidad única. Para que las aplicaciones puedan acceder a la información almacenada en los dispositivos de almacenamiento utilizan generalmente un nombre simbólico para acceder a un archivo. Como una partición puede almacenar miles de archivos, estos necesitan estructurarse para su rápida localización. De todo esto se encarga el sistema de archivos para lo que debe definir lo siguiente: ✔ La estructura del almacenamiento, generalmente en forma de árbol con carpetas y subcarpetas. ✔ La nomenclatura de los archivos. Caracteres que se admiten en el nombre de los archivos, lóngitud máxima, etc. Página 8 Rafael Lozano Gestión de E/S y los Sistemas de Archivos La mayoría de los sistemas operativos manejan su propio sistema de archivos. Generalmente, cada sistema de archivos ha sido diseñado para obtener el mejor rendimiento con un sistema operativo concreto, sin embargo, es usual que el mismo sistema operativo sea capaz de reconocer múltiples sistemas de archivos. Para que sea posible almacenar información en una partición es necesario asignarle previamente un sistema de archivos. Esta operación se denomina dar formato o formatear una partición. Por norma general, cada sistema de archivos se instala sobre una única partición, aunque es posible instalar un sistema de ficheros utilizando varias particiones. 4.1 Necesidad de los sistemas de archivos Una necesidad evidente de casi cualquier aplicación informática es la del almacenamiento y posterior recuperación de información. Los medios de almacenamiento masivo (disco duro, CD-ROM, memorias flash, ...) posibilitan su almacenamiento y recuperación. El uso de estos medios de almacenamiento introduce un nuevo problema. El manejo de estas memorias secundarias es muy diferente del manejo que se hace de la memoria principal. Y no sólo eso: entre diferentes medios de almacenamiento masivo, el acceso y manipulación de los datos en ellos almacenados puede ser muy distinto. A nivel interno, no es lo mismo acceder a la información almacenada en un disco duro que a la almacenada en un CD-ROM. Resulta imprescindible introducir algo que permita abstraer las propiedades físicas y tecnológicas de los dispositivos de almacenamiento, es decir, algo que permita manipular la información de la misma forma, independientemente del medio en que ésta esté almacenada. La solución se encuentra en los controladores software del dispositivo, que hacen posible olvidar los complejos detalles a niveles lógico y físico de la implementación de los dispositivos. El controlador software se encarga de atender las solicitudes que haga el sistema al dispositivo correspondiente, actuando como capa colchón entre ambos. Así, el sistema operativo puede olvidarse de conceptos como pistas, sectores, cilindros, etc... y centrarse en lo que realmente interesa, almacenar y acceder a la información. Mediante las capacidades de los dispositivos de almacenamiento y, gracias, a los controladores de dispositivo que los manipulan se logra el almacenamiento y recuperación de la información. Pero esta información debe estar estructurada para su fácil manipulación. De esta idea surgen los sistemas de archivos, como mecanismo o herramienta de gestión de la información sobre los dispositivos de almacenamiento. La gestión de la información la realiza, el sistema de archivos a nivel lógico, el disco duro a nivel físico, y los drivers como elemento intermedio entre ellos. 4.2 Sistemas de archivos transaccional Además de alojar los datos de los archivos, el sistema de archivo también almacena y manipula información muy importante sobre los archivos y el propio sistema de archivo, como por ejemplo las marcas de fecha y hora, el propietario del archivo, los permisos de acceso, el tamaño de los archivos y la localización del archivo en el disco, entre otras cosas. Esta información constituye lo que comúnmente denominamos metadatos. Página 9 Rafael Lozano Gestión de E/S y los Sistemas de Archivos Al trabajar con un ordenador, para mejorar el rendimiento de las operaciones de E/S, los datos del disco son temporalmente almacenados en la memoria RAM. Los problemas surgen si hay un corte de suministro eléctrico antes que los datos modificados en la memoria sean grabados nuevamente al disco. Se generaría una inconsistencia en el estado global del sistema de ficheros. Puesto que el sistema de archivos procura trabajar de manera asíncrona tanto como le sea posible a fin de evitar el embotellamiento del disco duro, una interrupción intempestiva de su trabajo podría dar lugar a la pérdida de los datos. Como ejemplo, consideremos el escenario siguiente: ¿qué sucede si su máquina se cuelga cuando se está trabajando en un documento? Son varias las respuestas: ✔ La caída de la máquina ocurre después de que se haya guardado el archivo. Éste es el mejor de los escenarios: no pierde casi nada. Se reinicia la máquina y el documento está tal y como se guardó. ✔ La máquina se cuelga antes de que haya guardado el archivo. Se pierde seguramente todos los cambios más recientes, pero su versión anterior sigue siendo aceptable. ✔ La caída de la máquina ocurre justo cuando el archivo estaba siendo escrito en el disco. Éste es el peor de los casos: la nueva versión del archivo estaba sobreescribiéndose físicamente sobre la vieja. Se acaba con un archivo parcialmente nuevo y parcialmente viejo. Si el archivo es escrito en forma binaria, ya no se puede reabrir debido a que el formato interno de sus datos resulta inconsistente con lo que la aplicación espera. Si la caída del sistema toma al controlador escribiendo en un área de los metadatos, tal como el directorio, por ejemplo, entonces en el último de los escenarios las cosas resultan aún peores. Ahora en vez de un archivo dañado, habrá un sistema de archivo corrupto, y podría perder el directorio completo y todos los datos de una partición del disco. El sistema de archivos estándar procura prevenir y recuperarse de una corrupción de los metadatos mediante el análisis exhaustivo del sistema de archivo durante el arranque de la máquina. Dado que el sistema de archivos mantiene copias redundantes de los metadatos críticos, es extremadamente improbable que estos datos se pierdan totalmente. El sistema evalúa dónde se hayan los metadatos corruptos, y luego repara el daño, ya sea copiando de la versión redundante o simplemente borrando el archivo o los archivos cuyos metadatos hayan sido estropeados. Obviamente, cuanto más grande es el sistema de archivos a verificar, tanto más prolongado será el proceso de revisión. En una partición de varios gigabytes esta revisión de los metadatos durante el arranque puede tardar muchísimo tiempo. Como las aplicaciones son cada vez más complejas, tanto en grandes servidores como en requisitos de disponibilidad mayores, existe la necesidad de un sistema de archivos más sofisticado que haga aún mejor la tarea de proteger los datos y los metadatos. Los sistemas de archivo transaccionales son una respuesta a esta necesidad. Los sistemas de archivos más modernos han tomado prestadas del ámbito de las bases de datos las técnicas transaccionales, a fin de mejorar la recuperación de los datos tras una eventual caída. En estos sistemas de archivos las transacciones en disco se escriben de manera secuencial en un área llamada journal o log, antes de ser escritas en sus localizaciones finales dentro del sistema de archivo. Las distintas variantes de sistema de archivo transaccional difieren en términos de los datos Página 10 Rafael Lozano Gestión de E/S y los Sistemas de Archivos que se escriben en el log. Algunas sólo escriben los metadatos del sistema de archivo; mientras que otras lo registran todo en el journal. Ahora, si la caída del sistema ocurriera antes de que la entrada en el log hubiese sido efectuada con éxito, los datos originales todavía aparecerían intactos en el disco, y solamente se perderían los cambios más recientes. Si la caída se diera justo durante la actualización real del disco (es decir, después de que la entrada en el log se hubiera dado), la entrada en el journal mostraría lo qué supuestamente debió de haber ocurrido. De tal suerte que cuando el sistema arranque de nuevo, pueda simplemente rehacer las entradas en el journal y completar la actualización que fue interrumpida. En cualquier caso, se obtienen datos válidos y no una partición completa estropeada. Y como el tiempo de recuperación asociado con este sistema basado en log es muchísimo más corto, la máquina estará en línea en unos cuantos segundos. Es importante observar también que el empleo de un sistema de archivo transaccional no vuelve obsoleto, ni mucho menos, el uso de los programas que sirven para revisar el sistema de archivo. Los errores de hardware y software que al azar llegan a corromper algunos bloques del sistema de archivo, generalmente no se pueden recuperar con el simple log de la transacciones en disco. 4.3 Fragmentación Prácticamente, todos los sistemas de archivos introducen el concepto de grupo, cluster, bloque lógico o unidad de asignación. Hace referencia a la unidad mínima de almacenamiento de un archivo en una partición y está formada por uno o varios sectores contiguos del disco. Esto quiere decir que el espacio real ocupado por un archivo en disco será siempre múltiplo del tamaño del grupo. Además, cada grupo puede almacenar información de un sólo archivo, aunque un archivo puede ocupar varios grupos, los cuales no están necesariamente contiguos. Estas características provocan el problema de la fragmentación. Hay dos tipos de fragmentación que veremos a continuación. 4.3.1 Fragmentación interna La fragmentación interna consiste en el desaprovechamiento del espacio en disco. Ocurren cuando un archivo tiene un tamaño que no es múltiplo del tamaño de bloque, lo que significa que el último bloque no estará totalmente ocupado por el archivo y se desperdicia parte del espacio del bloque. Este problema se agudiza cuanto mayor sea el tamaño del bloque. Por ejemplo, si consideramos un archivo con un tamaño de 10 bytes y un sistema de archivos que considere un tamaño de bloque de 4 Kb (4096 bytes). El bloque donde se encuentre el archivo sólo podrá contener a éste y, de esta forma, se está utilizando únicamente un 0,25% de la longitud del bloque. Dicho de otro modo, un bloque que puede albergar hasta 4096 bytes de información se está utilizando para guardar sólo 10 bytes útiles. El problema no afecta únicamente a los ficheros pequeños, con el tamaño de bloque anterior (4 KB) un fichero de 4097 bytes de longitud ocupará todo un bloque y un único byte de otro. Como, en general, la longitud de un fichero no es múltiplo entero de la longitud del bloque, resulta que la mayoría de los archivos consumen más espacio del que realmente necesitan. Página 11 Rafael Lozano Gestión de E/S y los Sistemas de Archivos 4.3.2 Fragmentación externa La fragmentación externa depende del método de asignación de bloques a los archivos. Cuando se crea un archivo se asignan bloques libres a éste. Estos bloques asignados pueden estar desperdigados por todo el área de datos del disco duro. Normalmente, el sistema de archivos buscará bloques contiguos y dependiendo del tamaño del archivo lo encontrará más o menos que estén contiguos. Conforme se añaden nuevos archivos los fragmentos de bloques contiguos se harán más pequeños hasta que alcanzan un tamaño que no permiten ser asignados más que a archivos pequeños. Si un archivo es muy grande y no puede ser colocado de forma contigua ocupará bloques discontinuos desperdigados por todo el disco. Esto implica una ralentización a la hora de leer los datos del archivo ya que obligará al cabezal de lectura y escritura a moverse con más frecuencia para reunir los fragmentos desperdigados a los largo del disco. Este problema lo sufre especialmente NTFS y FAT, y en menor medida ext2,3,4. Algunos sistemas operativos incluyen herramientas para desfragmentar el disco duro, que intenta compactar los archivos de forma que ocupen espacio contiguo. Sin embargo, esta operación supone la paralización del sistema mientras se realiza y poco después el disco volverá a estar fragmentado. 4.4 Estructura lógica de un disco duro La estructura lógica de un disco duro indica la forma en que se organiza su espacio de almacenamiento. Todos los discos duros pueden dividirse en particiones. Una partición es un espacio de almacenamiento contiguo del disco duro con un sistema de archivos y donde puede residir un sistema operativo. El número y tamaño de las particiones varía, ya que es a elección del usuario, pero el tamaño siempre se define como un número de cilindros. El número y el espacio que ocupa cada partición se almacenan en la tabla de particiones. En principio, cada disco duro está formado por: ✔ Registro Maestro de Arranque (MBR Master Boot Record).- Es el primer sector del disco duro o sector 0. Contiene información ✔ Espacio particionado.- Espacio del disco duro que está asignado a las particiones. ✔ Espacio sin particionar.- Espacio libre que no ha sido asignado a ninguna partición y que se pueden utilizar para definir nuevas particiones. Una de las particiones en la tabla se marca como activa. Cuando el ordenador arranca, la BIOS lee y ejecuta el MBR. Lo primero que hace el programa MBR es localizar la partición activa, leer su primer bloque, conocido como bloque de arranque, y ejecutarlo. El programa en el bloque de arranque carga el sistema operativo contenido en la partición. Por cuestión de uniformidad, cada partición comienza con un bloque de arranque, aunque no contenga un sistema operativo que se pueda arrancar, ya que podría contener uno en el futuro. Existen dos esquemas de particionamiento de un disco duro las cuales se verán a continuación. 4.4.1 MBR Con este esquema, en el MBR se almacena el cargador de arranque del sistema operativo y la tabla de particiones. El cargador de arranque es una pequeña aplicación que ocupa los primeros 446 bytes y que se encarga de buscar la partición activa para posteriormente cargar y ejecutar el arranque Página 12 Rafael Lozano Gestión de E/S y los Sistemas de Archivos del sistema operativo instalado en dicha partición y que reside en el primer bloque de la partición. La tabla de particiones ocupa los últimos 64 bytes y solo almacena las 4 particiones primarias (16 bytes por cada una) que este esquema contempla. En cada entrada de la tabla almacenará el tipo y los límites de la partición. Los límites se almacenan en dos formas, el primer y último sector de la partición en formato CHS y el primer sector LBA con el número de sectores de la partición. Como podemos ver hay una limitación. La tabla de particiones solamente puede almacenar 4 particiones. Para superar este límite se puede definir una partición extendida, la cual solo se usa para almacenamiento. En este caso podemos tener tres particiones primarias y una extendida. La partición extendida puede dividirse en unidades lógicas sin límite. Figura 1.- Particiones MBR El único inconveniente es que no se puede instalar un sistema operativo en una unidad lógica, ya que no es arrancable. Para llevar un registro de las particiones o unidades lógicas se emplea la entrada en la tabla de particiones correspondiente a la partición extendida. Esta entrada apunta a una nueva tabla de particiones similar a la ya estudiada, de la que sólo se utilizan sus dos primeras entradas. La primera entrada corresponde a la primera partición lógica; la segunda, apuntará a una nueva tabla de particiones. Esta nueva tabla contendrá en su primera entrada la segunda partición lógica y en su segunda, una nueva referencia a otra tabla. De esta manera, se va creando una cadena de tablas de particiones hasta llegar a la última, identificada por tener su segunda entrada en blanco. 4.4.2 GPT La tabla de partición GUID (GPT) es el esquema de particiones en sistemas que disponen de EFI, propuesto por Intel para reemplazar a la BIOS. La GPT sustituye al MBR usado con el BIOS. En la figura siguiente se describe el esquema GPT en un disco duro el cual tiene los siguientes componentes. ✔ MBR.- El primer sector del disco sigue siendo el MBR. El principal propósito de este sector al principio del disco es evitar que utilidades de disco basadas en MBR no reconozcan o estropeen discos basados en GPT. ✔ La cabecera de la tabla de particiones.- Define los bloques de disco que pueden ser utilizados por el usuario. También define el número y tamaño de las entradas de partición que conforman la tabla de particiones. La cabecera contiene el GUID del disco (Globally Unique Identifier, Identificador Global Único). Registra su propio tamaño y localización (siempre LBA 1), y el tamaño y la localización de la cabecera y tabla de la GPT secundarias (siempre en el último sector del disco). Es importante que también contiene una suma de comprobación CRC32 para sí mismo y para la tabla de partición, que se verifica por los procesos EFI durante el arranque. ✔ Entradas de partición.- Las entradas de partición almacenan la información de cada partición. Los primeros 16 bytes designan el tipo de partición GUID. Los siguientes 16 bytes contienen Página 13 Rafael Lozano Gestión de E/S y los Sistemas de Archivos otro GUID único para la partición. Los bloques LBA de comienzo y final que delimitan la partición en el disco también se registran aquí, codificados como enteros de 64 bits. También se reserva un espacio para los nombres de las particiones y otros atributos. Figura 2.- Esquema GPT 4.5 Gestión del espacio libre El espacio en disco es limitada, por tanto es necesario reutilizar el espacio usado por los archivos eliminados para los nuevos archivos. Para controlar el espacio libre en disco, el sistema mantiene una lista de espacio libre, que registra todos los bloques del disco que están libres, es decir, que no están asignados a un archivo. Para crear un archivo, se recorre la lista de espacio libre hasta encontrar espacio suficiente, y lo asignamos al nuevo archivo; luego se elimina este espacio de la lista. Al eliminar un archivo se agrega su espacio en disco a la lista de espacio libre. 4.5.1 Vector de bits En muchos casos la lista se espacio libre se implementa como un mapa de bits o un vector de bits, donde cada bloque se representa con un bit. El bit es 0 si el bloque está libre, si está ocupado, el bit es 1. La principal ventaja de esta estrategia es que resulta bastante sencillo y eficiente encontrar n bloques libres consecutivos en el disco. Es más, muchos ordenadores ofrecen instrucciones de manipulación de bits que pueden usarse eficazmente para ese fin. Por desgracia, los vectores de bits no son eficientes si no se conserva todo el vector en memoria principal. Es posible conservarlo en Página 14 Rafael Lozano Gestión de E/S y los Sistemas de Archivos memoria si se trata de discos pequeños, pero no para los de mayor tamaño. 4.5.2 Lista enlazada Otra estrategia consiste en enlazar todos los bloques libres del disco, manteniendo un puntero al primer bloque libre, el cual contiene otro puntero al siguiente bloque libre, etc. Este esquema no es eficiente, ya que para recorrer la lista tenemos que leer cada uno de los bloques, lo que representa un tiempo considerable de E/S. 4.5.3 Agrupamiento Una variante de la estrategia de la lista enlazada es almacenar en el primer bloque las direcciones de n bloques libres. Los primeros n-1 bloques están libres y el último contiene la dirección en disco de otro bloque que contiene las direcciones de otros n bloques libres. Lo importante de este método es que pueden encontrase con rapidez las direcciones de una gran cantidad de bloques libres. 4.5.4 Recuento Otra estrategia consiste en aprovechar que, generalmente, varios bloques contiguos se pueden asignar o liberar simultáneamente, en especial cuando se utiliza la asignación contigua. En esta forma, en vez de mantener una lista de n direcciones libres en disco podemos tener la dirección del primer bloque libre y los n bloques libres contiguos que le siguen. Así, cada entrada de la lista de espacio libre consiste en una dirección en disco y un recuento o contador. Aunque cada entrada requiere más espacio del que necesitaría una simple dirección de disco, la lista será más pequeña, siempre y cuando el recuento sea generalmente mayor que uno. 4.6 Asignación de archivos Una de las aspectos más cruciales en la gestión de los discos es asignar bloques a un archivo. El problema consiste en cómo asignar espacio a estos archivos para que se utilice eficazmente el espacio en disco y se pueda acceder a los archivos con rapidez. Existen tres métodos de uso común para asignar el espacio en disco: contiguo, enlazado e indexado, cada uno con sus ventajas y desventajas. Por eso, algunos sistemas permiten los tres métodos, aunque es más normal que un sistema emplee un método concreto para todos los archivos. 4.6.1 Asignación contigua El método de asignación contigua requiere que cada archivo se almacene como un bloques contiguos en disco. Para leer el archivo se leen bloques uno detrás de otro. Solo es necesario mover la cabeza cuando se pasa del último sector de un cilindro al primer sector del siguiente, y en este caso sólo hay que desplazarla una pista. De esta manera, el número de posicionamientos en disco para lograr el acceso a archivos asignados contiguamente es mínimo, al igual que el tiempo de posicionamiento cuando éste se requiere. Página 15 Rafael Lozano Gestión de E/S y los Sistemas de Archivos Figura 3.- Asignación contigua La entrada del directorio para cada archivo indica la dirección del bloque inicial y el número de bloques ocupados por el archivo. El problema con la asignación contigua consiste en encontrar espacio para un nuevo archivo. Si el archivo que hay que crear tiene una longitud de n bloques, debemos recorrer la lista de espacio libre hasta encontrar n bloques libres contiguos. Si se trata de un vector de bits, necesitamos encontrar n bits seguidos con valor 0; en una lista de direcciones y recuentos, se requiere un recuento de por lo menos n. A la hora de asignar espacio en disco a un nuevo archivo a partir de una lista de huecos libres hay tres estrategias: ✔ Primer ajuste.- Se asigna el primer espacio libre contiguo encontrado que puede albergar al nuevo archivo. ✔ Mejor ajuste.- Se asigna el espacio libre contiguo más pequeño que puede albergar al nuevo archivo. ✔ Peor ajuste.- Se asigna el espacio libre contiguo más grande que puede albergar al nuevo archivo. Las simulaciones han mostrado que el primer ajuste y el mejor ajuste son mejores que el peor ajuste en cuanto al tiempo y la utilización del almacenamiento. Del primer ajuste y el mejor ajuste, ninguno es definitivamente superior al otro en términos de utilización del almacenamiento, aunque por lo general el primer ajuste es más rápido. Estos algoritmos presentan problemas de fragmentación externa. Al asignar y eliminar archivos, el espacio libre en disco se divide en pequeños pedazos. La fragmentación externa surge cuando el espacio total en disco es suficiente para atender una solicitud, pero este espacio no es contiguo, ya que el almacenamiento está dividido en muchos huecos pequeños. Con la asignación contigua se presentan otros problemas; uno de los principales consiste en determinar cuánto espacio se necesita para el archivo. Al crear un archivo, hay que encontrar y asignar todo el espacio que necesitará. En algunos casos es fácil determinarlo, por ejemplo al copiar un archivo, pero casi siempre será difícil estimar el tamaño de un archivo de salida. Otro problema se presenta a la hora de añadir información al archivo. Si a ambos extremos del archivo no hay espacio libre no puede extenderse este, lo que obliga a reservar espacio para un archivo, implicando un desperdicio en el almacenamiento. 4.6.2 Asignación enlazada La asignación enlazada resuelve los problemas que se presentaban en el apartado anterior, ya Página 16 Rafael Lozano Gestión de E/S y los Sistemas de Archivos que cada archivo es una lista enlazada de bloques de disco que pueden encontrarse en cualquier parte del disco. El directorio contiene un puntero al primer y último bloque del archivo. Cada bloque del archivo contiene un puntero al siguiente. Figura 4.- Asignación enlazada Es fácil crear un archivo. Simplemente creamos una nueva entrada en el directorio del dispositivo. Con la asignación enlazada, cada entrada del directorio tiene un puntero al primer bloque del archivo en el disco. En un principio se asigna el valor NULO para representar un archivo vacío, y también se asigna cero al campo tamaño. Una escritura a un archivo quita el primer bloque disponible de la lista de espacio libre y escribe en él; luego se enlaza el nuevo bloque al final de archivo. Para leer un archivo, basta con leer los bloques siguiendo los punteros. Con la asignación enlazada no hay fragmentación externa, puesto que como todos los bloques están enlazados, cualquiera de la lista de espacio libre puede utilizarse para satisfacer una solicitud. Observe que tampoco es necesario declarar el tamaño del archivo durante su creación. El archivo puede continuar su crecimiento mientras queden bloques libres. No obstante, la asignación enlazada tiene desventajas. El mayor problema es que sólo puede aplicarse eficazmente con archivos de acceso secuencial. Para encontrar el bloque i de un archivo tenemos que comenzar en el principio del archivo y seguir los punteros hasta llegar al bloque. Cada acceso a un puntero implica una lectura del disco, por lo que es poco eficiente en archivos de acceso directo. Otro problema es el espacio que ocupan los punteros, pero el mayor problema es la confiabilidad. Como los archivos están enlazados por punteros dispersos por todo el disco, considere lo que puede suceder si se pierde o daña un puntero. Un error en el software del sistema operativo o una avería en el hardware del disco pueden provocar que se elija el puntero incorrecto, enlazando el archivo a la lista de espacio libre o a otro archivo diferente. Página 17 Rafael Lozano Gestión de E/S y los Sistemas de Archivos 4.6.3 Asignación enlazada usando una tabla en memoria Consiste en mantener en memoria una tabla con un elemento por cada bloque del disco. El elemento i contiene el índice del siguiente bloque del archivo. El elemento del último bloque del archivo contiene -1 o un marcador especial. A esta tabla se le conoce como FAT (File Allocation Table). Utilizando esta organización, el bloque completo está disponible para los datos. Además, el acceso aleatorio es mucho más sencillo. Aunque aún se debe seguir la cadena para encontrar un desplazamiento dado dentro del archivo, la cadena está completamente en memoria y se puede seguir sin necesidad de hacer referencias al disco. Al igual que el método anterior, la entrada de directorio necesita mantener sólo un entero (el número de bloque inicial) y aún así puede localizar todos los bloques, sin importar lo grande sea el archivo. La principal desventaja de este método es que toda la tabla debe estar en memoria todo el tiempo para que funcione. Con un disco de 200 GB y un tamaño de bloque de 1 KB, la tabla necesita 200 millones de entradas, una para cada uno de los 200 millones de bloques de disco. Cada entrada debe tener un mínimo de 3 bytes. Para que la búsqueda sea rápida, deben tener 4 bytes. Así, la tabla ocupará 600 MB u 800 MB de memoria principal todo el tiempo, dependiendo de si el sistema está optimizado para espacio o tiempo. Esto no es muy práctico. Es claro que la idea de la FAT no es adecuada en los discos grandes. 4.6.4 Asignación indexada La asignación enlazada resuelve todos los problemas de fragmentación externa y declaración de tamaño de la asignación contigua, pero no ayuda al acceso directo, pues los bloques están dispersos por todo el disco, al igual que los punteros a los bloques. La asignación indexada resuelve este problema reuniendo todos los punteros en un solo lugar: el bloque de índices. Cada archivo tiene su propio bloque de índices, el cual es un vector de direcciones de bloques en disco. La entrada i en el bloque de índices apunta al bloque i del archivo. El directorio contiene la dirección del bloque de índices. Para leer el bloque i, usamos el puntero de la entrada i del bloque de índices para localizar y leer el bloque deseado. Al crear el archivo, se asigna NULO a todos los punteros del bloque de índices. Cuando el bloque i se escribe por primera vez se saca un bloque de la lista de espacio libre y se coloca su dirección en la entrada i del bloque de índices. La asignación indexada permite el acceso directo, sin problemas de fragmentación externa, ya que puede usarse cualquier bloque del disco para atender una solicitud de espacio adicional. La asignación indexada presenta un problema de desperdicio de espacio. La mayoría de los archivos son pequeños. Supongamos que tenemos un archivo de sólo uno o dos bloques. Con la asignación indexada hay que asignar todo el bloque de índices, aunque sólo uno o dos apuntadores no serán nulos. Al llegar a este punto surge la duda sobre el tamaño del bloque de índices. Cada archivo debe tener un bloque de índices, por lo que queremos que éste sea lo más pequeño posible. Sin embargo, si es demasiado pequeño, no podrá almacenar todos los punteros para un archivo grande, por lo que es necesario un mecanismo para tratar con esta situación: ✔ Esquema enlazado. Un bloque de índices normalmente es un bloque en disco; por Página 18 Rafael Lozano Gestión de E/S y los Sistemas de Archivos consiguiente, puede leerse y escribirse directamente. Para permitir archivos de gran tamaño, podemos enlazar varios bloques de índices. Por ejemplo, un bloque de índices puede contener un pequeño encabezado con el nombre del archivo y un conjunto de los primeros cien punteros de bloques en el disco. El siguiente puntero, el último en el bloque de índices, es NULO, si se trata de un archivo pequeño, o un puntero a otro bloque de índices, si el archivo es grande. ✔ Índice multinivel. Una variante de la representación enlazada consiste en emplear un bloque de índices separado que apunte a los bloques de índices, que a su vez apunta a los bloques del archivo. Para lograr el acceso a un bloque, el sistema operativo utiliza el índice del primer nivel para encontrar el de segundo nivel, y así localizar el bloque de datos. Este procedimiento puede continuar a un tercer o cuarto nivel, pero generalmente bastan dos niveles. Si podemos almacenar 256 punteros en un bloque de índices, con dos niveles se permiten 65.536 bloques, que representan a 1.024 bytes por bloque un archivo de 67.108.864 bytes, un tamaño bastante considerable. ✔ Esquema combinado. Otra alternativa que se usa en el sistema UNIX es conservar, digamos los primeros 15 punteros del bloque de índices en el directorio del dispositivo. Los primeros 12 apuntan a bloques directos; es decir, contienen las direcciones de bloques que almacenan datos del archivo. De esta manera no es necesario un bloque de índices aparte para archivos pequeños (máximo 12 bloques). Los otros tres punteros hacen referencia a bloques indirectos. El primer puntero del bloque indirecto es la dirección de un bloque indirecto sencillo, un bloque de índices que no contiene datos, sino las direcciones de bloques que sí los contiene. Luego está el puntero del bloque indirecto doble, que contiene la dirección de un bloque que almacena las direcciones de otros bloques que apuntan a los bloques de datos. El último apuntador contendría la dirección de un bloque indirecto triple. 5 Sistemas de archivos más conocidos A continuación se describen los sistemas de archivos más conocidos. El sistema FAT y sus variantes se han empleado en sistemas MS-DOS y Windows, hasta su reemplazo por NTFS. Los sistemas de archivos ext2,3 y 4 son los habituales en los sistemas GNU/Linux. 5.1 Sistema de archivos FAT Este sistema de ficheros se basa en una tabla de asignación de archivos (FAT File Allocation Table) que actúa de índice para localizar un archivo en el dispositivo de almacenamiento. En ella se almacenan los grupos o cluster utilizados por cada archivo, los grupos libres y los defectuosos. No hace falta decir que en unidades de gran capacidad, la tabla es necesariamente muy grande. Generalmente se carga en memoria para agilizar los procesos, ya que es de uso constante y cualquier operación de lectura/escritura tiene que utilizarla. Existen varios tipos de este sistema de ficheros dado que ha ido evolucionando y adaptándose. Primero surgió la FAT de 12 bits, posteriormente la de 16 bits y finalmente la de 32 bits. Estos tres tipos de sistemas de ficheros poseen la misma estructura lógica y su funcionamiento es, en esencia, el mismo. Página 19 Rafael Lozano Gestión de E/S y los Sistemas de Archivos Figura 5.- Estructura del sistema de archivos FAT La estructura del sistema de ficheros FAT está formada por: ✔ El sector de arranque.- Siempre es el primer sector de la partición (volumen) e incluye información básica, punteros a las demás secciones, y la dirección de la rutina de arranque del sistema operativo. ✔ Área FAT.- Contiene dos copias de la tabla de asignación de archivos (por motivos de seguridad). Estos son mapas de la partición, indicando qué clusters están ocupados por los archivos. ✔ Directorio raíz.- Es el índice principal de carpetas y archivos. ✔ Área de datos.- Es el lugar donde se almacena el contenido de archivos y carpetas. 5.1.1 La tabla FAT La tabla FAT es un índice de todos los clusters existentes en el sistema de archivos. Mediante este índice se tiene información del estado de cada cluster y de los clusters ocupados por cada archivo. Esta tabla se encuentra a continuación del sector de arranque y su copia inmediatamente adyacente. En la tabla FAT existe un campo o celda (de 12, 16 o 32 bits, según la versión de FAT) por cada cluster de la partición denominado entrada. El campo n de la FAT representa el cluster n de la partición. El sistema FAT de 32 bits tiene las entradas de 32 bits, aunque los 4 primeros están reservados y no se utilizan, por lo que su capacidad de gestión es de 2 28 = 268.435.456 clusters distintos. Esto implica que, su máxima capacidad es de 8 TB, considerando un grupo de tamaño máximo teórico de 32 KB. Sin embargo, en la práctica FAT32 solamente permite particiones de 2 TB como máximo. Cada entrada de la FAT puede indicar: ✔ Si el cluster correspondiente está disponible. ✔ Si el cluster correspondiente está en uso. ✔ Si el cluster correspondiente está dañado. ✔ Si es el último cluster de un archivo. ✔ Si es el número del siguiente cluster de un fichero. Hay que darse cuenta de la importancia de esta tabla, ya que su pérdida significa la pérdida de todos los datos del sistema de ficheros. Por ello esta tabla se encuentra duplicada, a continuación de la tabla original, para intentar asegurar su integridad. Todas las operaciones sobre ficheros que Página 20 Rafael Lozano Gestión de E/S y los Sistemas de Archivos impliquen la modificación de la tabla original provocan la misma modificación en la tabla copia. Tan sólo en el caso en que se descubran defectos en la tabla original se procederá a sustituirlos, si es posible, por los datos guardados en la tabla copia. 5.1.2 El directorio raíz El directorio raíz es un índice con información de los archivos y directorios del volumen. Se encuentra a continuación de la copia de la tabla FAT. Además en el directorio raíz se almacena también la etiqueta del disco. Cada entrada en un directorio es de 47 bytes en FAT32 y contiene información como el nombre y extensión del archivo, sus atributos, el espacio reservado, fecha y hora de la última modificación, el tamaño y el número del primer cluster. Para el tamaño se reservan 4 bytes (32 bits), de ahí que el tamaño máximo de archivo sea de 2 32 = 4GB. El número del primer cluster de cada archivo, junto con otros datos del mismo, se anota como entrada en el directorio, como mencionamos anteriormente. A su vez, la entrada correspondiente a dicho primer cluster en la tabla FAT, contiene el número de segundo cluster del fichero, cuya entrada contiene el número del tercero, etc. El proceso se repite sucesivamente con todos los cluster del fichero hasta llegar al último, cuya entrada no puede contener el número del siguiente, porque no existe, de forma que contiene una marca especial EOF (End of file) de final de fichero. Hay que darse cuenta de que es en la entrada de directorio dónde se encuentra el primer clúster dónde se encuentran los datos del fichero. Por lo que una modificación o pérdida de este campo o de la entrada en sí provoca la pérdida de los datos del fichero. 5.1.3 El área de datos El área de datos almacena todos los subdirectorios y ficheros de los usuarios. Ocupa aproximadamente, el 98 % del espacio del sistema. Tamaño de bloque lo escoge el sistema operativo en función del tamaño a direccionar. Tamaño de la partición < 128 Mb Tamaño de Cluster 512 bytes 128 Mb – 256 Mb 256 Mb – 512 Mb 4 Kb 512 Mb – 1 Gb 1 Gb – 2 Gb 2 Gb – 8 Gb 8 Gb – 16 Gb 8 Kb 16 Gb – 32 Gb 16 Kb 32 Gb – 2 Tb 32 Kb Página 21 Rafael Lozano Gestión de E/S y los Sistemas de Archivos 5.2 Sistemas de archivos NTFS NTFS (New Technology File System) es un sistema de archivos de Microsoft incluido en todas las versiones de Windows desde 2000 y XP. Reemplaza al sistema de archivos FAT en sistemas Windows con el objetivo de crear un sistema de archivos eficiente, robusto y con seguridad incorporada desde su base. Entre sus características están: ✔ NTFS permite definir el tamaño del clúster de forma independiente al tamaño de la partición. ✔ El tamaño mínimo del bloque es de 512 bytes. ✔ Este sistema también admite compresión nativa de archivos y encriptación. ✔ Permite el uso de nombres extensos, aunque, a diferencia de FAT32, distingue entre mayúsculas y minúsculas. ✔ Es un sistema ideal para particiones de gran tamaño. El tamaño mínimo de la partición es de 10 GB y el máximo recomendado en la práctica es 2 TB. ✔ Puede manejar volúmenes de hasta 16 TB usando clústeres de 4 KiB. ✔ Utiliza una estructura de datos avanzadas (árboles-B) para optimizar el rendimiento, ofrecer mejor estabilidad y aprovechamiento del espacio en disco. ✔ Contempla el uso de las listas de control de acceso para garantizar la seguridad de los archivos. ✔ Realiza registro de transacciones (Journaling). El concepto de journaling se refiere a que si se arranca el sistema sin haberlo cerrado correctamente no es necesario hacer un chequeo ya que la recuperación sucede de forma automática a partir de su último estado. NTFS es un sistema seguro ante fallos que puede auto corregirse en casi todas las situaciones. Su principal inconveniente es que necesita para sí mismo una buena cantidad de espacio en disco duro, por lo que no es recomendable su uso en discos con menos de 400 MB. La estructura de una partición con el sistema de archivos NTFS es la siguiente: ✔ Boot Partition Record.- En los primeros 8Kb se almacena la información sobre el volumen (tipo de partición, capacidad, etc.), junto con el bloque del código básico para iniciar al sistema operativo. ✔ Área MFT (Metadata File Table). La tabla maestra contiene el donde y el como están almacenados los archivos junto con todos los atributos asociados a estos. ✔ Archivos del Sistema.- Contiene la información sobre los datos y operaciones que se realizan sobre el sistema de archivos: espacio libre, log de transaccionalidad, etc. ✔ Área de archivos.- Donde realmente se almacenan los datos del usuario. En NTFS puede tenerse tamaño de cluster desde 512 bytes hasta 64 KBytes. Los discos NTFS se Página 22 Rafael Lozano Gestión de E/S y los Sistemas de Archivos dividen, simbólicamente, en dos partes: 1. El primer 12% del disco se asigna al área MFT, un espacio en el cual crecen los metafile. 2. El resto es el área de datos. No obstante lo dicho anteriormente cualquier informe del SO acerca del espacio libre en el disco incluye el área MFT. El mecanismo del área MFT es el siguiente: cuando no haya espacio para almacenar mas archivos se toma espacio del área MFT y se reduce su longitud una vez que vuelve a existir espacio el área MFT vuelve a crecer. 5.2.1 MFT La MFT se describe como una base de datos relacional compuesta de filas (los registros) y columnas (los atributos). Habrá un registro (entrada en la tabla) por cada archivo que exista en el sistema de archivos. Ahora bien, el concepto de archivo es bastante amplio: toda entidad almacenada individualmente es considerada un archivo. La propia MFT es considerada un archivo y tiene su propia entrada en la MFT. Las primeras 16 entradas de la MFT están reservadas para almacenar archivos del sistema, es decir, información sobre el propio sistema de archivos. El resto de entradas se corresponden con los archivos y carpetas de datos. La MFT es un directorio centralizado que contiene información de todos los archivos del disco incluyéndolo a él mismo. Este archivo se divide en registros de longitud fija (usualmente un 1 KByte) y cada registro corresponde a algún archivo. También se le denomina descriptor y una copia suya se almacena en el segundo registro. El tercer registro contiene el archivo de registro. Este es un archivo que contiene todas las acciones llevadas a cabo en la partición para el caso de necesitar hacer una recuperación si ocurre un fallo. A continuación se muestran los registros correspondientes a los archivos del sistema. Página 23 Rafael Lozano Gestión de E/S y los Sistemas de Archivos Figura 6.- Metafiles en NTFS Los siguientes registros, que constituyen lo que se conoce como el núcleo, hacen referencia a cada archivo y directorio de la partición en la forma de objetos con atributos. Esto implica que la información que concierne a cada archivo se almacena en un archivo y éste se registra dentro de la MFT. Toda la información acerca de los archivos (todo menos los datos) se almacena en registros Página 24 Rafael Lozano Gestión de E/S y los Sistemas de Archivos MFT: su nombre, longitud, posición en el disco, etc., para lo cual se pueden usar uno o varios registros MFT que no tienen que estar contiguos. Los datos del archivo pueden estar en un registro MFT, por ejemplo un archivo sin datos o un archivo pequeño que pudiera estar dentro del límite de registros MFT. 5.2.2 Los archivos del sistema Hemos visto que los 16 primeros archivos en la MFT son archivos del sistema, cada uno de ellos es responsable de algún aspecto del SO y contienen información del sistema de archivos, no siendo accesibles para el SO. Estos archivos se denominan metafiles y sus nombres comienzan por $. El primero y más importante es el $MTF que hace referencia al área MFT que está situado en ésta. Estos primeros 16 elementos de la MFT constituyen la única parte del disco que tiene una posición fija. Resulta interesante notar que existe una segunda copia de los tres archivos registros y está almacenada exactamente en la mitad del disco, el resto de los metafiles se pueden almacenar en cualquier otro archivo que resida en cualquier parte del disco. 5.3 Sistema de archivos ext2, ext3 y ext4 Los sistemas de archivos ext2 (second extended filesystem), ext3 (third extended filesystem) y ext4 (fourth extended filesystem) son los sistemas de archivos que se han utilizado por el kernel de Linux. Estos sistema de ficheros se basa, principalmente, en el concepto de inodos y en la utilización de mapas de bits para la gestión del espacio libre. Son de los sistemas de ficheros más completos y más eficientes, en cuanto a los objetivos a conseguir. Por el contrario, también son bastante más complejo en cuanto a su estructura y a su funcionamiento. Su estructura es la siguiente: Figura 7.- Estructura del sistema de archivos ext2,3 y 4 Las diferencias entre ext2, ext3 y ext4 con las siguientes. Sistema de archivos Características ext2 ✔ ✔ ✔ No contempla journaling. Tamaño máximo de partición es de 32 Terabytes. Tamaño máximo de archivo es de 2 TB. ext3 ✔ ✔ Permite journaling, por tanto más seguro y fiable. Tamaño máximo de partición y archivo igual que ext2. ext4 ✔ ✔ ✔ Permite journaling. Tamaño máximo de partición de 1EB. Tamaño máximo de archivo de 16 TB. Página 25 Rafael Lozano Gestión de E/S y los Sistemas de Archivos ✔ Permite escritura retrasada. Ahora veremos los elementos de su estructura. 5.3.1 Grupos de bloques El primer bloque (bloque de arranque) nunca es manejado por el sistema de archivos, dado que esta reservado para el sector de arranque. El resto de la partición se divide en grupos de bloques, reducen la fragmentación, dado que el kernel intenta mantener los bloques de datos de un archivo en el mismo grupo de bloques, si es posible. Cada bloque en el grupo contiene algunas de las siguientes piezas de información: ✔ Una copia del superbloque del sistema de archivos. ✔ Una copia del grupo de descriptores de grupos de bloques. ✔ Un mapa de bits de bloque. ✔ Un grupo de inodos. ✔ Un mapa de bits de inodos. ✔ Área de datos Tanto el superbloque como los descriptores de grupo están duplicados en cada grupo de bloques. Sólo el superbloque y los descriptores de grupos incluidos en el grupo de bloques 0 son utilizados por el kernel, mientras que las demás copias se dejan sin modificar; de hecho, nunca las mira. Cuando se realiza una comprobación de consistencia del sistema de archivos, referencia el superbloque y los descriptores de grupos de bloques de grupo 0 copiándolos en el resto de grupos de bloques. Si se produce una corrupción de datos, y el superbloque y los descriptores de grupos del grupo 0 se hacen inválidos, se puede referenciar las copias de otros grupos diferentes del 0. Usualmente, las copias redundantes tienen suficiente información para permitir al programa de comprobación retornar la partición a un estado consistente. 5.3.2 El superbloque El superbloque forma base del sistema de ficheros, la información contenida aquí permite al administrador del sistema de ficheros usar y mantener el sistema. Normalmente sólo se lee el superbloque del grupo de bloque 0 cuando se monta el sistema de ficheros pero cada grupo de bloque contiene una copia duplicada en caso de que se corrompa sistema de ficheros. Fundamentalmente tiene la siguiente información: ✔ Tamaño total del sistema de archivos, en bloques o nodos-i. ✔ Número de bloques libres del sistema. ✔ Número de bloques reservados a nodos-I. ✔ Número de nodos-I libres. ✔ Dirección del primer bloque de datos. Página 26 Rafael Lozano Gestión de E/S y los Sistemas de Archivos ✔ Tamaño de un bloque de datos. ✔ Tamaño de un bloque parcial de datos. ✔ Hora de la última modificación sistema archivos. ✔ Hora integración (montaje) del sistema. ✔ Número de versión del sistema. ✔ Hora de la última verificación del sistema. 5.3.3 Descriptores de grupo Cada grupo de bloque tiene una estructura de datos que lo describe denominada descriptores de grupos. Como el superbloque, todos los descriptores de grupo se duplican en cada grupo de bloque en caso de corrupción del sistema de fichero. Cada descriptor de grupo contiene la siguiente información: ✔ Mapa de bits de los inodos y los bloques de datos. ✔ Tabla de inodos.- Contiene el número del primer bloque de la tabla de inodos. ✔ Área de datos.- Contiene los bloques de datos de los archivos. Los mapas de bits sirven para determinar el estado, libre o usado, de una parte del sistema de ficheros. En este sistema de ficheros existen dos mapas de bits: ✔ El mapa de bits de inodos. ✔ El mapa de bits de bloques de datos Existe una relación entre cada bit del mapa de bits y cada bloque o inodo. De esta forma, si el bit 305 del mapa de bits está marcado como usado, quiere decir que el bloque de datos o el inodo 305 está usado. Así, se consigue localizar bloques o inodos libres, de forma rápida y eficiente, cuando sean necesarios. 5.3.4 Inodo El inodo o nodo índice es la estructura de datos básica empleada por este sistema de ficheros para localizar la información relativa a cada fichero. Este sistema de ficheros mantiene en cada grupo descriptor todos los inodos en una tabla conocida como tabla de inodos situada a continuación del mapa de bits. Un inodo contiene toda la información acerca del fichero que representa y tiene acceso, en mayor o menor medida, a los bloques usados por el fichero. Cada fichero guarda su información en un inodo, por lo que el número máximo de ficheros está limitado por el número de inodos existentes, aunque existan muchos bloques libres en el sistema. La estructura de un inodo es fija y ocupa 128 bytes. Los principales campos de un inodo son: Campo Tipo y protección Tamaño 2 bytes Página 27 Rafael Lozano Gestión de E/S y los Sistemas de Archivos Identificador de usuario 2 bytes Tamaño del fichero (en bytes) 4 bytes Fecha último acceso 4 bytes Fecha última modificación inodo 4 bytes Fecha última modificación datos 4 bytes Identificador del grupo de usuario 2 bytes Número de enlaces 2 bytes Punteros a bloques 52 bytes Nótese que el nombre del fichero no se encuentra en el inodo correspondiente, sino que sólo se encuentra en las entradas de directorio. Los punteros a bloques indican los números de bloque dónde se encuentran los datos del fichero. Estos punteros tienen la siguiente organización: ✔ 10 punteros a bloques de datos, llamados punteros directos. ✔ 1 puntero a un bloque con punteros directos a datos, llamado puntero simple. ✔ 1 puntero a un bloque con punteros simples apuntando cada uno de ellos a bloques con punteros directos, llamado puntero doble. ✔ 1 puntero a un bloque de datos con punteros dobles apuntando a bloques con punteros simples, que a su vez, apuntan a bloques con punteros directos, llamado puntero triple. Los tres punteros indirectos dependen del tamaño de bloque para su funcionamiento. Dado que, cada uno de ellos apunta a un bloque que contiene punteros, hay que saber cuántos caben en un bloque, y para ello es necesario saber cuál es el tamaño de bloque del sistema. Una vez conocido, supongamos 4 KB, se divide éste por el tamaño de un puntero (4 bytes) y se obtiene el número de punteros por bloque, en este caso 1024 punteros. 5.3.5 Área de datos El área de datos es la parte del sistema de ficheros destinada a almacenar los datos de los ficheros. Se encuentra a continuación de los inodos y ocupa la mayor parte del sistema de ficheros, cerca del 90%. En esta área se encuentra tanto los datos de los ficheros (definidos por el usuario) como los bloques de punteros usados por los inodos. Un directorio se comporta, como ya hemos visto anteriormente como un archivo. El contenido de los directorios no apunta directamente a bloques de datos de los ficheros, sino a un inodo dónde se encuentra la información del fichero. El número de bytes por entrada del directorio depende de la versión, ya que hay versiones en los que la longitud del nombre de un archivo puede llegar a 255 bytes y otras en las que sólo llega a 14. Pero, todas las entradas contienen: ✔ El número de inodo dónde se encuentran los datos del fichero, situado en los dos primeros bytes. Página 28 Rafael Lozano ✔ Gestión de E/S y los Sistemas de Archivos El nombre del archivo situado en el resto de la entrada. Además, cualquier directorio contiene un mínimo de dos entradas: ✔ Una referencia a si mismo (.). ✔ Una referencia al directorio de que depende o directorio padre (..), salvo en el directorio raíz, que al ser el comienzo de la estructura, esta referencia también es sobre sí mismo. Página 29 Rafael Lozano Gestión de E/S y los Sistemas de Archivos 6 Bibliografía WIKIPEDIA, Hilo de ejecución [acceso septiembre <http://es.wikipedia.org/wiki/Hilo_de_ejecuci%C3%B3n> 2014]. Disponible en TANENBAUM, A. T., Sistemas Operativos Modernos – 3ª Edición. 2009 Pearson Prentice Hall, ISBN 978607-442-046-3 Página 31