Algoritmos y Estructuras de Datos Compiladores e Intérpretes Herramientas Lenguaje de programación
!Prog C/C++
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Redes y Computación Distribuida Sistemas Operativos

Sistema de Archivos

[date: 06-01-2024] [last modification: 10-01-2025]
[words: 5603] [reading time: 27min] [size: 66266 bytes]

Cuando el proceso termina, se pierde todo lo que se había almacenado en memoria. Además, los discos solo permiten dos operaciones: lectura y escritura, lo que presenta muchos problemas. Para solucionarlo, el Sistema Operativo crea la abstracción del Sistema de Archivos.

Necesidad de un sistema de archivos

Nótese que, una vez que un proceso termina, toda la memoria relacionada con él (su espacio de direcciones o segmentos) se borran, lo que es inaceptable para algunas aplicaciones (p.e.: Bases de Datos).

En general, tenemos 3 requisitos esenciales para el almacenamiento de información a largo plazo:

Los discos son los dispositivos que se utilizan para este almacenamiento a largo plazo, lo que permiten (entre otras) dos operaciones básicas:

Lo que no es muy satisfactorio:

Además, ya se ha visto en la introducción que los dispositivos de E/S, en especial los discos, son bastante complejos de gestionar.

Abstracción del sistema de archivos

Archivo

Al igual que con los procesos y el espacio de direcciones virtuales, el Sistema Operativo soluciona todos estos problemas creando una nueva abstracción: el archivo.

Archivo

Los archivos son unidades lógicas de información creados por los procesos. Estos pueden leer archivos existentes y crear otros.

La información almacenada en cada uno es persistente: no se ve afectado por la creación o terminación de procesos, solo desaparece cuando su propietario lo elimina.

Cuando un proceso crea un archivo, le da un nombre. La nomenclatura depende un poco de cada sistema:

Muchos sistemas aceptan nombres de archivos en dos partes, separadas por un punto. La parte que va después del punto se llama la extensión del archivo y normalmente indica el tipo de archivo: .c indica un archivo de código fuente C, .zip un archivo comprimido o .pdf un archivo en Formato de Documento Portable.

Estas extensiones son solo convenciones, el Sistema Operativo no las impone. Son más bien un recordatorio para el usuario o impuestas por algún programa en concreto. Aun así, Windows es consciente de las extensiones: los usuarios o procesos pueden registrar extensiones y especificar a qué programa corresponden.

Llamadas al sistema para el manejo de archivos
createCreación de un archivo vacío dados algunos atributos.
deleteBorra el archivo dado.
openAntes de usar un archivo se debe abrir, para que el SO haga las preparaciones necesarias; como llevar los atributos a memoria para su rápido acceso y actualizar la tabla de procesos.
closeUna vez terminado el trabajo con el archivo, se debe cerrar para que el SO libere recursos.
readLeer un determinado número de bytes del archivo desde la posición actual en el archivo y la dirección de memoria de dónde colocarlos.
write

Escribir datos en la posición actual del archivo.

  • Si a continuación hay datos, se sobreescriben con los nuevos
  • Si la posición es el final, se aumenta el tamaño del archivo.
appendAgrega datos al final del archivo. Es un tipo de write.
seekReposiciona el apuntador dentro del archivo, para hacer lecturas o escrituras en otro lugar.
get attributes y set attributesProporciona un forma a los procesos para obtener y modificar los metadatos de un archivo. Un ejemplo, es el programa make, que comprueba los tiempos de modificación; o el programa chmod, que modifica los permisos de un archivo.
renamePermite dar un nuevo nombre. No es completamente necesaria: se puede copiar el archivo, darle el nombre nuevo y borrar el anterior.

Ejemplo de uso de estas llamadas:

// Programa Linux para copiar archivos: copyfile input output
// NOTA: la verificación y reporte de errores es mínimo

#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

#define TAM_BUF     4096
#define MODO_SALIDA 0700 // rwx --- ---

int main(int argc, char** argv) {
    if (argc != 3) exit(1); // Error de sintaxis

    char buffer[TAM_BUFF];

    // Abrir los archivos
    int fd_input = open(arg[1], O_RDONLY); // Abrir input solo lectura
    if (fd_input < 0) exit(2);             // Error al abrir input

    int fd_output = creat(arg[1], MODO_SALIDA); // Crear output
    if (fd_output < 0) exit(3);                 // Error al abrir output

    // Bucle de copia
    while (1) {
        // Lee un bloque de datos al buffer
        int bytes_leidos = read(fd_input, buffer, TAM_BUF);

        if (bytes_leidos == 0) break;   // Fin de archivo
        if (bytes_leidos < 0)  exit(4); // Error

        // Escribe en el archivo de salida
        int bytes_escritos = write(fd_output, buffer, bytes_leidos);
        if (bytes_escritos <= 0) exit(5);
    }

    // Cierra los archivos
    close(fd_input);
    close(fd_output);
    exit(0);
}

Los enteros fd_input y fd_output son dos descriptores de archivos (File Descriptors) que se usan para hacer referencia a cada archivo.

Tipos de archivos

Permisos

Modos de un archivo

Modos de un archivo

Cada archivo tiene asociada una máscara de 16 bits, llamada la máscara de modo. La llamada al sistema chmod permite cambiarla.

Los tres octales (otros, grupo y propietario) aplican todo tipo de archivos, pero tener un efecto diferente dependiendo si es un archivo normal o un directorio. Puede consultar la tabla completa en la ArchWiki.

Los permisos especiales solo son aplicables a determinados tipos de archivos:

Si al usar ls aparece una S mayúscula, quiere decir que hay un error: probablemente el archivo no es ejecutable. No tiene sentido activar el bit SUID en un archivo no ejecutable. Lo mismo sucede con el sticky bit, T cuando el directorio no es ejecutable.

El funcionamiento del usuario real y efectivo se explica en más detalle en el siguiente apartado.

En resumen:

PermisoOctalArchivoDirectorio
Ejecución (x)1EjecutarEntrar
Escritura (r)2ModificarCrear/Borrar archivos
Lectura (r)4ModificarCrear/Borrar archivos
Sticky bit (T, x+T=t)1-Solo los dueños pueden borrar sus archivos
setuid (S, x+S=s)2Establece el EUID al del dueñoEstablece el EUID al del dueño
setgid (S, x+S=s)4Establece el EGID al del dueñoEstablece el EGID al del dueño

Identificadores de Usuario y Grupo

Ya sabemos que un fichero ejecutable contiene todas las instrucciones y datos necesarios para el programa. Este tiene también una máscara de modo. Cuando se ejecuta, aparte del PID, tiene asociados dos identificadores de usuario y dos de grupo. Son dos enteros positivos.

Vamos a centrarnos en el identificador de usuario, ya que para el identificador de grupo es análogo.

Es decir: el usuario real es quien ejecuta el programa y un proceso solo puede trabajar con los archivos que pueda acceder el usuario efectivo.

Vale, pero… ¿quién es el usuario efectivo? Esto lo determina por el bit SUID. Si un ejecutable tiene el bit SUID=1, el EUID pasa a ser el propietario del programa.

Además, mediante las llamadas al sistema setuid y setgid se puede cambiar el EUID, pero su funcionamiento es algo particular. Para consultar los valores se usan getuid, geteuid, getgid, getegid.

Tenga en cuenta que en la mayoría de los casos, UID = EUID.

Funcionamiento de setuid
#include <fcntl.h>
salida = setuid(par);
  1. El EUID del proceso que efectúa la llamada es el superusuario. Entonces, UID = par y EUID = par. El superusuario tiene permisos para acceder a cualquier cosa, incluso sin SUID. Nótese que también se cambia el usuario real.

  2. Si EUID no es el superusuario. Se establece EUID = par si:

    • par es el UID del proceso (yo, getuid) ==> Yo voy acceder a mis archivos
    • SUID = 1 y par es el UID del propietario del archivo ==> Me hago pasar por el propietario del programa (EUID por defecto cuando SUID=1).

Se devuelve 0 si se ha cambiado el EUID de forma exitosa o -1 si ha ocurrido algún error. Puede consultarlo con perror.

Directorios

Para llevar registro de los archivos, por lo general se permiten crear directorios o carpetas, que en muchos sistemas también son archivos.

Gracias a la creación de directorios dentro de otros directorios, se crean las jerarquías o árboles de directorios. Estas permiten al usuario organizar sus archivos de una forma bastante natural, mediante agrupaciones. Además, se pueden asignar determinados directorios a cada usuario para establecer permisos y seguridad de los archivos.

Llamadas al sistema para el manejo de directorios
createCrea un directorio vacío (mkdir)
deleteBorra un directorio vacío (rmdir)
opendirLos directorios se pueden leer, para listar los archivos que contiene. El proceso de abrir un directorio es análogo a abrir un archivo.
closedirAnálogo a cerrar un archivo.
readdirDevuelve la siguiente entrada en un directorio abierto.
renameCambia el nombre al directorio. Análoga a renombrar un archivo.
linkEn algunos sistemas, se permiten crear referencias simbólicas para que un mismo archivo (o directorio) de pueda aparecer en varios directorios a la vez.
unlinkElimina una entrada del directorio. Si el archivo solo se encuentra en el directorio actual, se elimina del sistema de archivos.

Rutas

Cuando los archivos se organizan en una estructura arbórea, ya no se pueden identificar únicamente por su nombre, sino que se utilizan nombres de rutas.

Directorio de trabajo

Cada proceso tiene un directorio de trabajo sobre el que opera y que se usa para las rutas relativas.

Por defecto, se usa el directorio heredado del proceso padre, pero existen llamadas al sistema para cambiar este directorio.

En las rutas relativas, habitualmente se puede hacer referencia al directorio de trabajo actual con . y directorios superiores con ... Por ejemplo, la ruta Unix ../../layouts/404.html retrocede dos directorios y obtiene al archivo HTML dentro del subdirectorio layouts.

La nomenclatura de las rutas también varía de un sistema a otro:

Implementación

Hasta ahora, se ha visto el funcionamiento de la abstracción creada por el Sistema Operativo. Véase ahora cómo se lleva a cabo.

Disco duro

Ya hemos visto en las nociones de hardware de la introducción las diferentes partes de los discos. Vamos a profundizar un poco en su funcionamiento.

Bloque de disco

El bloque de disco, también llamado cluster, es un grupo de sectores.

Para reducir la sobrecarga de las estructuras de datos en el disco, el sistema de archivos no se asigna sobre los sectores directamente, sino sobre un conjunto de ellos que se considere eficiente. No tienen porqué estar todos seguidos, sino que pueden abarcar más de una pista.

Tamaño del bloque

Debe ser una potencia entera de 2, múltiplo del tamaño del sector. Existen casos donde el bloque el del tamaño del sector. También se debería considerar el tamaño de la página en sistemas paginados.

  • Grande: fragmentación interna ==> Se desperdicia espacio (espacio de holgura, slack space). Los archivos usan bloques completos.
  • Pequeño: un archivo puede tomar muchos bloques ==> Acceso más lento debido a la búsqueda del sector y las rotaciones mecánicas necesarias.

Benchmarks

Según simulaciones de Tanenbaum, el tamaño promedio de los archivos es 2745 bytes.

  • Bloques de 1 KiB: el 30% - 50% de los archivos caben en un bloque.
  • Bloques de 4 KiB: el 60% - 70% de los archivos caben en un bloque. El 10% de los archivos más grandes son el 93% los bloques ocupados.

Este último es el recomendado a partir del 2007 por la IDEMA (Asociación Internacional de Unidades, Equipo y Materiales de Disco).

Tiempo de lectura de un bloque
  1. Latencia $L$: tiempo de colocar el peine electromagnético en la pista adecuada. No es un tiempo constante, depende de la posición actual del peine.
  2. Retraso de rotación: tiempo que hay que esperar mientras el disco rota para colocar el peine sobre el sector adecuado. Depende de la velocidad de rotación del disco (rpm).
  3. Tiempo de transferencia de datos $T$.

Por tanto:

$$ L + \frac{t_{\text{rotación}}}{\text{ancho de banda}} + T $$

Se intentan meter todos los archivos en la misma pista para reducir la latencia.

Desajuste de cilindros

Al cambiar de pista, el disco sigue girando. Se tiene en cuenta el tiempo para mover el peine de una pista a otra: donde caiga tras ese tiempo. De esta forma, se pueden seleccionar sectores de forma más eficiente. Esto se llama el desajuste de cilindros.

Por tanto, el sector 0 de cada pista está desfasado de la pista anterior.

Ejemplo de cálculo

Disco de $f = 10\,000$ rpm (frecuencia), $300$ sectores/pista, tiempo de cambio de pista $800 \; \mu s$.

Tiempo de una vuelta (periodo):

$$ \frac{1}{f} = \frac{1}{10\\,000 \text{ rpm}} = \frac{1}{10\\,000 \times \frac{1 \text{ rpm}}{60 \text{ vuelta/segundo}}} = \frac{60}{10\\,000} \text{ segundo/vuelta} = 6 \text{ms/vuelta} $$

Tiempo que se tarda en recorrer un sector:

$$ 6 \text{ ms/vuelta} \times \frac{1 \text{ vuelta}}{300 \text{ sectores}} = 20 \\; \mu s \text{/sector} $$

Número de sectores que pasan durante el cambio de pista:

$$ 800 \mu s \times \frac{1 \text{ sector}}{20 \mu s} = 40 \text{ sectores} $$

Disco físico y lógico

Disco físico
Un disco físico es un dispositivo de almacenamiento permanente. Este opera en modo bloque: contiene un array de bloques de tamaño fijo, y cada uno de ellos posee un número de bloque físico.

Se diferencian de otros dispositivos como ratones y teclados que transmiten información de carácter a carácter.

Se distinguen varios tipos:

Disco lógico

Un disco lógico es abstracción que el SO ve como una secuencia lineal de bloques accesibles aleatoriamente, cada uno identificado por un número de bloque lógico. El driver traduce los números de bloque lógico a números de bloque físico.

  • Un sistema de archivos está contenido por completo en un disco lógico y un disco lógico solo puede contener un solo sistema de archivos.
  • En sistemas Unix modernos, un disco lógico puede estar formado por varios discos físicos, lo que da soporte a sistemas de archivos grandes.
  • En lugar de contener sistemas de archivos, un disco lógico puede contener un área de intercambio para el almacenamiento temporal de páginas de procesos.

Ejemplos de discos lógicos:

Disco físicoDisco lógico
Corresponde al hardware real (HDD, SSD).Es una representación abstracta del almacenamiento.
Está limitado por el número de discos instalados.Puede crearse mediante particiones, LVM, RAID o virtualización.
Identificado como /dev/sda, /dev/sdb en Linux.Identificado como /dev/sda1, /dev/mapper/volumen, o letras de unidad (C:).
Gestionado por el firmware y el sistema operativo.Gestionado por software de partición, RAID o LVM.

Partición

Particionado

El proceso de particionado consiste en la creación de regiones dentro de un disco. Estas son divisiones independientes del disco, que permite poder manejar las particiones por separado. Es responsabilidad del administrador del sistema decidir qué contiene cada una.

La información sobre las particiones se almacena en la tabla de particiones, que el Sistema Operativo lee antes que cualquier otra parte del disco. Existen varias implementaciones dependiendo del sistema:

  • Master Boot Record (MRB). Utilizados por sistemas BIOS.
  • GUID Partition Table (GPT). Parte del estándar de UEFI.
  • Apple Partition Map (APM)

Normalmente las particiones se identifican con el pseudo-archivo de su disco y se le añade un número de partición: /dev/sda4.

Algunos tipos de particiones pueden ser:

Como cada partición se comporta como un disco lógico, esto permite la coexistencia varios SO en el mismo ordenador: una partición para cada uno (dual boot).

Tabla de particiones
La tabla de particiones es una estructura de datos proporciona las direcciones de inicio y fin de cada partición.

La herramienta fdisk (entre muchas otras herramientas) permite manipular la tabla de particiones para crear, extender y eliminar particiones.

Más información en la archwiki.

Master Boot Record

En los sistemas BIOS, el primer bloque del disco (512 bytes) se conoce como el Master Boot Record (MBR), fuera de cualquier tipo de partición.

Contiene el código del bootloader del sistema operativo (440 bytes) y la tabla de particiones (al final del bloque). Una de ellas está marcada como activa para arrancar desde ahí.

Debido a esta organización, el MBR limita el tamaño máximo del disco particionado a 2 TiB ($2^{32} \times 512$).

Con el fin de superar esta limitación, se realizó una transición a GUID Partitions Table (GPT).

Tipos de particiones
Partición primariaContiene un sistema de archivos, que se puede identificar por su ID en la tabla de particiones. Solo se pueden tener hasta 4 de estas particiones, que en Linux se nombran como /dev/sda1, /dev/sda2, /dev/sda3 y /dev/sda4.
Partición extendida
Partición secundaria
Se trata de un contenedor de particiones secundarias. Un disco duro solo contener una única partición extendida, en cuyo caso solo puede haber
Partición lógicaSolo se pueden situar dentro de una partición extendida, pero puede tener un número ilimitado de ellas. En Linux se nombran de /dev/sda5 para adelante.

Puede consultar todos los IDs de las particiones.

Para llevar la cuenta de las particiones lógicas, dado que no están la tabla, cada una lógica tiene un EBR o EPBR (Extended Partition Boot Record) que ocupa su primer sector. Esta describe dos elementos:

Este mecanismo tiene las siguientes limitaciones:

Windows requiere estar instalado en una partición primaria (no lógica) si intentas hacer dual boot.

GUID Partition Table

El GPT (GUI Partition Table) es el nuevo estándar que sustituye a MBR. Es más fiable y está asociado a sistemas UEFI.

Se almacena en una partición con un tamaño de unos 256-512 MB, pero también crea múltiples copias redundantes a través de todo el disco. También tiene al inicio un Protective Master Boot Record (PMBR) con el propósito de proteger el disco contra sistemas que no soporten GPT y ser retrocompatible.

Es posible utilizarlo en discos mayores de 2 TiB.

Con UEFI se pueden crear hasta 128 particiones primarias (límite impuesto por los sistemas Windows). A cada una de ellas se le asocia un identificador global único (GUID o UUID).

Nótese que las particiones extendidas pueden existir en GTP, pero no se usan porque no tienen mucho sentido.

CaracterísticaGPT (UEFI)LVM
PropósitoEstructura de particiones físicasGestión avanzada de almacenamiento lógico
FlexibilidadEstática: no se puede redimensionar sin herramientas adicionalesDinámica: volúmenes redimensionables fácilmente
CompatibilidadDirectamente compatible con el sistema operativoNecesita soporte en el sistema operativo y configuración manual
Redundancia/IntegridadGPT incluye redundancia y CRC para la tabla de particionesDepende del sistema RAID o la configuración subyacente
Número de discosDiseñado para un solo disco físicoDiseñado para múltiples discos físicos o particiones
EscalabilidadLimitada al número de particiones definidasMuy escalable; soporta agrupación y redimensionamiento en tiempo real

Implementación de archivos

Es necesario mantener un registro de la correspondencia de un archivo y de los bloques de disco que contienen su información.

Lista enlazada de bloques

Se mantiene una lista enlazada de bloques de disco, la primera palabra de cada bloque se utiliza como apuntador al siguiente, el último bloque tiene un 0. El resto del bloque es para los datos.

Problemas:

  • La lectura secuencial no tiene problemas, pero el acceso aleatorio puede ser muy lento. Para leer el bloque $n$, necesariamente hay que acceder a los $n-1$ bloques anteriores.
  • La cantidad de datos almacenados en el bloque ya no es potencia entera de dos. Puede ser problemático, dado que los programas leen/escriben de bloque en bloque.
Tabla de asignación

Se solucionan los problemas de la lista enlazada tomando todos los apuntadores y colocándolos en una tabla, llamada File Allocation Table (FAT).

En la entrada correspondiente al bloque inicial del archivo se almacena la dirección del siguiente bloque. En dicha entrada, se almacena la dirección del bloque siguiente, y así sucesivamente. La cadena termina con un marcador especial, como por ejemplo -1.

  • El bloque completo está disponible para los datos.
  • La tabla FAT debe estar en memoria principal siempre.
  • El acceso aleatorio es más sencillo dado que la tabla está en RAM, aunque aún se tiene que seguir la cadena.
  • No escala bien para discos grandes: tablas muy grandes.
Inodos

Se lleva un registro de qué bloques pertenecen a cuál archivo es asociar cada archivo a una estructura de datos conocida como nodos-índice (inodes).

Esta contiene los atributos del archivo y un array de las direcciones de los bloques. Si hay más bloques de los que se pueden listar en el inodo, hay un puntero a un bloque de apuntadores con el resto de direcciones.

  • El inodo de un archivo solo se lleva a memoria cuando se abre.
  • El inodo es más pequeño que una tabla FAT: esta se refiere a todos los archivos, mientras que el inodo describe uno.

Esta es la opción utilizada en Unix.

Implementación de directorios

La función principal del sistema de directorios es asociar cada nombre de archivo a la información necesaria para localizar los datos. Muchos sistemas también almacenan en la entrada de directorio de un archivo sus atributos.

Montaje de sistemas de archivos

En Windows, a cada disco lógico se le llama unidad y cada uno puede contener un sistema de archivos con su propia jerarquía. Se identifican por una letra mayúscula, donde normalmente C se refiere a donde está Windows instalado.

En Unix es posible tener varios subárboles independientes, cada uno con un sistema de archivos completo. Sin embargo, uno de ellos se configura para ser el sistema de archivos raíz y para que su directorio raíz sea el directorio raíz del sistema. Otros sistemas de ficheros se adjuntan a la estructura montándolos sobre un directorio ya existente, llamado directorio de montaje o punto de montaje, gracias a la llamada del sistema mount.

Una vez montado, el directorio raíz de la nueva estructura pasa a ser el directorio de montaje, y cualquier acceso se traduce al sistema de archivos montado. Esto permanecerá visible hasta que se desmonte con umount.

// Ver man mount(2)
#include <sys/mount.h>

// Sintaxis en Linux
int mount(const char* device, const char* mountdir,
          const char* filesystem_type,   // ext4, vfat, proc, tmpfs, ...
          unsigned long flags,
          const void *_Nullable data);
int umount(const char* device);

// Sintaxis en Unix clásico
mount("/dev/hda2", "/usr", 0);
umount("/dev/hda2");

Alternativamente, desde Bash, se usan los comandos siguientes:

mount /dev/... ruta         # Monta la partición en directorio
mount --mkdir /dev/... ruta # Para crear directorio si no existe
mount -a                    # Monta los fs especificados en /etc/fstab
mount -o ruta opciones      # Permite remontar con otras opciones
umount ruta                 # Desmonta el fs del directorio

Esta noción de montaje, permite ocultar al usuario los detalles de la organización del almacenamiento: las rutas siguen siendo homogéneas y no es necesario especificar ninguna unidad.

Tabla de Montaje

El kernel utiliza una tabla de montaje para llevar registro de los sistemas de archivos montados. Se suele ubicar en /etc/mtab en Linux, mientras que el archivo /etc/fstab definen las monturas a utilizar en el arranque.

Un ejemplo del /etc/mtab este último es el siguiente (/etc/fstab usa la misma sintaxis):

# device    directory   type    options   dump pass
/dev/hda1   /           ext2    defaults  0    0
/dev/hda2   /usr        ext2    defaults  0    0
/dev/hda3   none        swap    sw        0    0 # Zona de swapping
/dev/sda1   /dosc       msdos   defaults  0    0
/proc       /proc       proc    none      0    0

La primera línea es un comentario:

  • La primera columna indica el dispositivo que se monta
  • La segunda columna es el directorio de montaje
  • La tercera columna es el tipo de sistema de archivos
  • Y la última columna contiene diferentes opciones de montaje

Algunas opciones de montaje por defecto son:

  • rw/ro: se monta con permisos de lectura/escritura (rw)
  • Se permite la ejecución de archivos ejecutables
  • Se interpretan los bits S_ISUID y S_ISGID
  • El sistema de archivos se considera como un dispositivo de bloque
  • Todas las operaciones E/S se hacen de forma asíncrona
  • user/nouser: los usuarios normales no pueden montar el sistema de archivos
  • auto/noauto: se monta automáticamente en el arranque

Nótese que /proc es un sistema de archivos especial. Más información en la especificación de directorios de linux.

Administración y optimización de Sistemas de Archivos

Hacer que el sistema de archivos es una cosa, que sea eficiente es otra. Véanse ahora algunas ideas para mejorar el rendimiento.

Un parámetro fundamental para ello es el tamaño del bloque, que ya se ha comentado previamente.

Registro de bloques libres

Problema muy similar a la administración de memoria libre, por lo que se utiliza el mismo tipo de estrategias: listas enlazadas y mapas de bits.

Lista enlazada

Se utiliza una lista enlazada de bloques, donde cada bloque almacena tantos números de bloque libres como pueda. Se mantiene uno de estos bloques en memoria para cuando se necesite escribir algo, y cuando se terminen los bloques libres, se lee el siguiente. Lo mismo cuando se borran archivos: se añaden, y en el momento que se llene, se toma un bloque adicional y el anterior se escribe en el disco.

Si un bloque es de 1 KiB, con 32 bits para poder representar su número; en un bloque pueden caber $2^{10} / 4 - 1 = 2^8 - 1 = 255$ entradas, dado que el último es un puntero al siguiente bloque de la lista.

Generalmente se usan los bloques libres para almacenar esta lista, por lo que el almacenamiento sale gratuito.

Si hay muchos bloques libres contiguos, se puede almacenar la dirección del bloque inicial y cuántos bloques libres hay a continuación, ahorrando aún más en espacio.

Mapa de bits

Un disco con $n$ bloques requiere un mapa de $n$ bits, donde 1 indica que el bloque está libre y 0 si está ocupado (o viceversa, depende del sistema).

Lógicamente, ocupa mucho menos espacio que la lista enlazada de bloques (si el disco está vacío).

Disco de 500 GB, bloques de 1 KiB $\implies n_b = 500 \times 10^{9} / 2^{10} = 488,281\,250$ bloques.

[Logical Volume Management]: {{/*< ref “linux/instalacion/#logical-volume-management” */>}}

Anterior: Memoria Volver a Sistemas Operativos Siguiente: Entrada/Salida