File System Flashcards
File
Denominazione dei File
I file system nei vari sistemi operativi supportano la denominazione dei file con stringhe di caratteri, solitamente includendo lettere, numeri e caratteri speciali. Alcune regole comuni per la denominazione includono:
- Case Sensitivity: Alcuni sistemi operativi distinguono tra lettere maiuscole e minuscole (es. UNIX), mentre altri no (es. MS-DOS).
-
Estensioni dei File: Molti sistemi operativi utilizzano estensioni dei file per indicare il tipo di contenuto. Ad esempio,
.txt
per file di testo,.exe
per eseguibili,.docx
per documenti di Microsoft Word.
Struttura dei File
I file possono essere strutturati in diversi modi, tre dei quali sono:
- Sequenza di Byte: I file sono visti come una sequenza non strutturata di byte, offrendo la massima flessibilità. Questo è il modello utilizzato da UNIX e Windows.
- Sequenza di Record: I file sono composti da una sequenza di record di lunghezza fissa, ciascuno con una struttura interna specifica.
- Albero di Record: I file sono organizzati in un albero di record, ognuno con un campo chiave per ricerche rapide. Questo modello è tipico dei sistemi di database su mainframe.
Tipi di File
I sistemi operativi supportano vari tipi di file:
- File Normali: Contengono dati dell’utente, sia in formato ASCII che binario.
- Directory: File di sistema che mantengono la struttura del file system.
- File Speciali a Caratteri: Utilizzati per modellare dispositivi di I/O seriale come terminali e stampanti.
- File Speciali a Blocchi: Utilizzati per modellare i dischi.
Attributi dei File
Oltre ai dati, i file hanno attributi (o metadati), che includono informazioni come:
- Protezione: Chi può accedere al file.
- Flag: Bit che abilitano proprietà specifiche come file nascosti o temporanei.
- Dimensione: La dimensione attuale del file.
- Temporali: Momento di creazione, ultima modifica, ultimo accesso.
Operazioni sui File
I sistemi operativi forniscono diverse chiamate di sistema per gestire i file:
- create: Crea un file senza dati, impostando solo i suoi attributi.
- delete: Elimina un file liberando lo spazio su disco.
- open: Apre un file per permettere l’accesso rapido ai suoi attributi e indirizzi sul disco.
- close: Chiude un file liberando lo spazio delle tabelle interne.
- read: Legge i dati dal file.
- write: Scrive dati nel file.
- append: Aggiunge dati alla fine del file.
- seek: Riposiziona il puntatore del file per accesso casuale.
- get attributes: Legge gli attributi del file.
- set attributes: Modifica gli attributi del file.
- rename: Rinomina un file.
Esempi di File Binari
1. Eseguibili UNIX: Contengono un’intestazione con informazioni sul formato del file, seguita da testo, dati, bit di rilocazione e tabella dei simboli.
2. Archivi UNIX: Raccolte di moduli di libreria compilati, ciascuno con un’intestazione che indica nome, data di creazione, proprietario, codice di protezione e dimensione.
Implementazione dei File System
I file system non si limitano solo a gestire i file e le directory, ma devono anche implementare e gestire diversi aspetti tecnici, come:
- Allocazione dello Spazio: Determinare dove e come i file sono memorizzati sul disco.
- Protezione: Gestire i permessi di accesso ai file.
- Gestione della Memoria Libera: Tenere traccia dei blocchi di memoria disponibili.
Conclusione
I file system sono una componente fondamentale dei sistemi operativi, gestendo la memorizzazione a lungo termine dei dati e garantendo accesso sicuro e efficiente ai file. Comprendere i concetti di denominazione, struttura, tipi, attributi e operazioni sui file è essenziale per lavorare efficacemente con i sistemi operativi.
File System
Il file system è la parte del sistema operativo che gestisce i file. Esso si occupa di diversi aspetti, tra cui:
- Interfaccia Utente: Come i file e le directory appaiono all’utente e quali operazioni possono essere eseguite su di essi.
- Implementazione: La struttura interna del file system, compreso il modo in cui i file sono memorizzati e recuperati dal disco.
- Gestione del File System: Tecniche utilizzate per gestire lo spazio su disco, come bitmap e liste concatenate, e per tenere traccia dei file e delle directory.
Funzionalità di Base del File System
Creazione e Eliminazione di File
I processi possono creare nuovi file e eliminarli quando non sono più necessari. Questo permette di gestire dinamicamente lo spazio di archiviazione in base alle esigenze delle applicazioni.
Lettura e Scrittura di File
Le operazioni di lettura e scrittura sono le più comuni. La lettura permette di recuperare le informazioni memorizzate in un file, mentre la scrittura consente di salvare nuove informazioni o aggiornare quelle esistenti.
Protezione e Condivisione
Il file system deve garantire che i file siano accessibili solo agli utenti autorizzati. Inoltre, deve supportare la condivisione dei file tra processi diversi, permettendo un accesso simultaneo senza compromettere l’integrità dei dati.
Conclusione
I file system sono una componente fondamentale dei sistemi operativi, permettendo la memorizzazione a lungo termine e la gestione delle informazioni in modo efficiente e sicuro. Comprendere i file system e il modo in cui gestiscono i file è essenziale per chiunque voglia diventare esperto di sistemi operativi. Nei prossimi capitoli, verranno esaminati in dettaglio i diversi aspetti dell’implementazione e della gestione dei file system, oltre a presentare esempi di file system reali utilizzati nei moderni sistemi operativi.
Directory
Organizzazione delle Directory
Le directory, o cartelle, sono file speciali utilizzati dai file system per organizzare e gestire i file. Esistono vari modelli di organizzazione delle directory:
- Directory Singola: Un singolo livello di directory contenente tutti i file. Questo sistema è semplice ma inefficace per un gran numero di file, rendendo difficile l’organizzazione e il recupero delle informazioni. Questo modello è mostrato nella Figura 4.7.
- Directory Gerarchica: Una struttura ad albero che permette di creare directory e sottodirectory (subdirectory). Questo metodo consente una migliore organizzazione dei file e la possibilità di raggrupparli in modo logico. Ogni utente può avere una directory principale privata per la propria gerarchia. La Figura 4.8 illustra questo modello.
Nomi di Percorso
Per accedere ai file in una struttura gerarchica, sono utilizzati nomi di percorso, che possono essere:
-
Percorso Assoluto: Parte dalla directory principale (root) e include l’intero percorso fino al file. Ad esempio,
/usr/ast/mailbox
in UNIX. -
Percorso Relativo: Parte dalla directory di lavoro corrente e non include il percorso completo. Ad esempio,
mailbox
se la directory corrente è/usr/ast
.
Directory di Lavoro e Puntatori Speciali
Ogni processo ha una directory di lavoro corrente, che può essere cambiata con chiamate di sistema. Esistono due voci speciali in ogni directory:
- ”.” (punto): Rappresenta la directory corrente.
-
”..” (puntopunto): Rappresenta la directory genitore, a eccezione della directory radice, dove
..
fa riferimento a se stessa.
Chiamate di Sistema per le Directory
Alcune delle chiamate di sistema più comuni per gestire le directory includono:
- create: Crea una nuova directory vuota.
- delete: Elimina una directory, che deve essere vuota.
- opendir: Apre una directory per leggere i nomi dei file che contiene.
- closedir: Chiude una directory aperta.
- readdir: Restituisce la voce successiva in una directory aperta.
- rename: Rinomina una directory.
- link: Crea un hard link, un collegamento che permette a un file di apparire in più di una directory.
- unlink: Rimuove una voce di directory. Se un file è presente in più directory, solo il nome di percorso specificato viene rimosso.
Link Simbolici e Hard Link
- Hard Link: Un collegamento fisico che punta direttamente alla stessa struttura dati interna di un file, incrementando il contatore dell’i-node.
- Link Simbolico (Alias): Un collegamento che punta a un piccolo file contenente il percorso di un altro file. I link simbolici possono attraversare i confini dei dischi e collegare file su computer remoti, ma possono essere meno efficienti degli hard link.
Esempi di Comandi UNIX
-
cp ../lib/dictionary .: Copia il file
dictionary
dalla directory../lib
alla directory corrente. -
cp /usr/lib/dictionary .: Copia il file
dictionary
dalla directory/usr/lib
alla directory corrente. -
cp ../lib/dictionary /usr/hjb: Copia il file
dictionary
dalla directory../lib
alla directory/usr/hjb
. -
cp /usr/lib/dictionary /usr/hjb: Copia il file
dictionary
dalla directory/usr/lib
alla directory/usr/hjb
.
Conclusione
Le directory sono fondamentali per organizzare e gestire i file in un file system. I sistemi operativi moderni utilizzano strutture di directory gerarchiche per consentire agli utenti di organizzare i loro file in modo logico ed efficiente. Le chiamate di sistema per la gestione delle directory forniscono una serie di strumenti per creare, eliminare, rinominare e accedere alle directory, oltre a permettere collegamenti tra file attraverso hard link e link simbolici.
Coerenza del file system
La perdita di un file system può avere conseguenze disastrose, spesso più gravi della perdita fisica del computer stesso. Anche se un computer può essere sostituito rapidamente, la perdita di dati critici come documenti, basi di dati e altre informazioni può essere irreparabile. Ecco perché è essenziale avere strategie di backup efficaci.
Il backup dei file system è necessario principalmente per due motivi:
- Ripristino dopo un disastro: eventi catastrofici come incendi, allagamenti, crash del disco possono causare la perdita totale dei dati.
- Ripristino dopo errori dell’utente: gli utenti possono eliminare accidentalmente file importanti che necessitano di essere recuperati.
Esistono diverse strategie di backup, tra cui:
- Backup completo: copia di tutti i file e directory specificati. Viene effettuato periodicamente, ad esempio una volta alla settimana.
- Backup incrementale: copia solo dei file modificati dall’ultimo backup (completo o incrementale). Questo riduce il tempo e lo spazio necessario per il backup.
- Backup fisico: copia sequenziale di tutti i blocchi del disco, indipendentemente dal loro utilizzo. Questo metodo è rapido ma inefficiente, poiché include anche blocchi inutilizzati e non consente il ripristino di singoli file.
- Backup logico: copia delle directory e dei file specificati, includendo solo quelli modificati dall’ultimo backup. Questo metodo è più flessibile e permette il ripristino di singoli file o directory.
L’algoritmo di backup logico, comunemente usato in sistemi UNIX, segue questi passaggi:
- Scansione iniziale: si parte dalla directory radice, contrassegnando i file e le directory modificati. Anche le directory non modificate ma necessarie per accedere ai file modificati vengono contrassegnate.
- Eliminazione delle directory non necessarie: vengono deselezionate le directory che non contengono file o directory modificati.
- Backup delle directory: tutte le directory contrassegnate vengono copiate sul supporto di backup, incluse le informazioni sugli attributi.
- Backup dei file: vengono copiati tutti i file contrassegnati, inclusi i loro attributi.
Il ripristino dei dati avviene in ordine inverso:
- Creazione del file system: si crea un file system vuoto sul disco.
- Ripristino del backup completo: si ripristina il backup completo più recente.
- Ripristino dei backup incrementali: si ripristinano i backup incrementali in ordine cronologico.
Alcune delle questioni tecniche relative al backup includono:
- Ricostruzione della lista dei blocchi liberi: la lista dei blocchi liberi deve essere ricostruita poiché non viene salvata nel backup.
- Gestione dei link: i file con più collegamenti devono essere ripristinati correttamente, assicurando che tutte le directory puntino allo stesso file.
- Gestione dei file con buchi: i file con buchi (aree non allocate) devono essere gestiti per evitare che vengano riempiti con zeri durante il ripristino.
- Esclusione dei file speciali: file come pipe e dispositivi speciali non devono essere inclusi nel backup.
Oltre alle questioni tecniche, vi sono anche considerazioni organizzative importanti:
- Sicurezza dei supporti di backup: i supporti di backup devono essere conservati in un luogo sicuro e separato dal luogo dove risiedono i computer per evitare che un disastro possa distruggere sia i dati originali che i backup.
- Gestione degli accessi: è importante controllare l’accesso ai supporti di backup per prevenire furti o accessi non autorizzati.
La gestione efficace dei backup dei file system è fondamentale per garantire la sicurezza e la disponibilità dei dati. Con una strategia ben pianificata, che include backup completi e incrementali, backup fisici e logici, e considerazioni organizzative appropriate, è possibile proteggere i dati da perdite dovute a disastri o errori umani, assicurando un ripristino rapido ed efficace.
File condivisi
Condivisione dei File nei File System
Quando più utenti collaborano su un progetto, spesso hanno bisogno di condividere i file. Questo è reso possibile permettendo a un file di apparire contemporaneamente in diverse directory di utenti diversi. Tuttavia, questo approccio introduce una serie di complessità nella gestione del file system.
Grafo Aciclico Orientato (DAG)
Quando un file è condiviso tra più directory, il file system si trasforma da una struttura ad albero a un grafo aciclico orientato (DAG). In un DAG, un singolo file può avere più percorsi di accesso, creando complessità nella gestione del file system, come illustrato nella Figura 4.18.
Problemi della Condivisione dei File
-
Duplicazione degli Indirizzi del Disco:
- Se le directory contengono indirizzi su disco, la condivisione richiede la copia degli indirizzi. Questo porta a problemi di inconsistenza se diversi utenti modificano il file, poiché le modifiche non saranno visibili agli altri utenti.
-
Gestione della Proprietà e dei Link:
- Quando un file è condiviso, è necessario mantenere una struttura che permetta di gestire le modifiche e le eliminazioni in modo coerente. Due approcci principali sono usati: hard link e link simbolici.
Metodi di Condivisione dei File
-
Hard Link:
- Descrizione: Un hard link crea una nuova voce di directory che punta allo stesso i-node del file originale. Questo metodo incrementa il conteggio dei link nell’i-node, mantenendo traccia di quante directory puntano al file.
- Vantaggi: Efficienza nella gestione dello spazio su disco, poiché non richiede duplicazione del file.
- Svantaggi: Se il file viene eliminato dal proprietario originale, l’i-node non può essere rimosso finché esistono altri hard link, il che può portare a problemi di contabilità e gestione delle quote.
-
Link Simbolico (Soft Link):
- Descrizione: Un link simbolico crea un file speciale che contiene il nome di percorso del file a cui si collega. Quando il link simbolico viene letto, il sistema operativo segue il percorso per trovare il file vero e proprio.
- Vantaggi: Facilita la gestione delle eliminazioni, poiché la cancellazione del file originale rende i link simbolici non validi senza lasciare puntatori orfani.
- Svantaggi: Richiede più operazioni di I/O per risolvere il percorso del file collegato, aumentando il carico sul sistema.
Problemi Specifici dei Link
-
Eliminazione del File Originale:
- Hard Link: Se il file originale viene eliminato, l’i-node rimane finché esistono altri hard link. Questo può causare problemi di contabilità, poiché il proprietario originale continua a essere addebitato per lo spazio occupato dal file.
- Link Simbolico: La cancellazione del file originale rende i link simbolici non validi. I link simbolici non creano problemi di contabilità, ma possono causare errori quando vengono utilizzati.
-
Backup e Duplicazione dei File:
- Problema: I programmi di backup possono creare duplicati di file collegati se non gestiscono correttamente i link. Questo può portare a sprechi di spazio e a backup inefficienti.
- Soluzione: Un programma di backup evoluto dovrebbe essere in grado di riconoscere i link e gestirli in modo appropriato, creando un solo backup del file e ripristinando i link correttamente.
Gestione delle Directory con Voci di Lunghezza Variabile
La gestione dei file con nomi di lunghezza variabile può essere implementata utilizzando directory con voci di lunghezza variabile o utilizzando uno heap per memorizzare i nomi dei file. Questo approccio consente una maggiore flessibilità e utilizza lo spazio in modo più efficiente.
-
Voci di Lunghezza Variabile:
- Ogni voce di directory contiene un nome di file di lunghezza variabile seguito da attributi fissi. Questo metodo riduce lo spreco di spazio, ma può introdurre complessità nella gestione della directory.
-
Uso di uno Heap:
- I nomi dei file sono memorizzati in uno heap alla fine della directory. Le voci della directory contengono puntatori ai nomi dei file nell’heap. Questo metodo consente una gestione più efficiente dello spazio e facilita l’inserimento e la rimozione dei file.
Tabelle di Hash nelle Directory
L’uso di tabelle di hash può velocizzare significativamente la ricerca nelle directory di grandi dimensioni. Ogni nome di file viene hashed per selezionare una voce della tabella di hash, che contiene un puntatore alla voce del file nella directory.
- Vantaggi: Ricerca rapida e efficiente nelle directory di grandi dimensioni.
- Svantaggi: Complessità di gestione e maggiore utilizzo di memoria per mantenere la tabella di hash.
Cache delle Ricerche
Un’altra tecnica per migliorare le prestazioni è l’uso di una cache per memorizzare i risultati delle ricerche recenti. Se il nome del file cercato è nella cache, può essere individuato immediatamente, riducendo il numero di ricerche nel file system.
- Vantaggi: Migliora le prestazioni per ricerche frequenti di file comuni.
- Svantaggi: La cache deve essere gestita attentamente per garantire che contenga informazioni aggiornate e rilevanti.
Conclusione
La condivisione dei file e la gestione delle directory nei file system richiedono un bilanciamento tra efficienza, flessibilità e semplicità di implementazione. Metodi come gli hard link e i link simbolici offrono soluzioni diverse con i propri vantaggi e svantaggi. Tecniche avanzate come le tabelle di hash e la cache delle ricerche possono migliorare significativamente le prestazioni nei file system con un gran numero di file e directory. La scelta della tecnica dipende dalle esigenze specifiche del sistema e dagli obiettivi di progettazione.
File System Virtuali
Virtual File System (VFS)
Il concetto di VFS (Virtual File System) è stato introdotto per integrare più file system in un’unica struttura ordinata. Il VFS agisce come un livello di astrazione che gestisce tutte le chiamate relative ai file indirizzandole ai file system reali sottostanti.
Funzionamento del VFS
- Interfaccia Superiore: Il VFS riceve le chiamate di sistema standard POSIX dai processi utente, come open, read, write, lseek.
- Interfaccia Inferiore: Il VFS invia chiamate di funzione ai file system reali, che eseguono il lavoro effettivo. Queste chiamate includono operazioni come leggere un blocco specifico dal disco, memorizzarlo nella cache del buffer del file system e restituire un puntatore.
Implementazione Object-Oriented
Il VFS è essenzialmente object-oriented, anche se scritto in C invece che in C++. Supporta vari tipi di oggetti chiave, come il “superblock” (che descrive un file system), il “v-node” (che descrive un file), e la “directory” (che descrive una directory di un file system). A ciascuno di questi oggetti sono associate operazioni (metodi) che i file system reali devono supportare.
Processo di Montaggio e Utilizzo dei File System
- Registrazione del File System: All’avvio del sistema, il file system radice viene registrato con il VFS. Altri file system montati successivamente si registrano con il VFS fornendo una lista di indirizzi delle funzioni richieste dal VFS.
- Utilizzo del File System: Quando un file system è montato su una directory (es. /usr), il VFS usa il superblock per trovare la directory radice del file system montato e cercare il percorso richiesto.
- Creazione del v-node: Il VFS crea un v-node ed esegue una chiamata al file system reale per ottenere tutte le informazioni dell’i-node del file. Queste informazioni sono copiate nel v-node, insieme a un puntatore alla tabella delle funzioni da chiamare per le operazioni sui v-node.
- Gestione dei Descrittori dei File: Il VFS predispone una voce nella tabella dei descrittori dei file per il processo chiamante, puntando al nuovo v-node. Alla fine, il VFS restituisce il descrittore del file al chiamante per leggere, scrivere e chiudere il file.
Vantaggi del VFS
- Integrazione Trasparente: Permette l’integrazione di diversi file system in una struttura unificata, invisibile agli utenti e ai processi.
- Flessibilità: Facilita l’aggiunta di nuovi file system. I progettisti possono scrivere file system che forniscono le funzioni richieste dal VFS o creare funzioni wrapper per file system esistenti.
- Supporto per File System Remoti: Originariamente progettato per supportare file system remoti tramite il protocollo NFS, il VFS è indipendente dalla localizzazione dei dati.
Conclusione
L’integrazione e la gestione di file system multipli rappresentano un aspetto cruciale dei sistemi operativi moderni. Mentre Windows utilizza un approccio basato su lettere di unità per separare i file system, UNIX/Linux impiega il VFS per creare una gerarchia unificata, facilitando l’accesso trasparente a file system eterogenei. Il VFS fornisce un’interfaccia standardizzata per interagire con vari file system, migliorando la flessibilità e la scalabilità del sistema operativo.
Implementazione dei file
Gestione della Memoria dei File su Disco
Un aspetto cruciale dell’implementazione della memorizzazione dei file è tener traccia dei blocchi del disco associati a ciascun file. Sono utilizzati vari metodi a seconda dei sistemi operativi, alcuni dei quali sono analizzati di seguito.
Allocazione Contigua
Nello schema di allocazione contigua, ciascun file è memorizzato come una sequenza contigua di blocchi del disco. Per esempio, su un disco con blocchi da 1 KB, a un file di 50 KB sono allocati 50 blocchi consecutivi.
Vantaggi:
- Semplicità di Implementazione: Sono necessari solo due numeri per tenere traccia dei blocchi di un file: l’indirizzo del primo blocco e il numero di blocchi del file.
- Prestazioni Elevate: La lettura dell’intero file richiede una sola operazione, con una sola ricerca iniziale e senza ulteriori ritardi di rotazione del disco.
Svantaggi:
- Frammentazione del Disco: Con il tempo, lo spazio sul disco può frammentarsi a causa dell’eliminazione di file, lasciando intervalli di blocchi liberi (vuoti) sul disco.
- Gestione dello Spazio Libero: La frammentazione può rendere difficile trovare spazi contigui abbastanza grandi per nuovi file, richiedendo potenzialmente la compattazione del disco o una lista di vuoti per riutilizzare lo spazio liberato.
Allocazione a Liste Concatenate
In questo metodo, ciascun file è memorizzato come una lista concatenata di blocchi del disco. La prima parte di ciascun blocco contiene un puntatore al blocco successivo, mentre il resto è utilizzato per i dati.
Vantaggi:
- Nessuna Frammentazione Esterna: Ogni blocco può essere utilizzato indipendentemente dalla sua posizione sul disco.
- Facilità di Espansione: Non è necessario conoscere in anticipo la dimensione finale del file.
Svantaggi:
- Accesso Sequenziale Lento: L’accesso casuale ai dati è lento, poiché è necessario seguire la catena di puntatori per raggiungere un blocco specifico.
- Overhead del Puntatore: Parte dello spazio del blocco è utilizzata per il puntatore, riducendo lo spazio disponibile per i dati.
Allocazione a Liste Concatenate con una Tabella in Memoria
Questo metodo utilizza una tabella in memoria principale, chiamata FAT (File Allocation Table), per memorizzare i puntatori ai blocchi. La FAT è un array che contiene un puntatore per ciascun blocco del disco.
Vantaggi:
- Intero Blocco Disponibile per i Dati: L’intero blocco è disponibile per i dati, poiché i puntatori sono memorizzati nella FAT.
- Accesso Casuale Veloce: La FAT è in memoria, permettendo di seguire rapidamente la catena di puntatori.
Svantaggi:
- Spazio in Memoria: La FAT deve essere mantenuta in memoria principale, occupando una quantità significativa di spazio, specialmente con dischi di grandi dimensioni.
- Non Scalabile: Per dischi di grandi dimensioni, la FAT diventa troppo grande per essere gestita efficientemente in memoria.
I-node
Gli i-node (index-node) sono strutture dati che contengono gli attributi e gli indirizzi dei blocchi di un file. Un i-node deve essere in memoria solo quando il file corrispondente è aperto.
Vantaggi:
- Efficienza di Memoria: Gli i-node occupano meno spazio in memoria rispetto a una FAT, poiché è necessario mantenere in memoria solo gli i-node dei file aperti.
- Scalabilità: La dimensione dell’array di i-node in memoria è proporzionale al numero massimo di file che possono essere aperti contemporaneamente, indipendentemente dalla dimensione del disco.
Svantaggi:
- Limiti di Dimensione del File: Se un file supera il numero di blocchi indirizzabili direttamente da un i-node, è necessario utilizzare puntatori a blocchi di indirizzi aggiuntivi, complicando la gestione.
Conclusione
Ognuno dei metodi descritti per tenere traccia dei blocchi del disco associati ai file ha i suoi vantaggi e svantaggi. La scelta del metodo dipende dalle esigenze specifiche del sistema operativo e delle applicazioni in uso, bilanciando semplicità di implementazione, efficienza di memoria e prestazioni di accesso ai dati.
Implementazione delle directory
Apertura e Mappatura dei File
Quando un file deve essere letto, deve prima essere aperto. Durante l’apertura, il sistema operativo usa il nome del percorso fornito dall’utente per localizzare la voce della directory sul disco, che contiene le informazioni necessarie per trovare i blocchi del disco associati al file. Queste informazioni possono essere:
- L’indirizzo del disco dell’intero file (allocazione contigua).
- Il numero del primo blocco (allocazione a liste concatenate).
- Il numero dell’i-node (per sistemi che utilizzano i-node).
La funzione principale del sistema delle directory è mappare il nome ASCII del file sulle informazioni necessarie per localizzare i dati.
Memorizzazione degli Attributi
Gli attributi dei file possono essere memorizzati direttamente nella voce della directory o negli i-node.
-
Attributi nella Voce della Directory:
- Una directory è composta da una lista di voci a dimensione fissa.
- Ogni voce contiene il nome del file, una struttura degli attributi del file e uno o più indirizzi del disco.
- Questo metodo è illustrato nella Figura 4.16(a).
-
Attributi negli i-node:
- Gli attributi sono memorizzati negli i-node anziché nelle voci delle directory.
- La voce della directory contiene solo il nome del file e il numero dell’i-node.
- Questo metodo è illustrato nella Figura 4.16(b) e offre vantaggi rispetto all’uso delle voci della directory.
Gestione dei Nomi di File di Lunghezza Variabile
I file system moderni supportano nomi di file di lunghezza variabile. Ci sono vari metodi per gestire questa caratteristica:
-
Voci di Lunghezza Fissa con Limite:
- Si imposta un limite (ad esempio, 255 caratteri) e si riservano 255 caratteri per ciascun nome di file.
- Questo metodo è semplice ma inefficiente, poiché spreca spazio per nomi di file più brevi.
-
Voci di Lunghezza Variabile:
- Ogni voce di directory contiene una parte fissa con gli attributi del file e il nome del file di lunghezza variabile.
- Le voci di directory iniziano con la lunghezza della voce seguita dai dati fissi e dal nome del file.
- Questo metodo è illustrato nella Figura 4.17(a).
-
Heap per Nomi di File:
- Le voci di directory hanno lunghezza fissa e i nomi dei file sono memorizzati in uno heap alla fine della directory.
- Questo metodo è illustrato nella Figura 4.17(b) e riduce lo spreco di spazio, ma richiede una gestione aggiuntiva dello heap.
Ottimizzazione della Ricerca nei File System
-
Ricerca Lineare:
- La ricerca del nome di un file nelle directory avviene linearmente dall’inizio alla fine.
- Questo metodo può essere lento nelle directory molto estese.
-
Tabelle di Hash:
- Per velocizzare la ricerca, ogni directory può utilizzare una tabella di hash.
- L’hash del nome del file è calcolato e usato per selezionare una voce della tabella di hash.
- Le voci dei file seguono la tabella di hash, e se una posizione è già utilizzata, si costruisce una lista concatenata.
- Questo metodo offre una ricerca molto più veloce ma introduce complessità amministrative.
-
Cache delle Ricerche:
- Salvare nella cache i risultati delle ricerche può migliorare le prestazioni.
- Prima di avviare una ricerca, si verifica se il nome del file si trova nella cache.
- Questo metodo è efficace se la maggior parte delle ricerche riguarda un numero relativamente piccolo di file.
Vantaggi e Svantaggi delle Diverse Strutture
-
Attributi nella Voce della Directory:
- Vantaggi: Semplice da implementare.
- Svantaggi: Spreca spazio se i nomi dei file sono più brevi del massimo previsto.
-
Attributi negli i-node:
- Vantaggi: Maggiore efficienza nell’uso dello spazio, poiché la voce della directory è più breve.
- Svantaggi: Richiede la gestione degli i-node, che devono essere in memoria quando i file sono aperti.
-
Heap per Nomi di File:
- Vantaggi: Riduce lo spreco di spazio e gestisce efficientemente le voci di lunghezza variabile.
- Svantaggi: Richiede una gestione aggiuntiva dello heap e può causare page fault durante l’elaborazione dei nomi dei file.
Conclusione
La gestione dei file nei file system coinvolge diverse tecniche per ottimizzare lo spazio, migliorare le prestazioni e garantire la coerenza. La scelta del metodo dipende dalle esigenze specifiche del sistema operativo e dagli obiettivi di progettazione. Le tabelle di hash e la cache delle ricerche possono migliorare significativamente le prestazioni nelle directory di grandi dimensioni, mentre l’uso degli i-node e dello heap per i nomi dei file può ottimizzare l’uso dello spazio e facilitare la gestione dei file di lunghezza variabile.
Layout del File System
Gestione del File System sul Disco
I file system sono memorizzati sui dischi e possono essere suddivisi in una o più partizioni, ciascuna con file system indipendenti. Il layout del disco dipende dall’età del computer:
Vecchio Stile: Master Boot Record (MBR)
Nei vecchi sistemi, il settore 0 del disco è chiamato Master Boot Record (MBR) ed è utilizzato per avviare il computer. La parte finale dell’MBR contiene la tabella delle partizioni con gli indirizzi di inizio e fine di ciascuna partizione. Una delle partizioni è indicata come attiva.
Quando si avvia il computer, il BIOS legge ed esegue l’MBR, che localizza la partizione attiva, ne legge il primo blocco (boot block) e lo esegue. Il programma nel boot block carica il sistema operativo contenuto in quella partizione. Ogni partizione inizia con un boot block, anche se non contiene un sistema operativo avviabile.
Il layout di una partizione del disco cambia a seconda del file system, ma spesso contiene alcuni degli elementi illustrati nella Figura 4.10:
- Superblocco: Contiene i parametri chiave del file system, come il numero magico che identifica il tipo di file system e il numero di blocchi.
- Informazioni sui blocchi liberi: Spesso sotto forma di bitmap o lista di puntatori.
- I-node: Un array di strutture dati, una per file, che contiene tutte le informazioni riguardanti il file.
- Directory radice: Contiene la cima dell’albero del file system.
- Altre directory e file: Occupano il resto del disco.
Nuova Scuola: Unified Extensible Firmware Interface (UEFI)
L’avvio con MBR è lento, dipendente dall’architettura e limitato a dischi di dimensioni ridotte (fino a 2 TB). UEFI, proposto da Intel, risolve molti di questi problemi, supportando dischi fino a 8 ZiB e avvio rapido su diverse architetture.
In UEFI, invece del MBR nel settore 0, il secondo blocco del dispositivo contiene la tabella delle partizioni (GUID Partition Table, GPT), con il primo blocco riservato come marcatore speciale. La GPT contiene informazioni sulle posizioni delle varie partizioni sul disco e un backup nell’ultimo blocco.
UEFI supporta file system di tipo FAT nella partizione denominata EFI System Partition (ESP). Il processo di avvio utilizza un vero file system contenente programmi, file di configurazione e tutto ciò che può servire durante l’avvio. Il firmware UEFI può eseguire programmi in formato PE (Portable Executable), rendendolo simile a un piccolo sistema operativo consapevole di partizioni del disco, file system ed eseguibili.
Figura 4.10: Possibile Layout di un File System
Figura 4.11: Layout UEFI con GPT
| Componente | Descrizione |
| — | — |
| Settore 0 | Marcatore speciale per il software che si aspetta di trovare un MBR. |
| Secondo blocco | Contiene la GPT con informazioni sulle partizioni. |
| Ultimo blocco | Backup della GPT. |
| ESP | EFI System Partition, contiene file system FAT con programmi e file di configurazione necessari per l’avvio. |
Conclusione
La gestione dei file system sui dischi è cruciale per il funzionamento dei computer. La transizione dal vecchio sistema MBR a UEFI ha portato numerosi vantaggi, tra cui il supporto per dischi di dimensioni maggiori, un avvio più veloce e una maggiore flessibilità. Entrambi i sistemi utilizzano strutture specifiche per organizzare i file e le partizioni del disco, assicurando un avvio corretto e una gestione efficace delle risorse di memorizzazione.
Componente | Descrizione |
| — | — |
| Superblocco | Parametri chiave del file system, incluso il numero magico e il numero di blocchi. |
| Blocchi liberi | Informazioni sui blocchi liberi, sotto forma di bitmap o lista di puntatori. |
| I-node | Array di strutture dati, una per file, che contiene tutte le informazioni sul file. |
| Directory radice | Contiene la cima dell’albero del file system. |
| Altre directory e file | Occupano il resto del disco. |
Uso della cache nel file system
Concetto di Cache
Una cache è una raccolta di blocchi di dati, solitamente memorizzati in memoria per migliorare le prestazioni di accesso ai dati rispetto a doverli leggere da un dispositivo di memorizzazione più lento come un disco rigido. L’obiettivo principale della cache è ridurre i tempi di accesso e migliorare l’efficienza complessiva del sistema.
Funzionamento della Cache
Quando un blocco di dati è richiesto, il sistema operativo verifica se esso è presente nella cache:
- Cache Hit: Se il blocco è nella cache, viene letto direttamente dalla memoria, evitando l’accesso al disco.
- Cache Miss: Se il blocco non è nella cache, viene letto dal disco, caricato nella cache e poi utilizzato.
Per determinare rapidamente se un blocco è nella cache, si utilizza una tabella di hash. I blocchi con lo stesso valore hash sono collegati in una lista concatenata (collision chain).
Gestione della Cache Piena
Quando la cache è piena e deve essere caricato un nuovo blocco, un blocco esistente deve essere rimosso. Gli algoritmi di sostituzione comunemente usati sono:
- FIFO (First In, First Out): Il blocco più vecchio viene rimosso.
- Seconda Chance: Una variante del FIFO che dà una seconda possibilità ai blocchi di rimanere nella cache.
- LRU (Least Recently Used): Rimuove il blocco meno recentemente usato.
Nel contesto della cache, l’algoritmo LRU è implementato tramite una lista bidirezionale che collega i blocchi in ordine di utilizzo, con il blocco meno recentemente usato in testa alla lista.
Problemi di Coerenza
L’uso della cache introduce problemi di coerenza, specialmente in caso di crash del sistema. Se un blocco modificato non è stato ancora scritto su disco e il sistema va in crash, il file system può risultare incoerente. Per mitigare questo problema, si adottano diverse strategie:
- Scrittura immediata (write-through): Ogni modifica viene immediatamente scritta su disco, riducendo il rischio di incoerenza, ma aumentando il carico di I/O.
- Chiamata di sistema sync: In UNIX, la chiamata sync forza la scrittura su disco di tutti i blocchi modificati. Viene eseguita periodicamente da un programma di background (update) per limitare la perdita di dati in caso di crash.
Cache dei Blocchi vs. Cache delle Pagine
- Cache dei Blocchi (Buffer Cache): Contiene blocchi di dati del disco per ottimizzare le operazioni di lettura e scrittura.
- Cache delle Pagine (Page Cache): Contiene pagine di file, permettendo di soddisfare le richieste di file direttamente dalla memoria, senza passare per il file system.
Alcuni sistemi operativi integrano la cache dei blocchi con la cache delle pagine, specialmente quando supportano i file mappati in memoria. Questo permette di mantenere un’unica istanza dei dati, migliorando l’efficienza dell’uso della memoria.
Considerazioni Pratiche
- Efficienza: La cache deve essere gestita in modo tale da massimizzare il numero di cache hit, riducendo il numero di accessi al disco.
- Coerenza e Sicurezza: È fondamentale garantire la coerenza dei dati nella cache e minimizzare la perdita di dati in caso di crash.
- Compatibilità: La gestione della cache deve essere compatibile con le diverse esigenze dei file system e dei dispositivi di memorizzazione.
In sintesi, l’uso della cache è una tecnica essenziale nei sistemi operativi per migliorare le prestazioni di accesso ai dati, ma richiede una gestione attenta per mantenere l’efficienza e la coerenza del file system.