SISTEMA DE FICHEROS EN UNIX SISTEMA DE FICHEROS UNIX J. Santos SISTEMA DE FICHEROS EN UNIX CONTENIDOS: - El subsistema de ficheros en la arquitectura general de Unix. - El buffer caché. - Estructura del buffer caché. - Funcionamiento del buffer caché: algoritmos. - Partes del sistema de ficheros: bloque boot, superbloque, lista de inodos, bloques de datos. - Representación interna de ficheros. - Inodos. - Estructura de ficheros regulares. - Directorios. - Creación de ficheros. Asignación de inodos y bloques de disco. - Llamadas al sistema para el manejo de ficheros. - Tabla de inodos, tabla de ficheros del sistema y de descriptores de ficheros de usuario. - Llamadas open, close, read, write, lseek. - Llamadas link y unlink: concepto de hard link. - Llamadas mount y umount: concepto de sistema de ficheros montado. - Variantes del sistema de ficheros Unix BSD. - Grupos de cilindros. - Directorios con entradas de tamaño variable. - Links simbólicos. - Sistemas de ficheros con registro. 2 SISTEMA DE FICHEROS UNIX J. Santos INTRODUCCIÓN Una gran parte del tiempo el SO está accediendo a información en dispositivos de bloques. La relativa lentitud de discos respecto a CPU. Necesidad de incrementar la velocidad en los accesos a información en disco. MÓDULO AMORTIGUADOR BUFFER CACHE DE ACCESOS A DISCO: Minimiza la frecuencia de accesos a disco, manteniendo unos buffers en memoria para contener la información de algunos bloques del disco. Con un tamaño reservado para mantener en memoria 100 1000 bloques del disco se logra no tener que leer (releer) del disco para satisfacer el 85% de las peticiones. 3 SISTEMA DE FICHEROS UNIX J. Santos SITUACIÓN DENTRO DEL NÚCLEO DEL SO El Buffer Cache constituye una estructura intermedia en memoria entre el subsistema de ficheros de Unix y los manejadores de dispositivos de bloque. Su función es amortiguar los accesos a tales dispositivos de bloque manteniendo un número limitado de buffers en memoria que contienen la información de bloques de disco. Cada vez que se requiere una lectura de un bloque en disco se determina si la información está actualmente en la cache. Si se produce un acierto el sistema operativo se ahorra una operación de entradasalida sobre el disco. De igual modo cuando se escribe un bloque a disco se mantendrá la información en la cache el mayor tiempo posible, de modo que 4 SISTEMA DE FICHEROS UNIX J. Santos sobreescrituras posteriores del mismo bloque no implican operaciones de escritura en disco. Esto se manifiesta en la figura de tasa de fallos en el acceso a la cache frente al tamaño de la cache para una versión particular de Unix, en la que además se pone de relieve que existe un tamaño a partir del cual el incremento en el número de buffers no implica un descenso notable en el número de fallos en el acceso. 5 SISTEMA DE FICHEROS UNIX J. Santos Tasa de fallos respecto a tamaño de cache con gestión LRU [Stallings 96]. ESTRUCTURA DEL BUFFER CACHE Se estudia, primeramente, la estructura de un buffer que almacena temporalmente los datos de un determinado bloque de un disco y la organización interna de ese conjunto de buffers. Se mantienen dos estructuras en esa organización: la lista de buffers libres y una organización en colas de dispersión (hash). La lista de libres incluye aquellos buffers que pueden ser reasignados para contener los datos de otro bloque diferente de disco. En esta lista se buscarán buffers para ser asignados a bloques de datos que se quieran leer o escribir a disco, manteniendo un orden LRU (menos recientemente usado) en el uso de los mismos. La organización en colas hash de los diferentes buffers permitirá una búsqueda rápida en la cache para determinar si un determinado bloque de datos está o no actualmente en la misma. 6 SISTEMA DE FICHEROS UNIX J. Santos ESTRUCTURA DE UN BUFFER Cuerpo del buffer: datos del bloque de disco Encabezamiento del buffer: identificación del buffer y su contenido Estados: - ocupado/libre - datos válidos - escritura retardada - en lectura/escritura actual a/desde disco - hay procesos esperando por el buffer 7 SISTEMA DE FICHEROS UNIX ESTRUCTURA DEL (ORGANIZACIÓN) J. Santos CONJUNTO DE BUFFERS Lista de libres: Todo buffer está en la lista de libres, tenga o no datos válidos, menos los ocupados (por un proceso). Se usa orden LRU (menos recientemente usado). Lista doblemente encadenada para recorrido en ambas direcciones. Cuando un buffer pasa a libre se pasa al final de la lista (acaba de ser usado). Cuando se necesita un buffer para un nuevo bloque se toma el primero de la lista, aunque contenga los datos de otro bloque. 8 SISTEMA DE FICHEROS UNIX J. Santos Colas hash: Todos los buffer se organizan en múltiples colas hash para búsqueda rápida. La función hash opera sobre el número de bloque y número de dispositivo Cada cola hash es circular y doblemente enlazada (el orden no importa). El buffer está en una cola cuando tiene asignado un número de bloque y dispositivo. El SO usará la estructura hash cuando busque un bloque concreto en BC. Las dos estructuras (lista de libres y colas hash) organizan simultáneamente al conjunto de buffers. Todo buffer está al menos en una de ellas, la mayoría de los buffer están en ambas. 9 SISTEMA DE FICHEROS UNIX J. Santos Ejemplo de organización de los buffer en 4 colas hash. DISTRIBUCIÓN DE LA TAREA EN ALGORITMOS A continuación se estudian los diferentes algoritmos que manejan la estructura de la cache. El primero de ellos es el algoritmo getblk, que determina si un bloque concreto está o no en la cache. Si no es así elige uno de los libres para ser asignado al bloque que se requiere leer o escribir. En este algoritmo se pueden presentar cinco situaciones o escenarios diferentes dependiendo de esas dos circunstancias básicas y de posibles condiciones de concurrencia entre procesos. Así, si un proceso requiere un buffer libre y no hay ninguno actualmente, el algoritmo debe manejar esa situación. Y de igual modo, cuando un proceso requiere un buffer y éste está en la cache, pero bloqueado porque se están usando actualmente sus datos, el algoritmo getblk debe suspenderse hasta que se termine el bloqueo en el buffer requerido. Este algoritmo también es responsable de actualizar la información en disco cuando ha elegido un 10 SISTEMA DE FICHEROS UNIX J. Santos Principales algoritmos de manejo del BC. buffer de la lista de libres cuyos datos no están actualizados. Todas estas situaciones se presentan con un ejemplo gráfico y explicativo del escenario correspondiente y los pasos que el algoritmo realiza. En dos escenarios (4 y 5) se presenta, además, un ejemplo de concurrencia entre procesos que explica tales pasos en el algoritmo getblk. Aspectos importantes: - Todo acceso a un bloque de disco se realiza a través de bread() tanto en lectura como en escritura: para escribir un bloque primero debe leerse. - Una vez llamado bread() sobre un bloque, el buffer queda ocupado hasta que se llame a brelse(), que lo pasa a estado libre. - getblk() busca el bloque deseado en BC; si lo encuentra informa a bread(), si no lo encuentra busca y asigna un buffer libre al bloque. En este último caso, si el buffer debe actualizarse a disco llama a bwrite() para que lo realice a través del DD correspondiente. 11 SISTEMA DE FICHEROS UNIX J. Santos ALGORITMO getblk () Algoritmo getblk () entrada: número de bloque, número de dispositivo (S. de F.) salida: dirección del buffer con el bloque (datos válidos o no) { while (no se encuentre buffer) { if (bloque está en cola hash) { if (buffer ocupado) /* ESCENARIO 5 */ { sleep (evento: buffer libre); continue; } marcar buffer como ocupado; /* ESCENARIO 1 */ sacar buffer de lista de libres; return(buffer); } else { if (no hay buffers en lista de libres) /* ESCENARIO 4 */ { sleep(evento: algún buffer libre); continue; } sacar buffer de lista de libres; if (buffer marcado de escritura retardada) /* ESCENARIO 3 */ { escritura asíncrona del buffer a disco (bwrite); continue; } cambiar al buffer de cola hash según nuevo bloque; /* ESCENARIO 2 */ return (buffer); } } } 12 SISTEMA DE FICHEROS UNIX J. Santos 1er Escenario Escenario 1: Se requiere un bloque de datos y ya está en su correspondiente cola hash. Se quita el buffer de la lista de libres. Se marca bloqueado y se retorna. 13 SISTEMA DE FICHEROS UNIX J. Santos 2º Escenario Escenario 2: Se requiere un bloque de datos y no está en la cache. 14 Se quita buffer de la lista de libres. Se resitúa en su cola hash. Se retorna bloqueado. SISTEMA DE FICHEROS UNIX J. Santos 3er Escenario Escenario 3: El bloque elegido de la lista de libres está marcado como de “escritura retardada”. Se quita buffer de la lista de libres. Se inicia escritura asíncrona a disco. Se chequea de nuevo la cache. 15 SISTEMA DE FICHEROS UNIX J. Santos 4º Escenario Escenario 4: la lista de libres está vacía. 16 El proceso se queda en espera de un buffer libre. Al recuperar el procesador chequea de nuevo la cache. SISTEMA DE FICHEROS UNIX J. Santos Ejemplo de concurrencia en la competición por un buffer libre. 17 SISTEMA DE FICHEROS UNIX J. Santos 5º Escenario Escenario 5: bloque en cache, pero ocupado. 18 El proceso se queda en espera de que se libere ese buffer. Al recuperar el procesador chequea de nuevo la cache. SISTEMA DE FICHEROS UNIX J. Santos Ejemplo de concurrencia en la competición por un buffer en el escenario nº 5. 19 SISTEMA DE FICHEROS UNIX J. Santos ALGORITMO bread() Algoritmo bread () entrada: número de bloque, número de dispositivo (S. de F.) salida: dirección del buffer con el bloque { tomar buffer para el bloque (getblk ()); if (datos válidos en buffer) return (buffer); iniciar lectura de disco (llamada al DD); sleep (evento: completada la lectura de disco); return (buffer); } Algoritmo breada () equivalente a bread, pero adelanta la lectura de un segundo bloque de forma asíncrona (sin esperar a que llegue a BC) El algoritmo bread lee un determinado bloque de un disco concreto. Realiza una llamada al anterior algoritmo para determinar si la información que requiere leer está actualmente en la cache. Si no es así inicia una lectura síncrona sobre disco, es decir, se queda en espera hasta que la operación de entrada-salida termina. Existe una variante de este algoritmo, breada, que en accesos secuenciales a un fichero adelanta la lectura del bloque siguiente al actualmente requerido, de modo asíncrono, de forma que probablemente ya estará en la cache cuando se requieran sus datos. El buffer asociado al bloque que se lee de modo síncrono pasará a la lista de libres cuando se termine el segundo trasvase necesario desde la cache al espacio de usuario. Esto lo realizará el subsistema de ficheros invocando al algoritmo brelse. 20 SISTEMA DE FICHEROS UNIX J. Santos ALGORITMO bread() ALGORITMO breada() 21 SISTEMA DE FICHEROS UNIX J. Santos ALGORITMO bwrite() Algoritmo bwrite () entrada: buffer salida: nada { iniciar escritura a disco; /* llamada a DD */ if (E/S síncrona) { sleep (evento: E/S completada); liberar buffer (brelse); } else if (buffer de escritura retardada) marcar buffer como viejo; /* llamada a brelse desde el DD, al terminar */ } El algoritmo encargado de bwrite es actualizar el los contenidos de un buffer de la cache en disco cuando es necesario. Se invoca por parte del algoritmo getblk cuando se da esta situación y además ese buffer fue elegido en el orden LRU del uso de la lista de libres para ser reasignado a otro bloque de datos diferente. Esta operación de escritura es asíncrona de modo que el algoritmo continúa su ejecución al mismo tiempo que se realiza la actualización en disco. Es el controlador del hardware el que en esta ocasión invoca al algoritmo brelse, cuando termina la escritura, para pasar el buffer de la cache a la lista de libres. 22 SISTEMA DE FICHEROS UNIX J. Santos ALGORITMO brelse() El algoritmo de liberación de un buffer, brelse, despierta aquellos procesos que se habían bloqueado a la espera de un buffer libre o bien a la espera del desbloqueo de un buffer concreto. Al liberar un buffer y para mantener el orden LRU de uso de los libres lo coloca al final de la lista. El caso particular sucede cuando es elegido un buffer que no tenía actualizados sus datos en disco. En este caso se actualiza previamente esa información (escritura asíncrona), el buffer todavía no se reasigna a otro bloque diferente hasta terminar la escritura, y cuando ésta termina se libera el buffer pero se sitúa en la cabecera de la lista de libres para mantener el orden LRU de uso de esos buffers libres. 23 SISTEMA DE FICHEROS UNIX J. Santos Como se puede dar la situación de que varios controladores de disco liberen al mismo tiempo un buffer, la lista de libres debe ser protegida como sección crítica. Un método sencillo para ello, válido en entornos monoprocesador, es bloquear las interrupciones provenientes de los controladores, y habilitarlas al final del manejo de la sección crítica. Algoritmo brelse () entrada: buffer ocupado; salida: nada { wakeup(evento: esperando por algún buffer libre); wakeup(evento: esperando por este buffer en concreto); bloquear interrupciones; if (buffer con datos válidos y buffer no viejo) /* antiguo escritura retardada */ poner buffer al final de lista de libres; else poner buffer al principio de lista de libres; habilitar interrupciones; marcar buffer como libre; } 24 SISTEMA DE FICHEROS UNIX J. Santos PROBLEMA DE BC EN SISTEMAS DISTRIBUIDOS Estructura de capas en NFS. 25 SISTEMA DE FICHEROS UNIX J. Santos Problema de coherencia de cache. La introducción de una cache de bloques introduce ese problema potencial de coherencia de la información en sistemas de ficheros distribuidos que mantienen una cache en el lado de los clientes. 26 SISTEMA DE FICHEROS UNIX J. Santos VENTAJAS DE BUFFER CACHE Reducción del tráfico de acceso a disco: incremento en productividad y disminución del tiempo de respuesta del sistema. Seguridad en el Sistema de Ficheros y acceso directo a disco (DD bloque): una sola imagen de cada bloque y getblk protege contra sección crítica en acceso simultáneo. Diseño del sistema más simple: acceso al disco uniforme vía BC, modularidad. No hay necesidad de consideraciones sobre el hardware para el acceso a disco: los problemas de alineación de datos para E/S se tratan en el BC, lo que redunda en portabilidad y sencillez. DESVENTAJAS DE BUFFER CACHE Sistema más vulnerable a pérdidas de control y situaciones catastróficas: muchos bloques del disco no están realmente actualizados. Doble copia de los datos: del disco a BC y de BC al espacio del proceso y viceversa. Si los datos transmitidos son muchos (distintos bloques) la copia extra hace que el sistema sea más lento que sin BC. 27