Al finalizar la clase podremos:
Un programa trabaja con:
nombre de archivo → datos
El sistema de archivos debe resolver:
¿en qué bloques están esos datos?
Un archivo ocupa uno o más bloques.
El tamaño de bloque es una decisión del sistema de archivos.
| 0 | 1 | 2 | 3 |
| 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 |
Bloques ocupados - Bloques libres
Si un archivo ocupa S bytes y cada bloque tiene B bytes:
número de bloques = techo(S / B)
El último bloque puede quedar parcialmente ocupado.
Esto produce fragmentación interna.
# Crear un archivo de 5000 bytes
head -c 5000 /dev/zero > archivo.bin
# Tamaño lógico del archivo
stat -c 'Tamaño del archivo: %s bytes' archivo.bin
ls -l archivo.bin
# Espacio realmente ocupado en el dispositivo
du -B1 archivo.bin
# Tamaño del bloque de asignación
stat -f -c 'Bloque de asignación: %S bytes' archivo.bin
5000 bytes
→ 2 bloques de 4096 bytes
→ 8192 bytes ocupados
Un sistema utiliza bloques de 4096 bytes.
Analizar archivos de:
10 minutos !
El sistema de archivos debe registrar qué bloques pertenecen a cada archivo.
La estrategia elegida afecta:
Los bloques de un archivo ocupan posiciones consecutivas.
Para localizarlo basta conocer:
| 8: dato | 9: dato | 10: dato | 11: dato | 12: da |
Archivo A
Ventajas:
Problemas:
Conviene cuando:
Ejemplos:
Cada bloque contiene un enlace al siguiente bloque del archivo.
Los bloques no necesitan estar juntos.
| datos | siguiente | datos | siguiente | datos | siguiente | datos | |
Ventajas:
Problemas:
Conviene cuando:
Ejemplos:
Una alternativa es guardar los enlaces en una tabla separada.
La tabla puede mantenerse en memoria para acelerar el recorrido.
| Bloque | Siguiente |
|---|---|
| 8 | 12 |
| 12 | 4 |
| 4 | 10 |
| 19 | fin |
Los bloques contienen principalmente datos. La cadena se mantiene en una tabla central.
Conviene cuando:
Ejemplo clásico:
Un bloque índice o un inodo que contiene referencias a los bloques del archivo.
| inodo | |
|---|---|
| ├── | bloque directo |
| ├── | bloque directo |
| ├── | bloque directo |
| └── | bloque directo → referencias adicionales |
El inodoro también puede contener:
Para localizar un bloque, el sistema consulta el índice, sin recorrer necesariamente toda una cadena desde el primer bloque.
Conviene cuando:
Ejemplos:
Los punteros directos permiten localizar bloques pequeños rápidamente.
Los punteros indirectos permiten alcanzar archivos más grandes mediante bloques que contienen nuevas direcciones.
No son otra estrategia independiente. Son una forma de ampliar la asignación indexada.
inode
├── bloque directo → datos
├── bloque directo → datos
└── bloque directo → datosinode
└── bloque indirecto
├── dirección → datos
├── dirección → datos
└── dirección → datosPueden existir:
indirecto simple
indirecto doble
indirecto triple| Contigua | rapidez y simplicidad | localizar archivos consecutivos |
| Enlazada | crecimiento flexible | evitar exigir espacio contiguo |
| Tabla | centralizar enlaces | no guardar punteros dentro de cada bloque |
| Indexada | acceso directo y flexibilidad | localizar bloques mediante un índice |
| Directa/indirecta | distintos tamaños de archivo | atender archivos pequeños y grandes |
| Estrategia | Prioridad principal | Problema que intenta resolver |
|---|
10 minutos !
El nombre permite comenzar la búsqueda.
El inode permite localizar y administrar el archivo.
| nombre ↓ |
| entrada de directorio ↓ |
| inodo / metadatos ↓ |
| bloques de datos |
Un directorio asocia nombres a nodos
El inode contiene información como:
mkdir demo-inode
printf "Sistemas de archivos\n" > demo-inode/informe.txt
ls -li demo-inode
stat demo-inode/informe.txtdirectorio:
nombre → número de inode
inode:
metadatos → bloques de datosPara buscar:
/usr/ana/proyecto/informe.txt
el sistema debe recorrer los componentes de la ruta y localizar cada entrada en el directorio correspondiente.
directorio:
nombre → número de inode
inode:
metadatos → bloques de datosmkdir -p actividad-ruta/proyecto/documentos
printf "Informe de prueba\n" > actividad-ruta/proyecto/documentos/informe.txtls -lai .
ls -lai actividad-ruta
ls -lai actividad-ruta/proyecto
ls -lai actividad-ruta/proyecto/documentosEntrada -> Inodo
stat -c 'Nombre: %n
Inode: %i
Tamaño: %s bytes
Enlaces: %h' actividad-ruta/proyecto/documentos/informe.txtUltima entrada contiene metadatos y localización del archivo
El sistema debe saber qué bloques puede reutilizar.
Dos estrategias habituales son:
Cada posición representa un bloque.
Bloque: 0 1 2 3 4 5 6 7 8 9
Estado: 1 1 0 1 0 0 1 1 0 1
La convención puede ser:
1: ocupado;0: libre.La convención debe estar definida por el sistema.
Un sistema necesita asignar rápidamente varios bloques consecutivos para un archivo grande.
El mapa permite buscar una secuencia como:
0 0 0 0
Es fácil saber si un bloque está libre y encontrar regiones contiguas.
El mapa ocupa espacio proporcional a la cantidad total de bloques, aunque haya pocos bloques libres.
Otra posibilidad es mantener una lista con los bloques disponibles.
3 → 5 → 8 → 14 → 21 → ...
Al asignar un bloque, se elimina de la lista.
Al liberar un bloque, se reincorpora.
Un volumen está casi lleno y sólo quedan unos pocos bloques disponibles:
3 → 5 → 8 → 14
En ese caso, guardar sólo los bloques libres puede ocupar menos espacio que mantener un mapa para todo el dispositivo.
La representación puede ser pequeña cuando hay pocos bloques libres.
Es más difícil encontrar una secuencia de bloques contiguos. Para buscarla, puede ser necesario recorrer la lista completa.
| Muchos bloques y búsqueda de regiones contiguas | Mapa de bits |
| Pocos bloques libres | Lista de bloques libres |
| Necesidad de consultar rápidamente un bloque específico | Mapa de bits |
| Sistema simple que sólo necesita obtener algún bloque libre | Lista |
| Asignar un archivo grande de forma contigua | Mapa de bits |
| Situación | Representación más conveniente |
|---|
El sistema puede conservar bloques usados recientemente en memoria.
Si el bloque vuelve a solicitarse:
El sistema carga bloques que probablemente se utilizarán pronto.
El sistema acumula cambios y los escribe posteriormente.
Estas técnicas mejoran el rendimiento, pero complican la recuperación ante fallas.
Supongamos que una operación modifica:
¿Qué ocurre si la computadora se apaga entre dos de esas escrituras?
El journaling registra operaciones o cambios antes de aplicarlos completamente.
Después de una falla, el sistema puede revisar ese registro para:
Cada nivel resuelve una parte diferente del problema.
| nombre ↓ |
| entrada de directorio ↓ |
| inodo / metadatos ↓ |
| bloques de datos ↓ |
| espacio libre y cache |
Protección, compartición y recuperación de archivos