Il modello logico definisce la modalità di identificazione dei file, le operazioni possibili sui file, l’organizzazione delle informazioni nei file e le operazioni possibili sulle informazioni all’interno dei file.
Le operazioni consentite sui file possono essere per esempio creazione di un file, cancellazione di un file, modifica del nome del file e così via. Il file system decide le modalità con cui vengono effettuate le operazioni; per esempio se si cerca di creare un file che esiste già può far fallire l’operazione o sostituire il file con quello nuovo vuoto.
Apertura dei file
I file sono risorse che i processi chiedono e rilasciano con le operazioni di apertura e chiusura. I descrittori dei file aperti vengono caricate in una tabella apposita; la dimensione della tabella dei file aperti limita il numero di file che possono essere aperti contemporaneamente; i file sono identificati dalla posizione nella tabella dei file aperti che poi fa riferimento al descrittore nella tabella dei descrittori su disco.
Ogni processo può aprire più file. L’apertura avviene specificando il modo (lettura o scrittura). Per ogni processo viene utilizzata una tabella dei file aperti dal processo (che può far parte del descrittore del processo o del file system); la dimensione della tabella limita il numero di file che possono essere aperti contemporaneamente da un processo. L’indice della posizione del file nella tabella dei file aperti del processo viene restituito al processo, che lo usa per identificare il file. Se un processo apre un file in lettura e scrittura lo identifica con due indici.
Per ogni file aperto viene assegnato al processo un puntatore nel file che si riferisce alla lettura o scrittura secondo il modo; il puntatore viene utilizzato per mantenere la posizione corrente all’interno del file, cioè la posizione su cui hanno effetto le operazioni.
Tra l’apertura e la chiusura di un file si ha una sessione di operazioni sulle informazioni contenute nel file.
Protezione
Il file system in genere offre meccanismi di protezione per stabilire chi può effettuare operazioni sui file e quali operazioni può effettuare.
Di solito chi crea il file viene considerato proprietario del file e può stabilire quali operazioni possono essere effettuate dagli altri utenti. Ogni volta che viene richiesta un’operazione sul file, il file system controlla se l’operazione è permessa (se è consentito l’accesso al processo per quel tipo di operazione).
Condivisione
Più processi possono avere sessioni contemporanee su uno stesso file. Il file system deve controllare l’esecuzione delle operazioni sui file condivisi in modo che vengano eseguite correttamente.
L’accesso contemporaneo di più programmi, o di più copie dello stesso programma ad uno stesso file potrebbe causare situazioni di inconsistenza dei dati.
Per esempio in una situazione del tipo:
- il programma A legge il record,
- il programma B legge il record,
- il programma A aggiorna il record (per esempio aggiunge 1 a un campo),
- il programma B aggiorna il record (per esempio aggiunge 1 allo stesso campo), si perde l’aggiornamento del programma A.
Per evitare ciò, il file system gestisce gli accessi contemporanei: un record (o meglio un blocco, perché è il blocco che è fisicamente interessato dall’operazione) può essere condiviso in fase di lettura, ma non se sono previste operazioni di aggiornamento. Se un file è aperto anche in output l’accesso a un blocco letto da un programma viene impedito a un altro programma finché il blocco non viene rilasciato con un’istruzione di scrittura o con la lettura di un altro blocco dello stesso file.
Metodi di organizzazione e di accesso
Le operazioni possibili sulle informazioni contenute nel file (lettura, inserimento, variazione ecc.) dipendono dal tipo di organizzazione del file. Secondo la struttura logica (file byte stream o file di record) le operazioni di lettura e scrittura riguardano sequenze di caratteri o record.
Le modalità di lettura e scrittura dipendono anche dai metodi di accesso che possono essere sequenziale o diretto. Il metodo sequenziale è basato su un puntatore alla posizione corrente, modificabile dalle letture e scritture. L’apertura posiziona il puntatore all’inizio (in caso di scrittura si perdono le informazioni precedenti). La scrittura parte dalla posizione attuale e sposta il puntatore (si possono solo appendere caratteri). Per l’accesso diretto si usano le stesse operazioni di lettura e scrittura ma si introduce l’operazione di posizionamento del puntatore (seek).
Sui file byte stream le operazioni avvengono su un carattere alla volta. I file byte stream hanno una organizzazione con byte suddivisi in record logici che coincidono con i blocchi; l’accesso può essere sequenziale o diretto specificando il byte che si desidera; si possono aggiungere caratteri solo alla fine del file.
Sui file di record le operazioni vengono effettuate su un record per volta. I file di record possono avere organizzazione sequenziale, ad accesso diretto (come un vettore) o ad accesso indicizzato con un campo chiave. Nei file ad organizzazione sequenziale si può accedere ai record solo in modo ordinato e si possono aggiungere record solo alla fine del file. Il file termina con una etichetta EOF (End Of File) che segnala la fine del file. L’organizzazione diretta è simile a un vettore di record; ogni record è individuato da un numero che esprime la posizione relativa all’interno del file; consente l’accesso sequenziale e l’accesso diretto con posizionamento sul record desiderato; i record vengono creati vuoti alla creazione del file, in base alle dimensioni indicate, e si possono aggiungere record solo alla fine del file. I file a organizzazione indexed hanno record con un campo chiave che identifica univocamente il record; l’accesso può essere sequenziale (in ordine di chiave) o diretto specificando la chiave; i record vengono inseriti logicamente nella posizione individuata dalla chiave (che non deve già esistere). Fisicamente il file può essere realizzato come un file sequenziale con un’area indici associata all’area dati; l’area indici è costituita da una tabella che riporta per ogni chiave l’indirizzo del record; l’area dati può essere divisa in segmenti e allora l’area indici contiene l’ultima chiave di ogni segmento e in corrispondenza l’indirizzo di inizio del segmento (all’interno del quale poi la ricerca è sequenziale); l’area indici può essere costituita anche da tabelle a più livelli. Un modo più efficiente consiste nel realizzare il file con blocchi di record collegati in una struttura ad albero con un ordine di visita (B-tree).
Un tipo particolare di organizzazione è l’organizzazione regional in cui le informazioni sono considerate come un tutto unico; un’operazione di lettura o scrittura agisce su tutto il file; è usata per i file di programma; quando il programma viene richiamato, il file viene caricato per intero in memoria.
Integrità dei dati e affidabilità
Il file system deve garantire l’affidabilità dei file con meccanismi di verifica e ripristino della consistenza.
Le cause principali di inconsistenza di dati nei file sono l’immissione di dati errati e l’interruzione improvvisa di programmi di elaborazione (interruzioni per esempio per cali di tensione, guasti di sistema, errori di programma ecc.).
Per evitare che sia l’utente a introdurre dei dati errati, nei programmi devono essere predisposti degli opportuni controlli sui dati inseriti (validazione dei dati).
Quando un programma viene interrotto a causa di una caduta di tensione oppure dall’operatore, per esempio per un problema di stallo, può succedere che non siano stati completati tutti gli aggiornamenti sui file, portando ad una situazione di inconsistenza dei dati. Questa situazione può essere gestita dal sistema con procedure di recovery ma può anche essere prevista e gestita dai programmi applicativi stessi con le transazioni.
Recovery
Ad ogni modifica dei dati il sistema provvede a memorizzare la situazione prima e dopo la variazione. I dati che vengono aggiornati sui file solo dopo un certo periodo (aggiornamenti di file con programmi di editor, aggiornamenti su file in presenza di memoria cache, aggiornamenti di gruppi di record in data base ecc.) vengono memorizzati provvisoriamente in file temporanei detti file di log; mediante le informazioni memorizzate nei file di log si può ripristinare la situazione immediatamente precedente al verificarsi della condizione di errore senza perdita di dati.
Gestione delle transazioni
Le transazioni sono operazioni di aggiornamento di più file in condizioni di sicurezza. Il programmatore deve individuare con apposite istruzioni (offerte dai linguaggi di programmazione) le transazioni cioè i gruppi di operazioni che devono essere considerate interamente fatte o interamente non fatte. In pratica un’operazione di aggiornamento di più file viene sempre eseguita completamente o annullata (operazione di rollback).