Los cambios en la tecnología están ejerciendo presión sobre los sistemas de archivos actuales. En especial, las CPUs se hacen más veloces, los discos se están haciendo más grandes y baratos (pero no mucho más rápidos) y las memorias están aumentando su tamaño en forma exponencial. El úni- co parámetro que no está teniendo grandes avances es el tiempo de búsqueda de disco. La combi- nación de estos factores indica que un cuello de botella de funcionamiento está creciendo en muchos sistemas de archivos. Las investigaciones realizadas en Berkeley trataron de aliviar este problema al diseñar un tipo de sistema de archivos completamente nuevo, llamado LFS (Log-struc- tured File System, Sistema de archivos estructurado por registro). En esta sección describiremos brevemente cómo funciona LFS. Consulte un tratamiento más completo en Rosenblum y Ouster- hout, 1991.
La idea que impulsó el diseño del LFS es que, a medida que las CPUs se vuelven más rápidas y las memorias RAM se hacen más grandes, las cachés de disco también se incrementan con rapi- dez. En consecuencia, ahora es posible satisfacer una fracción muy considerable de todas las peti- ciones de lectura directamente del caché del sistema de archivos, sin necesitar accesos al disco. De esta observación podemos deducir que en el futuro la mayoría de los accesos al disco serán escri- turas, por lo que el mecanismo de lectura adelantada utilizado en algunos sistemas de archivos pa- ra obtener bloques antes de necesitarlos ya no gana mucho en rendimiento.
Para empeorar las cosas, en la mayoría de los sistemas de archivos las escrituras se realizan en trozos muy pequeños. Las pequeñas escrituras son altamente ineficientes, ya que una escritura en dis- co de 50 µseg a menudo va precedida de una búsqueda de 10 mseg y de un retraso rotacional de 4 mseg. Con estos parámetros, la eficiencia en disco disminuye a una fracción de 1%.
Para ver de dónde provienen todas las pequeñas escrituras, considere la creación de un nuevo archivo en un sistema UNIX. Para escribir este archivo, se deben escribir el nodo-i para el directo- rio, el bloque de directorio, el nodo-i para el archivo y el mismo archivo. Aunque estas escrituras se pueden retrasar, hacerlo expone al sistema de archivos a problemas de consistencia graves si ocu- rre una falla antes de realizar las escrituras. Por esta razón, las escrituras de nodos-i generalmente se realizan de inmediato.
A partir de este razonamiento, los diseñadores del LFS decidieron reimplementar el sistema de archivos de UNIX a fin de que alcance el ancho de banda completo del disco, incluso ante una carga de trabajo que consistiera en gran parte de pequeñas escrituras al azar. La idea básica es estructurar
todo el disco como un registro. De manera periódica, y cuando haya una necesidad especial para ello, todas las escrituras pendientes que se colocaron en un búfer en memoria se recolectan en un solo segmento y se escriben en el disco como un solo segmento continuo al final del registro. Por lo tanto, un solo segmento puede contener nodos-i, bloques de directorio y bloques de datos, todos mezclados entre sí. Al inicio de cada segmento hay un resumen de segmento, que indica lo que se puede encontrar en el segmento. Si se puede hacer que el segmento promedio tenga un tamaño apro- ximado a 1 MB, entonces se puede utilizar casi todo el ancho de banda del disco.
En este diseño, los nodos-i aún existen y tienen la misma estructura que en UNIX, pero ahora están esparcidos por todo el registro, en vez de estar en una posición fija en el disco. Sin embargo, cuando se localiza un nodo-i, la localización de los bloques se realiza de la manera usual. Desde luego que ahora es mucho más difícil buscar un nodo-i, ya que su dirección simplemente no se pue- de calcular a partir de su número-i, como en UNIX. Para que sea posible encontrar nodos-i, se man- tiene un mapa de nodos-i, indexados por número-i. La entrada i en este mapa apunta al nodo-i i en el disco. El mapa se mantiene en el disco, pero también se coloca en la caché, de manera que las partes más utilizadas estén en memoria la mayor parte del tiempo.
Para resumir lo que hemos dicho hasta ahora, al principio todas las escrituras se colocan en un búfer en memoria y periódicamente todas las escrituras en búfer se escriben en el disco en un solo segmento, al final del registro. Para abrir un archivo, ahora se utiliza el mapa para localizar el no- do-i para ese archivo. Una vez localizado el nodo-i, se pueden encontrar las direcciones de los blo- ques a partir de él. Todos los bloques estarán en segmentos, en alguna parte del registro.
Si los discos fueran infinitamente extensos, la descripción anterior sería todo. Sin embargo, los discos reales son finitos, por lo que en un momento dado el registro ocupará todo el disco y en ese momento no se podrán escribir nuevos segmentos en el registro. Por fortuna muchos segmentos existentes pueden tener bloques que ya no sean necesarios; por ejemplo, si se sobrescribe un archi- vo, su nodo-i apuntará ahora a los nuevos bloques, pero los anteriores seguirán ocupando espacio en los segmentos escritos anteriormente.
Para lidiar con este problema, el LFS tiene un hilo limpiador que pasa su tiempo explorando el registro circularmente para compactarlo. Empieza leyendo el resumen del primer segmento en el registro para ver qué nodos-i y archivos están ahí. Después verifica el mapa de nodos-i actual para ver si los nodos-i están actualizados y si los bloques de archivos están todavía en uso. De no ser así, se descarta esa información. Los nodos-i y los bloques que aún están en uso van a la memoria pa- ra escribirse en el siguiente segmento. El segmento original se marca entonces como libre, de ma- nera que el registro pueda utilizarlo para nuevos datos. De esta manera, el limpiador se desplaza por el registro, removiendo los segmentos antiguos de la parte final y colocando cualquier información viva en la memoria para volver a escribirla en el siguiente segmento. En consecuencia, el disco es un gran búfer circular, donde el hilo escritor agrega nuevos segmentos al frente y el hilo limpiador remueve los segmentos viejos de la parte final.
Llevar la contabilidad aquí no es trivial, ya que cuando un bloque de archivo se escribe de vuel- ta en un nuevo segmento, se debe localizar el nodo-i del archivo (en alguna parte del registro), ac- tualizarlo y colocarlo en memoria para escribirse en el siguiente segmento. El mapa de nodos-i debe entonces actualizarse para apuntar a la nueva copia. Sin embargo, es posible realizar la administra- ción y los resultados de rendimiento muestran que toda esta complejidad vale la pena. Las medicio- nes proporcionadas en los artículos antes citados muestran que LFS supera a UNIX en rendimiento
por una orden de magnitud en las escrituras pequeñas, mientras que tiene un rendimiento tan bue- no o mejor que UNIX para las lecturas o las escrituras extensas.