Generalità
Le informazioni in quasi tutti i sistemi operativi sono raccolte all'interno di entità dette file. Impacchettando le informazioni in file è possibile memorizzarle in dispositivi di "memoria secondaria". Ogni file contiene informazioni correlate tra di loro. Ogni file è strutturato al proprio interno a seconda del proprio tipo:
-file dato, può essere di diversi sottotipo (numerici, alfabetici, binari…).
-file sorgente, formato da una sequenza di procedure e funzioni.
-file oggetto, formato da una sequenza di byte, organizzati in blocchi, comprensibili dal linker.
-file eseguibile, una serie di sezioni di codice che il loader può caricare in memoria principale ed eseguire.
Il tipo di file può essere indicato nell'estensione (sistemi Windows), oppure può essere specificato in un apposito campo del file (un numero in UNIX, il nome del programma che lo ha creato in MAC).
Ogni file ha delle proprie caratteristiche:
-nome, il nome simbolico del file.
-id, etichetta univoca (normalmente un numero), che identifica il file all'interno del file system (insieme di file).
-tipo, determina il tipo del file.
-locazione, è composto dal puntatore ad un dispositivo e dal puntatore al file all'interno del dispositivo stesso.
-dimensione, determina la dimensione corrente del file (può essere espressa in byte, parole, blocchi, …).
-protezione, determina le informazioni riguardanti chi può leggere, scrivere o eseguire il file.
-ora, data, identificazione dell'utente, indicano le informazioni relative alla creazione, ultima modifica, ultimo uso del file.
Queste informazioni sono contenute nelle directory, che sono strutture che risiedono fisicamente nelle memorie secondarie. Una directory è normalmente costituita da un file, caratterizzato da un identificatore univoco.
Operazioni sui file
Un file può essere definito come un tipo di dato astratto. Per completare quindi la descrizione di cosa rappresenta un file è necessario stabilire quali siano le operazioni che un OS deve poter eseguire su su queste entità
-creazione. L'OS deve trovare lo spazio nel file system e creare un nuovo elemento nella directory.
-scrittura. L'OS cerca il file mediante l'id all'interno di una directory e scrive nel file in base a un puntatore di scrittura.
-lettura. L'OS deve cercare il file all'interno di una directory e leggere in base a un puntatore di lettura.
-riposizionamento. L'OS deve cercare il file e modificare il puntatore di posizione del file.
-cancellazione. L'OS deve cercare il file e rilasciare lo spazio associato al file stesso.
-troncamento. L'OS esegue una cancellazione dei dati, lasciando invariati gli attributi del file.
Queste operazioni possono essere integrate con altre operazioni più complesse come l'aggiunta, la ridenominazione…
Tutte le operazioni descritte necessitano di una fase di ricerca. Per evitare continue ricerche, la maggior parte degli OS permettono di "aprire" un file. L'OS tiene traccia dei file aperti mediante una tabella. Nel momento in cui un file non viene più utilizzato esso può essere chiuso. Per evitare problemi di modifiche concorrenti su uno stesso file, molti OS associano ad ogni file aperto un contatore, che indica il numero di utenti che hanno aperto un determinato file. Nella tabella dei file aperti sono contenute le seguenti informazioni.
-puntatore all'interno file (univoco per ogni processo).
-contatore dei file aperti.
-posizione del file.
-diritti d'accesso (univoco per ogni processo).
Alcuni OS prevedono la possibilità di usare dei lock sui file. Un lock condiviso permette ad altri utenti di aprire un determinato file (es. operazione di lettura). Un lock esclusivo, al contrario, impedisce agli altri utenti di effettuare operazioni su un file (es. operazione di scrittura). I lock possono essere obbligatori (sistemi Windows) e quindi negano l'accesso a qualunque altro processo, oppure consigliati (sistemi UNIX) ed è quindi possibile forzare l'accesso al file se il programmatore lo dichiara esplicitamente.
Struttura dei file
I tipi di file possono determinare la struttura interna dei file stessi. I file sorgente ed i file oggetto, ad esempio, necessitano di una struttura comprensibile dal programma che dovrà leggerli. Alcuni file, inoltre, devono avere una struttura tale da essere compresa dal sistema operativo.
Gli svantaggi dei sistemi operativi che strutture diverse di memorizzazione per ogni tipo di file sono:
-dimensione risultante dell'OS molto ingombrante.
-i tipi di file disponibili potrebbero non essere sufficienti per rappresentare tutti i tipi necessari.
Per questi motivi gli OS utilizzano e gestiscono un numero minimo di strutture di file. Ad esempio UNIX considera ciascun file come una sequenza di byte, senza alcuna interpretazione. Questo comporta una massima flessibilità , ma anche un minimo sostegno al programmatore. Anche Macintosh gestisce un numero limitato di tipi di file: i file eseguibili sono divisi in due parti (resource fork, per contenere le informazioni che interessano l'utente, e data fork, per memorizzare il contenuto del file stesso).
In linea di massima è utile che l'OS gestisca le strutture di file più comuni, in modo da aiutare il programmatore, senza appesantire troppo l'OS stesso.
Poiché esistono tipi di file differenti, potrebbe essere una operazione non banale per il sistema operativo determinare lo scostamento dei vari blocchi logici all'interno di un file. I record fisici, variano a seconda del supporto nel quale vengono memorizzati i file. La tecnica usata per risolvere questo problema è quella dell'impaccamento, che prevede di memorizzare un certo numero di blocchi logici, all'interno di un supporto fisico. Come già detto, UNIX adotta questa tecnica, considerando tutti i file come una sequenza di byte.
L'impaccamento genera frammentazione interna, in quanto anche se i blocchi logici sono piccoli, ci sarà sempre una parte del blocco finale inutilizzata.
Metodi d'accesso ai file
Esistono diversi modi per accedere alle informazioni contenute nei file. Alcuni OS permettono diverse modalità di accesso, in altri è necessario specificare per ogni file il metodo di accesso, in altri ancora non è possibile stabilirlo. Le principali modalità di accesso sono:
-accesso sequenziale. E' il metodo di accesso più semplice, in cui le informazioni del file vengono lette in modo ordinato: un record dopo l'altro. Questo metodo è il più usato, in quanto è semplice da implementare. Un'operazione di lettura legge la prima porzione di file e poi fa avanzare un puntatore interno al file. Analogamente l'operazione di scrittura aggiunge la nuova informazione alla fine del file e fa avanzare il puntatore di scrittura alla locazione successiva.
-accesso diretto. Secondo questo metodo di accesso si considera ogni file come formato da una serie di elementi logici, detti record, di lunghezza fissa. Secondo questo metodo è possibile accedere ad un qualsiasi record indicando lo scostamento del record stesso rispetto all'inizio del file. In questo modo è possibile accedere immediatamente a grandi quantità di informazioni. Le operazioni di scrittura e lettura avvengono quindi mediante un puntatore, specificato come parametro. Il numero di blocco fornito dall'utente all'OS è relativo rispetto all'inizio del file, in modo da non avere problemi di allocazione. Alcuni sistemi iniziano la numerazione dei blocchi da 0 altri da 1. Se si organizza ogni file in questo modo è facile emulare in maniera rapida l'accesso sequenziale.
-accesso a indice. Basandosi sul metodo precedente è possibile costruire un indice, contenente i puntatori ai vari blocchi. Nel caso di file molto lunghi è possibile che anche l'indice risulti essere troppo lungo, è per questo che è possibile implementare indici di indici.
| < Prec. | Succ. > |
|---|





