10. Interfaccia del File System 10.1 Il concetto di File 10.2 Metodi di accesso 10.3 Struttura delle Directory 10.4 Protezione (Leggere) 10.5 Semantica della Consistenza (Leggere) Un File System consiste di tre parti: una collezione di file per memorizzare dati legati correlati una struttura di directory, che fornisce organizzazione a tutti i file del sistema partizioni, per separare logicamente e fisicamente (grandi) collezioni di directory
10.1 Il concetto di file Una unità di memorizzazione di dati logicamente unitaria, dotata di un nome, astratta dalle caratteristiche fisiche del mezzo di memorizzazione e dalla localizzazione dei dati sul mezzo Non sempre i file sono memorizzati su memoria non volatile I dati di un programma non possono memorizzati su memoria secondaria se non all'interno di un file Un file può contenere dati di tipo diverso dati numerici caratteri binary programmi sorgenti linkabili eseguibili (oggetto) documenti multimediali omogenei Un file ha una struttura che dipende dal suo tipo: nessuna: sequenza di byte o parole di memoria a record semplice linee lunghezza fissa lunghezza variabile struttura complessa
documento formattato file caricabile rilocabile Una struttura di record può essere simulata (codificata) mediante opportuni caratteri di controllo (ma è una grossa limitazione!) Chi decide la struttura di un file? Il programma che crea il file con l'aiuto del sistema operativo che gestisce il file su memoria secondaria 10.1.1 Attributi dei file Facilitano il trattamento del file, per l'utente umano o per il sistema operativo Nome: simbolico, è l'unica informazione mantenuta in modalità leggibile dall'uomo (caratteri stampabili) Tipo: necessaria per quei sistemi operativi che supportano diversi tipi di file Posizione: del file sul supporto di memoria secondaria. Non è nota neanche al programma che accede al file Dimensione: corrente del file, dal punto di vista del programma che accede ai dati. Il file può occupare uno spazio maggiore sulla memoria secondaria Protezione: informazione di controllo dell'accesso che permette al sistema operativo di proteggere il file da usi non desiderati dal proprietario del file Data, ora e identificazione del proprietario: può esser la data della creazione, dell'ultima modifica, dell'ultimo accesso; identificazione dell'utente creatore (proprietario) del file Le informazioni sul file sono mantenute in genere nella struttura delle directory, che viene mantenuta su memoria secondaria. Può anche essere di dimensione significativa (1000 byte per file)
10.1.2 Operazioni sui file È un tipo di dato astratto definito solo dalle operazioni che si possono compiere su di esso (rese disponibili dal sistema operativo, mediate attraverso il linguaggio di programmazione e il suo run-time-support (vedi Architetture)) Creazione di un file. Richiede al file system di trovare spazio per il file, e poi di creare un accesso al file attraverso una directory - > nome del file, modi di accesso, dimensioni massime previste Scrivere sul file. Occorre identificare il file sul quale scrivere, cosa scrivere e come scrivere (sostituzione, aggiunta,...). L'identificazione del file può essere assoluta (nome) oppure attraverso un handle che è ottenuto aprendo precedentemente il file. Leggere dal file. Occorre identificare il file, quanto e come leggere, dove trasferire i dati letti, nella memoria del programma che legge. A volte la lettura è fatta relativamente ad una posizione corrente sul file, che viene aggiornata dalla operazione di lettura. Riposizionarsi sul file. Cambia la posizione corrente sul file. Distruggere il file. Si recupera lo spazio occupato dal file sul supporto di memoria e lo spazio occupato nella directory. Troncare il file. Ridurre i dati memorizzati e recuperare lo spazio occupato. Aprire il file. Per ottenere l'handle che permette le operazioni sul file. Alloca risorse di file system per rendere l'accesso possibile e veloce. Chiudere il file. Per rilasciare le risorse del file system che permettono l'accesso veloce al file.
Altre Operazioni Oltre alle operazioni di base vi può essere appendere al file delle informazioni, rinominare il file, copiare un file in un altro Accesso Rapido ai file Si arriva ad un file attraverso una directory, che deve essere scandita per trovare le informazioni relative alla posizione del file e ai metodi di accesso permessi -> operazione troppo lenta, che richiede accesso alla memoria secondaria -> È meglio che il file system mantenga questa informazione in memoria primaria per renderla più veloce -> Deve sapere quali sono i file su cui spendere le proprie risorse -> Il file system richiede ai programmi di dichiarare prima quali file useranno e in che modo, pretendendo che essi vengano aperti prima dell'uso Open file table per process e per system I file devono esser chiusi per liberare le risorse del file system -> limite sul numero totale di file aperti che un processo può avere! La open file table contiene la posizione corrente del processo nel file Memory mapping del file, permette di caricare in memoria primaria il file prima dell'uso in modo che una operazione sul file non necessariamente implichi il ritardo dell'accesso alla memoria secondaria -> buffering del file.
10.1.3 File type Il file system deve riconoscere e supportare tipi diversi di file? Se la risposta è sì, allora il file system può verificare il corretto uso del file e offrire migliore prestazioni. Come si riconosce/comunica il tipo di un file? Un modo molto comune è quello di dividere il nome in due parti, separate spesso da un "." La seconda parte del nome viene chiamata estensione. Esempio: File Type Estensione Funzione Eseguibile exe, com, bin, o nessuna programma in linguaggio macchina, pronto per la esecuzione Oggetto obj, o programma compilato, non linked Sorgente c, p, pas, f77, asm, sorgente in linguaggi diversi a Batch bat, sh file di comandi per un interprete di comandi Testo doc, txt file testuale, documento Word processor wp, doc, tex, rtf,... vari formati di word processor Libreria lib, a libreria di routine o moduli da linkare Stampa ps, dvi, gif file ASCII o binario in formato di stampa o di view Archivio arc, zip, tar file contenuti in un formato di archiviazione, compresso o meno Alcuni sistemi operativi supportano in modo attivo l'associazione fra tipo del file e applicazione che è in grado di trattare il file (Windows95, MacOS,...), altri invece solo in parte (Unix attraverso il cosiddetto magic number), altri per nulla MS-DOS.
10.1.4 Struttura del file Alcuni file hanno una struttura che è legata al tipo del file. Ad es. un file che contiene un eseguibile rilocabile da caricare in memoria Alcune strutture dei file sono "comprese" dal sistema operativo che offre operazioni specifiche per la struttura. Ad es. file costituiti da record, individuati dalla loro posizione all'interno del file, con operazioni di posizionamento ad una certa posizione lettura/scrittura del record alla posizione corrente inserzione di un record nella posizione corrente rimozione del record alla posizione corrente Altri sistemi operativi hanno strutture molto semplici. Ad es. sequenze di byte non interpretati, senza operazione di inserzione o rimozione di byte, ma solo riscrittura di byte, aggiunta in fondo al file, troncamento del file MacOS struttura il file in due parti, resource fork e data fork. la resource fork contiene informazioni per l'utente, quali le etichette dei bottoni; il data fork contiene il codice dei programmi e/o i dati.
10.2 Metodi di Accesso È la modalità con cui si può accedere ai dati contenuti nel file. Dipende dal tipo del file. 10.2.1 Accesso Sequenziale Il file viene letto sequenzialmente, la scrittura cancella tutto quello che ci poteva essere precedentemente dopo la posizione corrente (modello del nastro). read next write next reset Dopo una scrittura non si può fare una lettura senza prima avere fatto reset all'inizio del file, perché è una riscrittura. Tipico con file strutturati a record.
10.2.2 Accesso Diretto Si può accedere direttamente al componente in posizione n nel file, in lettura o in scrittura. Alternativamente prima ci si posiziona in posizione n, poi si legge o scrive, e l'operazione comporta lo spostamento della posizione. È in genere supportato solo per file con componenti (record) di lunghezza fissa.
10.3 Struttura di Directory I file system possono essere molto grandi: decine di migliaia di file, su centinaia di gigabyte di disco. Occorre una organizzazione per poter accedere a tutti questi dati in tempi ragionevoli, che non crescano linearmente con il numero dei file e con lo spazio disco. 1. Suddividere il file system in partizioni (minidisk per la IBM, volumi per Windows e MacOS). Ogni disco contiene almeno una partizione; in certi sistemi operativi una partizione può occupare più di un disco. 2. Ogni partizione contiene informazione relativa ai file che vi sono contenuti: (device) directory oppure volume table of content.
Ogni file è descritto in una entry della directory: Nome del file Tipo Indirizzo sul disco Lunghezza corrente Lunghezza massima Data dell ultimo accesso Data dell ultima modifica ID del proprietario del file Informazione per la protezione Operazioni compiute su una directory Ricerca di un file Creazione Cancellazione di un file List della directory Cambiamento del nome di un file Attraversamento del file system Le informazioni contenute nella directory sono vitali per poter accedere ai file: perdere i dati della directory comporta perdita di accesso ai file. Le directory devono essere logicamente organizzate in modo da ottenere: Efficienza Facilità di naming per gli utenti: due utenti possono dare lo stesso nome ciascuno al proprio file lo stesso file deve poter avere nomi diversi Raggruppamento dei file per tipo, o per struttura del nome
10.3.1 Directory ad un solo livello Tutti i file sono contenuti in una unica directory: molto semplice da implementare e comprendere Svantaggiosa quando ci sono più utenti (non possono dare lo stesso nome a due file diversi) e quando il numero dei file diventa molto grande (inefficiente la ricerca e la creazione)
10.3.2 Directory a due livelli Una directory per ogni utente (User File Directory) e poi una directory che punta alle directory degli utenti (Master File Directory) Risolve il confitto di nomi fra utenti, ma non permette agli utenti di cooperare condividendo i file. Per cooperare occorre uno schema di naming complesso (nome_utente+nome file). Lo spazio dei nomi può essere visto come un albero con due soli livelli: il nome di un file è dato dal cammino (o path name). Per indicare la partizione del file system su cui il file è posizionato occorre anche aggiungere il nome della partizione.
10.3.3 Directory con struttura ad albero Una directory a due livelli è un albero a due livelli. Se generalizziamo abbiamo directory a struttura di albero di altezza arbitraria. Gli utenti possono introdurre le loro sottodirectory (system call) e cancellare file (system call) o sottodirectory (system call). In questo modo costruiscono il loro sottoalbero. L albero ha un nodo radice (root), e ogni file ha come nome il path name dalla radice al file (o sottodirectory) corrispondente.
10.3.3 Directory con struttura ad albero (2) Ogni (programma) utente ha in ogni momento una current directory, che contiene i file su cui lavora. Un path name può essere assoluto (cioè specificare il cammino dalla radice) oppure relativo alla current directory. Esiste una system call per cambiare la directory corrente (e anche un comando di shell: chiara la differenza?) Poiché l utente può costruire la propria struttura di directory, ha la possibilità di raggruppare i file secondi criteri da lui decisi. I file di tutti gli utenti sono contenuti in unica albero, nel quale ad un certo livello si dividono i sottoalberi privati degli utenti: la condivisione è facilitata. Poiché la forma dell albero dipende dal particolare calcolatore su cui ci si trova ad operare (perché è decisa dagli amministratori del sistema e dagli utenti), è essenziale che i programmi non contengano nomi assoluti di file. Non è facile!!
10.3.4 Directory con struttura a grafo aciclico La struttura ad albero non permette di condividere file o directory con nomi diversi. Questo è un grosso limite alla condivisione e alla cooperazione. Lo stesso file o directory deve poter appartenere a directory diverse, con nomi diversi nelle diverse directory: aliasing. Implementazioni diverse: link, quando il file nominato si trova nella stessa partizione della directory padre; symbolic link quando il file nominato si può trovare anche su partizioni diverse da quella della directory padre.
10.3.4 Directory con struttura a grafo aciclico Se il file è un link, la cancellazione alla fine cancella anche l entry nella directory padre. Quando il file è un symbolic link, la cancellazione del file target non cancella il link nelle directory padre. Perché? Perché le directory padre potrebbero non essere raggiungibili al momento della cancellazione (partizioni rimovibili o raggiungibili via rete) 10.3.5 Directory con struttura a grafo generale Con i link simbolici possono essere costruiti anche cicli: un altra ragione per non mantenere il conto dei riferimenti ad un file/directory. O si accettano dangling pointer oppure si deve implementare un algoritmo di garbage collection, la cui implementazione con partizioni rimovibili e su rete è praticamente impossibile.