Riassunto gerarchico delle nozioni del corso 2003-2004 di
Sistemi Operativi del Prof. Francesco Aymerich - Università degli
Studi di Cagliari, Facoltà di Scienze Matematiche Fisiche Naturali,
Dipartimento di Matematica ed Informatica, Corso di Laurea in
Informatica
- obiettivi della memorizzazione non volatile
- 1) memoria di linea
- per certe applicazioni che comportano il ritrovamento di informazioni (come, ad esempio, nel caso dei sistemi informativi gestionali) risulta necessario memorizzare grosse quantità di dati in modo che siano sempre accessibili.
- in un sistema universale, dove un vasto data base in linea può
essere superfluo, è molto comodo per l'utente essere in grado di
memorizzare programmi o dati all'interno dello stesso sistema di
calcolo, anziché su qualche supporto esterno
- per i sistemi ad accesso multiplo non è pensabile che l'utente
riesca nei suoi compiti senza una memoria in linea, dal momento che
l'unica periferica di I/O a sua disposizione è il terminale sul
quale lavora.
- pochi utenti riuscirebbero a sopportare un sistema nel quale debbano essere reinseriti di nuovo tutti i programmi ed i dati all'avvio di ogni sessione sul terminale.
- perfino nei sistemi di tipo batch una memoria in linea può portare ad un aumento della produttività, in quanto riduce la dipendenza dalle periferiche più lente
- per i sistemi ad accesso multiplo non è pensabile che l'utente
riesca nei suoi compiti senza una memoria in linea, dal momento che
l'unica periferica di I/O a sua disposizione è il terminale sul
quale lavora.
- 2) condivisione delle informazioni
- gli utenti di un sistema universale potrebbero voler utilizzare reciprocamente i programmi o i dati degli altri utenti ed in un sistema di trattazione delle transazioni molti processi distinti possono servirsi dello stesso data base.
- nella maggior parte dei sistemi universali è consigliabile per l'installazione fornire un insieme di programmi di libreria, quali editor, compilatori o sottoprogrammi a carattere scientifico, comunemente disponibili a tutti gli utenti.
- se le informazioni vanno condivise in questo modo, devono
essere memorizzate in linea per lunghi periodi di tempo
- per motivi economici, la memorizzazione a lungo termine viene
effettuata su supporti secondari, quali dischi, nastri magnetici e
CD-ROM, e spetta al file system fornire i mezzi idonei all'utente
per poter organizzare ed accedere ai dati con comodità.
- il modo in cui ciò viene messo in pratica naturalmente dipende dal tipo di dati e dall'utilizzo che se ne intende fare;
- è prevedibile che il file system per un sistema di trattazione delle transazioni sia piuttosto diverso da quello destinato ad un sistema di controllo dei processi.
- per motivi economici, la memorizzazione a lungo termine viene
effettuata su supporti secondari, quali dischi, nastri magnetici e
CD-ROM, e spetta al file system fornire i mezzi idonei all'utente
per poter organizzare ed accedere ai dati con comodità.
- 1) memoria di linea
- obiettivi del file system
- in questo capitolo ci limiteremo ai sistemi universali nei quali i file system in generale sono su dischi
- l'utente di un sistema universale dispone i propri dati in file di dimensione arbitraria.
- ogni file rappresenta così una raccolta di dati che l'utente considera come un'unica entità; si può trattare di un programma, di un insieme di procedure o dei risultati di un esperimento.
- il file è l'unità logica memorizzata e manipolata dal file system.
- il supporto su cui sono memorizzati i file viene solitamente suddiviso in blocchi di lunghezza fissa (sono caratteristiche le lunghezze comprese tra 512 e 4096 byte) che il file system deve allocare in numero opportuno per ciascun file.
- Per tornare utile, il file system deve:
- permettere la creazione e la cancellazione dei file;
- consentire l'accesso ai file per la lettura o la scrittura di dati;
- svolgere automaticamente la gestione della memoria secondaria
- non dovrebbe interessare affatto all'utente dove sono ubicati i suoi file all'interno della memoria di massa;
- consentire di fare riferimento ai file tramite un nome
simbolico
- poiché l'utente non conosce, né vuole conoscere, la locazione fisica dei propri file
- proteggere i file dai malfunzionamenti del sistema
- consentire la condivisione dei file tra utenti cooperanti, ma proteggere i file dall'accesso di utenti non autorizzati
- le directory
- mapping
- consiste nell'associare un nome simbolico alla locazione relativa su memoria secondaria
- è il problema fondamentale dell'accesso ai file
- directory dei file
- consiste essenzialmente in una tabella contenente informazioni sulle locazioni dei file richiesti
- è il meccanismo tramite cui si accede ai file
- consente di effettuare il mapping
- include dei meccanismi di protezione che inibiscono l'accesso
ai file ad utenti non autorizzati
- si può prevedere una misura di sicurezza immediata dividendo la
directory in due livelli
- livello superiore, directory dei file principali (master file
directory; MFD)
- contiene per ogni utente del sistema un puntatore diretto ad una directory dei file dell'utente (user file directory; UFD)
- livello inferiore, directory dei file utente (user file
directory; UFD)
- ciascuna UFD contiene i nomi e le locazioni dei file di ogni singolo utente.
- ogni voce UFD generalmente è formata da
- nome del file
- locazione fisica del file sulla memoria secondaria
- tipo di file (caratteri, binario, ...)
- queste informazioni, in larga misura, vengono conservate per comodità dell'utente ed anche perché possono risultare utili per quei programmi di sistema, quali i loader o gli editor, che generalmente vengono usati per operare sui file.
- per quanto riguarda il file system in sé, ogni file è considerato semplicemente una stringa di bit
- informazioni di controllo per l'accesso ad un file (per esempio sola lettura);
- informazioni di normale amministrazione (per esempio l'ora
dell'ultimo aggiornamento).
- tali informazioni servono a fornire dati a quelle attività di sistema che si occupano della conservazione di duplicati, quali garanzia a fronte di eventuali malfunzionamenti dell'hardware
- siccome si può aver accesso ad una UFD solo tramite la MFD, sì riesce a garantire la riservatezza dei file di un utente tramite il semplice controllo della sua identità a livello della MFD.
- inoltre, utenti diversi possono dare Io stesso nome ad un file
senza creare confusione, poiché il nome completo di un file può
essere considerato come la concatenazione del nome dell'utente
relativo (o del suo numero) e del nome proprio del file,
UTENTE.NOMEFILE
- in pratica non è sempre necessario specificare il nome completo
di un file, poiché il file system è in grado di utilizzare
l'identità di chi richiede di accedere al sistema come valore
assunto per default relativamente al primo elemento.
- quando un utente avanza la richiesta d'accesso ad un file di un altro utente è necessario specificare interamente il nome
- in pratica non è sempre necessario specificare il nome completo
di un file, poiché il file system è in grado di utilizzare
l'identità di chi richiede di accedere al sistema come valore
assunto per default relativamente al primo elemento.
- molti sistemi (per esempio il DEC System-10) adottano questa struttura di directory a due livelli
- livello superiore, directory dei file principali (master file
directory; MFD)
- struttura a più livelli
- in questo tipo di struttura gli elementi di una directory possono essere puntatori diretti sia a file che ad altre directory
- torna utile per quelle situazioni in cui le informazioni
memorizzate presentano una classificazione simile ad un albero,
oppure laddove gli utenti sono raggruppati in gerarchie come, per
esempio, gli individui nell'ambito di équipe di progetto che fanno
capo a dipartimenti.
- in quest'ultimo caso si può applicare un meccanismo gerarchico di protezione effettuando verifiche sempre più selettive mano a mano che si va verso i nodi terminali dell'albero.
- come nel sistema a due livelli, si possono risolvere situazioni di eventuale contrasto tra i nomi dei file considerando come nome completo la concatenazione dei nomi propri dei file con i nomi delle directory esistenti sul suo percorso d'accesso
- lo svantaggio consiste nella lunghezza del percorso per
arrivare ad un qualsiasi file specifico e nel numero di accessi su
disco che si devono effettuare per seguire il percorso attraverso
le varie directory.
- si può rendere in certa misura più agevole quest'operazione
sfruttando la tendenza degli accessi successivi ad essere
indirizzati verso i file presenti nella stessa directory.
- una volta stabilito il percorso per arrivare ad una directory
specifica attraverso la struttura ad albero, si può designare
quella directory come directory corrente:
- diviene così necessario, per i successivi riferimenti ai file, specificare solamente il nome proprio del file desiderato.
- si effettua il cambiamento di directory corrente specificando il nome completo del file.
- una volta stabilito il percorso per arrivare ad una directory
specifica attraverso la struttura ad albero, si può designare
quella directory come directory corrente:
- si può rendere in certa misura più agevole quest'operazione
sfruttando la tendenza degli accessi successivi ad essere
indirizzati verso i file presenti nella stessa directory.
- questa tecnica è impiegata su UNIX e nel MULTICS (Daley e Neumann, 1965)
- si può prevedere una misura di sicurezza immediata dividendo la
directory in due livelli
- mapping
- condivisione e sicurezza
- il proprietario di un file deve essere in grado di specificare
di quale tipo di accesso privilegiato possono disporre gli altri
utenti:
- modalità gerarchica per classi di utenza, è un modo semplice
per realizzare questo obiettivo che consiste nell'associare a
ciascun file un insieme di accessi privilegiati validi per le varie
classi di utenza
- le classi di utenza potrebbero essere suddivise in:
- 1. il proprietario
- 2. il gruppo
- 3. gli altri
- mentre gli accessi privilegiati comunemente sono i seguenti:
- nessun accesso (N)
- solo esecuzione (E)
- solo lettura (R)
- solo append (A)
- aggiornamento (U)
- cambiamento di protezione (P)
- cancellazione (D)
- ciascun accesso privilegiato solitamente implica anche l'assegnazione di quelli ad esso precedenti.
- una tipica chiave di protezione assegnata dal proprietario al
momento della creazione di un file potrebbe essere DAR
- indicante che il proprietario può fare qualunque operazione, il gruppo solamente quella di append e tutti gli altri la sola lettura.
- la chiave di protezione del file risiede nella UFD del
proprietario e fa parte delle informazioni relative a quel file
specifico.
- in alcuni casi può risultare pratico per il proprietario
concedere solo un accesso di basso privilegio anche a se stesso, al
fine di tutelarsi dai propri errori.
- ciò nonostante, il file system deve sempre permettere di poter cambiare il livello di privilegio al proprietario che, altrimenti, non avrebbe modo di modificare o cancellare i suoi file
- in alcuni casi può risultare pratico per il proprietario
concedere solo un accesso di basso privilegio anche a se stesso, al
fine di tutelarsi dai propri errori.
- questo metodo rende necessario che il proprietario elenchi
nella propria UFD quegli utenti designati come soci e questo elenco
deve essere verificato per tutti gli accessi, tranne che nel caso
del proprietario stesso.
- in alcuni sistemi è possibile evitare quest'operazione
definendo i soci in modo implicito:
- l'identificazione tramite cui è noto al sistema il proprietario
può venire strutturata in modo che il suo primo elemento indichi la
condivisione da parte del gruppo ed il secondo l'identità del
singolo utente.
- per esempio, sul DEC System-10 l'identificazione dell'utente è formata dalla coppia (numero progetto, numero utente) e si presume che tutti gli utenti con identico numero di progetto siano soci, per quanto riguarda le modalità d'accesso ai file.
- chiaramente questa tecnica risulta inadeguata quando per file diversi sono necessari diversi gruppi di soci che si sovrappongono
- l'identificazione tramite cui è noto al sistema il proprietario
può venire strutturata in modo che il suo primo elemento indichi la
condivisione da parte del gruppo ed il secondo l'identità del
singolo utente.
- in alcuni sistemi è possibile evitare quest'operazione
definendo i soci in modo implicito:
- è stato sviluppato inizialmente verso la metà degli anni '60
per l'Atlas 2, che possedeva sette diversi accessi privilegiati e
quattro classi di utenza (i soci venivano definiti in modo
esplicito dall'utente)
- ora viene impiegato in svariati sistemi, come il DEC System-10, il quale ha otto accessi privilegiati e tre classi di utenza, con i soci definiti in modo implicito
- le classi di utenza potrebbero essere suddivise in:
- una metodica più generica, in grado di superare le limitazioni
di tipo gerarchico delle classi di utenza, consiste nel far
elencare dal proprietario delta UFD tutti coloro cui ha assegnato
determinati accessi privilegiati, assieme ad una specifica relativa
al tipo di privilegi concessi.
- se una singola lista viene associata ad un'intera UFD, i privilegi accordati sono necessariamente identici per tutti i file;
- alternativamente, si possono associare liste distinte ad ogni
voce della UFD, così da poter concedere diversi privilegi a gruppi
differenti di utenza per file diversi.
- nota: le liste possono occupare una quantità considerevole di spazio, per cui forse non si dovrebbe usare tale metodo se non quando l'aumento di elasticità del sistema si rivela indispensabile.
- una variante di questa tecnica, impiegata nel MULTICS (Daley e
Neumann, 1965), è quella in cui il proprietario concede agli altri
utenti di creare, nell'ambito dette relative UFD, dei link con le
voci della sua UFD.
- questo link consente all'utente di accedere al file corrispondente che appartiene al proprietario.
- l'UFD di quest'ultimo conterrà una lista con tutti gli utenti cui egli concede l'effettuazione dei link.
- il notevole svantaggio derivante dal metodo consiste nel fatto
che, quando si cancella un file, devono venir cancellati anche
tutti i link ad esso relativi, il che significa che il sistema deve
aver modo di individuarli.
- in alternativa, come nel caso di UNIX, si può gestire un contatore del numero dei Link, cancellando il file solo quando il contatore relativo è a zero.
- modalità gerarchica per classi di utenza, è un modo semplice
per realizzare questo obiettivo che consiste nell'associare a
ciascun file un insieme di accessi privilegiati validi per le varie
classi di utenza
- riassumendo, le tecniche descritte finora offrono varie
soluzioni al problema della condivisione e della sicurezza.
- in linea di massima, tanto più elastico è il metodo adottato, tanto maggiore è lo spazio occupato dalla UFD, con relativo aumento del tempo necessario ad eseguire un accesso
- il proprietario di un file deve essere in grado di specificare
di quale tipo di accesso privilegiato possono disporre gli altri
utenti:
- organizzazione della memoria secondaria
- lo spazio di memoria per i file viene allocato in blocchi di dimensione fissa e, poiché tutti i file sono di dimensione variabile, è necessaria una tecnica dinamica di allocazione, sia per i file che per lo spazio libero
- ci sono vari modi di organizzare i blocchi all'interno di un
file, ne descriviamo tre:
- 1) interconnessione dei blocchi
- nella UFD per ciascun file è presente un puntatore al primo blocco
- all'interno di ogni blocco è presente una word che punta al
blocco successivo, a formare una catena
- quindi l'appesantimento consiste in una word per ogni blocco del file
- svantaggi
- è necessario un vasto numero di accessi al disco per
determinare la fine del file
- può risultare poco pratico se il file va cancellato e lo spazio reso disponibile ad una lista libera
- si può migliorare la situazione aggiungendo ad ogni voce dell'UFD un puntatore anche all'ultimo blocco del file
- l'accesso al file è solo sequenziale, dal primo blocco all'ultimo
- è necessario un vasto numero di accessi al disco per
determinare la fine del file
- 2) mappa del file
- ogni blocco del disco è rappresentato da una word all'interno di una mappa che tiene traccia della situazione
- nella UFD ciascun file è rappresentato da un puntatore alla
posizione della mappa che rappresenta il primo blocco del file
- questa locazione punta a sua volta al blocco del file successivo, e così via
- l'ultimo blocco del file è rappresentato da un puntatore nullo
- l'appesantimento, in termini di spazio occupato, consiste in una word per ogni blocco del file
- svantaggi
- l'accesso al file è necessariamente sequenziale
- si può migliorare la situazione, in caso di cancellazione o ampliamento del file, aggiungendo ad ogni voce dell'UFD un puntatore anche alla posizione della mappa che rappresenta l'ultimo blocco del file
- la mappa del file, essendo molto grande, deve essere
memorizzata su disco, a sua volta sotto forma di file ed essere
riportata in memoria un blocco alla volta, a seconda delle esigenze
- la lettura di un file di N blocchi può rendere necessari N accessi in più al disco per leggere le sezioni più opportune della mappa del file
- l'appesantimento sarà inferiore solo se le posizioni
rappresentanti blocchi consecutivi del file si trovano nello stesso
blocco della mappa del file.
- risulta vantaggioso mantenere il più contiguo possibile lo spazio occupato da ogni file, anziché lasciare che sia frammentato per tutto il disco
- 3) blocchi indice
- un blocco indice è un blocco specializzato, residente su disco,
che contiene svariati puntatori ai singoli blocchi che
costituiscono un file
- file di grosse dimensioni posso richiedere più blocchi indice
- in questo caso vengono organizzati come lista concatenata, l'ultima voce di un blocco indice può essere usata per puntare al blocco indice successivo
- file di grosse dimensioni posso richiedere più blocchi indice
- nell'UFD ogni file sarà rappresentato da un puntatore al primo blocco indice
- vantaggi
- l'accesso al file non è sequenziale, qualsiasi blocco può essere oggetto di accesso casuale semplicemente specificando il nome del file e lo spostamento (offset) relativo sul blocco indice
- è utile in quelle situazioni in cui i file possiedono una struttura interna con elementi cui si deve accedere separatamente
- l'appesantimento in termini di tempo d'accesso al file è
limitato
- il primo accesso richiede la lettura del blocco indice, ma gli accessi successivi non comportano appesantimento, sempre che non siano necessari blocchi indice differenti.
- svantaggi
- l'ampliamento o la cancellazione dei blocchi intermedi di un
file comportano un riassestamento dei puntatori all'interno dei
blocchi indice
- è un'operazione lunga in termini di tempo
- per cui questo metodo di memorizzazione non risulta idoneo per i file soggetti a cambiamenti frequenti
- in media l'appesantimento, in termini di spazio occupato, è
leggermente superiore ad una word a blocco per ciascun file
- per i file più ridotti l'appesantimento è proporzionalmente maggiore rispetto a quelli più estesi
- l'ampliamento o la cancellazione dei blocchi intermedi di un
file comportano un riassestamento dei puntatori all'interno dei
blocchi indice
- un blocco indice è un blocco specializzato, residente su disco,
che contiene svariati puntatori ai singoli blocchi che
costituiscono un file
- 1) interconnessione dei blocchi
- in ognuno dei metodi esposti è possibile contrassegnare la fine
del file con uno speciale indicatore situato all'interno
dell'ultimo blocco, nella posizione più opportuna
- nel caso di file testuali si può stabilire un marcatore di fine file non interpretabile come dato utile (un insieme di bit non interpretabili come carattere noto)
- nel caso di file binari non si riesce a stabilire un marcatore
di fine file in quanto ogni insieme di bit può costituire un dato
utile
- in tal caso è necessario aggiungere l'informazione di fine file
nella relativa voce UFD
- è un'idea valida in ogni caso, poiché fornisce una verifica ulteriore a scanso di manipolazioni improprie dei file
- in tal caso è necessario aggiungere l'informazione di fine file
nella relativa voce UFD
- un sistema operativo può consentire diverse forme di
organizzazione dei blocchi
- laddove risulta probabile che ad alcuni file si acceda sequenzialmente si può scegliere una delle prime due
- mentre in altri si entra in modo non sequenziale e si può scegliere la terza soluzione.
- il tipo di organizzazione può essere specificato dall'utente al momento della creazione di un file, con inoltre un eventuale valore assunto per default da parte del sistema operativo
- gestione dello spazio disponibile
- 1) considero i blocchi disponibili come se a loro volta
costituissero un file, collegandoli tramite una delle tecniche
descritte in precedenza
- se si ricorre alla tecnica del blocco indice
- tutte le operazioni da effettuarsi su una catena formata da spazio libero (cioè l'allocazione e la restituzione dei blocchi disponibili) devono aver luogo in coda alla stessa, in quanto se fossero eseguite al suo inizio sarebbe necessario il riassestamento di un vasto numero di puntatori.
- questo metodo si dimostra svantaggioso per la necessità di dover cancellare o inserire nell'ultimo blocco indice gli N puntatori relativi agli N blocchi eventualmente allocati o resi disponibili.
- se si impiega la tecnica dell'interconnessione dei blocchi o
della mappa del file,
- le operazioni possono aver luogo indifferentemente ad una delle
due estremità della catena
- per esempio, quando vengono reinseriti dei blocchi liberi alla fine di una catena, gli unici due puntatori che devono cambiare sono quello dell'ultimo blocco della vecchia catena al primo blocco aggiunto e quello della directory di sistema alla fine della nuova catena.
- le operazioni possono aver luogo indifferentemente ad una delle
due estremità della catena
- se si ricorre alla tecnica del blocco indice
- 2) impiego di una mappa binaria
- questa mappa è costituita da una zona di memoria in cui ogni bit rappresenta uno dei blocchi su disco.
- se un blocco è libero, il bit corrispondente è settato a zero; se invece il blocco è utilizzato, il bit è settato ad uno.
- per reperire N blocchi liberi è necessario
- ricercare all'interno della mappa binaria i primi N bit uguali a zero
- eseguire quindi un semplice calcolo per ottenere gli indirizzi corrispondenti dei blocchi.
- in determinati contesti, la mappa binaria può risultare troppo
estesa, tanto da non poter essere contenuta in memoria centrale.
- la mappa può quindi essere memorizzata su memoria di massa, tenendone in memoria centrale solo una parte che può essere usata per tutte le allocazioni;
- quando sarà piena (tutti i bit, cioè, saranno ad uno) la si potrà scaricare dalla memoria centrale, ricaricandone un'altra sezione.
- svantaggi
- la restituzione dello spazio disponibile comporta il
reperimento della sezione di mappa corrispondente ai blocchi
restituiti e l'azzeramento dei bit appropriati.
- ciò può causare un movimento intenso nella mappa su disco, che si può ridurre mantenendo una lista di tutti i blocchi restituiti ed utilizzandola per aggiornare la mappa ogni qualvolta ne giunge in memoria centrale una sezione.
- bisogna fare attenzione nell'applicazione di questa tecnica, in modo da evitare che, nell'eventualità di un guasto al disco, lo stato della mappa binaria perda la corrispondenza con lo spazio allocato
- la restituzione dello spazio disponibile comporta il
reperimento della sezione di mappa corrispondente ai blocchi
restituiti e l'azzeramento dei bit appropriati.
- 1) considero i blocchi disponibili come se a loro volta
costituissero un file, collegandoli tramite una delle tecniche
descritte in precedenza
- scelta della dimensione dei blocchi
- in genere la dimensione dei blocchi è determinata dal progettista dell'hardware (fa eccezione l'IBM 370 dove l'utente poteva effettuare scelte distinte per ogni file)
- i criteri che guidano la scelta sono
- lo spazio sprecato a causa del mancato riempimento di alcuni
blocchi
- aumenta di pari passo con l'aumentare della dimensione degli stessi
- lo spazio sprecato per via dei puntatori della catena
- che devono essere tanto più numerosi quanto minore è la dimensione dei blocchi
- l'unità impiegata dal supporto di informazione per il
trasferimento di dati in memoria centrale
- la dimensione dei blocchi dovrebbe essere un multiplo di questa unità, così da utilizzare appieno ogni trasferimento di dati;
- lo spazio di memoria necessario per ogni operazione di lettura
o scrittura su file.
- a seconda della modalità di organizzazione del disco, può risultare necessario reperire spazio in memoria per il blocco indice in uso, ovvero per il blocco contenente la mappa del file in uso, nonché il blocco oggetto di lettura o scrittura
- lo spazio sprecato a causa del mancato riempimento di alcuni
blocchi
- le dimensioni caratteristiche dei blocchi sono comprese tra 512 e 4096 byte
- strategie di allocazione dei blocchi
- variano dalle più lineari
- impiego del primo blocco presente nella catena dello spazio disponibile o del blocco della mappa binaria
- alle più sofisticate
- impiego del blocco che rende minima l'entità del movimento della testina sul disco durante la lettura del file
- l'appesantimento in termini di tempo di ricerca, nel corso
della lettura di un file i cui blocchi sono distribuiti per tutto
il disco, può rivelarsi notevole e portare alla saturazione del
canale del drive.
- si può ridurre questo problema tramite il ricorso alla
strategia suesposta oppure sottoponendo periodicamente la lista dei
file al concatenamento del numero più alto possibile di file.
- quest'ultima tecnica può essere incorporata nelle procedure di salvataggio
- si può ridurre questo problema tramite il ricorso alla
strategia suesposta oppure sottoponendo periodicamente la lista dei
file al concatenamento del numero più alto possibile di file.
- variano dalle più lineari
- integrità del file system
- è indispensabile che un file system preveda gli opportuni
meccanismi per il salvataggio ed il recupero dei dati nella non
improbabile evenienza di un malfunzionamento dell'hardware o del
software
- sistema deve conservare copie di tutti i file in modo da poterli ripristinare successivamente al verificarsi di un inconveniente
- esistono due modi per fare la copia di un file
- 1) dump periodico (o massiccio)
- è il metodo più semplice
- ad intervalli prestabiliti, l'intera memoria d'archivio viene copiata su qualche supporto, solitamente un nastro magnetico
- nel caso di malfunzionamento tutti i file possono essere ricreati nello stesso stato in cui erano scritti al momento del dump.
- file singoli inavvertitamente cancellati possono essere ripristinati a prezzo di esaminare l'intero nastro del dump.
- svantaggi
- può essere necessario mettere fuori uso il file system durante il dump (l'alternativa consiste nel non sottoporre a dump quei file eventualmente aperti ed in corso di scrittura);
- di solito il dump impiega molto tempo (da 20 minuti a 2 ore, a
seconda delle dimensioni del sistema e della velocità delle unità
nastro)
- ciò significa che non lo si può effettuare molto spesso e che, pertanto, un fiLe ripristinato potrebbe facilmente risultare non più aggiornato
- 2) incrementale (Fraser, 1969)
- si fa il dump solamente di quelle informazioni che sono state modificate dopo il dump precedente.
- ciò significa che in ogni operazione sono soggetti a dump solo i file che sono stati creati o modificati e gli elementi delle directory che sono stati parimenti cambiati.
- l'entità ditali informazioni sarà limitata e quindi il dump può essere effettuato ad intervalli più frequenti.
- per determinare quali file ricopiare, viene settato a 1 un flag
nell'elemento della directory relativo a ciascuno dei file, ogni
volta che questi ultimi vengono modificati
- il flag viene poi azzerato in seguito al dump.
- affinché il processo di dump non debba esaminare tutte le voci della directory, in ogni UFD si può usare un flag globale che indichi se sono stati eventualmente settati a 1 dei singoli flag all'interno della UFD in questione
- poiché il processo di dump non prende in considerazione i file
i cui flag non sono settati a 1, includendo quindi tutti i file in
corso di aggiornamento, può essere eseguito parallelamente alle
normali attività.
- è anche possibile, come avviene nel MULTICS, che il processo di dump abbia una priorità bassa e sia sempre presente in macchina, alla continua ricerca entro la directory di file aggiornati.
- svantaggi
- viene generata una grande quantità di dati
- la procedura di recupero è molto complessa
- le informazioni devono essere ricostruite dalla sequenza di eventi registrata sui nastri di dump.
- i nastri vengono montati in ordine cronologico inverso ed il
file system viene ripristinato così com'era al momento dello
svolgimento dell'ultimo dump periodico.
- i dump periodici saranno effettuati ad intervalli di tempo non frequenti, solitamente una volta alla settimana
- durante questo procedimento, il processo di ripristino preleva dai nastri di dump solo quei file che non sono già stati ripristinati, cosicché quelli più recenti non vengono soppiantati dalle loro versioni precedenti.
- infine viene usato l'ultimo nastro di dump periodico per completare l'operazione di recupero.
- questo modo di procedere è migliore rispetto a quello inverso,
consistente nell'avviare il nastro di dump periodico a partire
dalla prima operazione registrata in ordine di tempo
- in quanto non vengono ripristinate le informazioni ridondanti.
- 1) dump periodico (o massiccio)
- qualsiasi metodo di dump si impieghi, il recupero del sistema
rappresenta una buona occasione per compattare i file in blocchi
contigui.
- così facendo si diminuisce l'appesantimento relativo all'accesso ai file, a scapito di un lieve prolungamento della procedura di ripristino
- è indispensabile che un file system preveda gli opportuni
meccanismi per il salvataggio ed il recupero dei dati nella non
improbabile evenienza di un malfunzionamento dell'hardware o del
software
- apertura e chiusura dei file
- apertura del file
- avviene quando si associa lo stream di I/O di una periferica ad un file
- il sistema operativo deve cercare la periferica e la locazione in cui è memorizzato il file
- l'implementazione richiede una procedura del sistema operativo,
della forma
- open (filename, modo)
- modo indica il tipo di accesso al file
- sola lettura
- sola scrittura
- creazione, ...
- le operazioni svolte da open sono:
- 1) trova il riferimento del file nella directory;
- 2) verifica che il processo chiamante sia stato attivato da un utente con i privilegi necessari per l'accesso nel modo specificato;
- 3) effettua controlli per assicurare che
- se il file è già aperto in lettura (eventualmente da parte di un altro processo), non si possa ora aprire per scrivervi
- se è già aperto in scrittura, non si possa aprire affatto
- 4) specifica la periferica e la locazione in cui è memorizzato
il file
- se il file deve essere creato ex novo, la locazione viene specificata dalla routine di allocazione
- 5) crea un descrittore di file contenente tutte le informazioni
sul file inerenti i prossimi trasferimenti di dati
- il descrittore di file viene utilizzato dalle procedure di I/O quale fonte di informazioni per la costruzione delle richieste di I/O, rendendo così superfluo il passaggio attraverso la procedura di apertura per ogni trasferimento di dati che interessa il file
- Le informazioni necessarie nel descrittore di file comprendono:
- il nome del file;
- l'indirizzo del descrittore relativo alla periferica in cui è memorizzato il file;
- la locazione del primo blocco del file;
- la locazione del blocco successivo da leggere o scrivere (nell'ipotesi che l'accesso sia sequenziale);
- il modo d'accesso
- il descrittore di file viene individuato tramite un puntatore del relativo descrittore di stream inerente al processo che ha aperto il file
- chiusura del file
- è l'operazione inversa all'apertura del file
- può essere svolta esplicitamente
- quanto è stato completato tutto l'I/O relativo al file
- oppure implicitamente
- quando termina il processo che fa uso del file
- l'implementazione richiede una procedura del sistema operativo,
della forma
- close (filename)
- i meccanismi di lettura/scrittura, citati al punto (3) della
descrizione di open, si possono implementare includendo fra le
informazioni delle directory relative a ciascun file due elementi
aggiuntivi:
- 1) "write bit" (bit di scrittura)
- viene settato a 1 ogniqualvolta si apre il file per scopi di scrittura;
- 2) "use count" (conteggio di utilizzo)
- è relativo al numero dei processi che dispongono del file aperto per fini di lettura.
- un processo può aprire un file per la sola lettura se il write bit è uguale a zero e lo può aprire per la sola scrittura se sia il write bit che lo use count sono a zero.
- purtroppo, questa tecnica presenta un problema, in quanto più
processi potrebbero voler aprire o chiudere lo stesso file
contemporaneamente, apportando così cambiamenti simultanei alla
relativa voce nella directory.
- è possibile superare questa situazione effettuando la stesura
delle procedure di open e close sotto forma di sezioni critiche,
ciascuna racchiusa dallo stesso semaforo di mutua esclusione
- (svantaggio) se un processo viene interrotto mentre apre o chiude un file, queste operazioni non sono più disponibili per nessun altro processo.
- un metodo alternativo consiste nel formare una lista dei
descrittori di tutti i file che sono aperti su ogni specifica
periferica
- la lista può essere collegata tramite un puntatore del descrittore della periferica interessata.
- quando si deve aprire un file, la procedura di open controlla
la lista per vedere se eventualmente esistono già descrittori per
il file e, in caso affermativo, qual è il modo d'accesso da essi
indicato.
- la procedura non consente l'apertura del file, a meno che non siano soddisfatte le limitazioni di lettura/scrittura.
- si può impiegare un semaforo di mutua esclusione per proteggere la lista dall'accesso contemporaneo di quei processi che vogliono aprire o chiudere lo stesso file nello stesso momento.
- (svantaggio)il tempo necessario a controllare la lista, nei
sistemi ad accesso multiplo, può essere considerevole
- la lista può facilmente contenere un centinaio di descrittori
- il tempo diventa un fattore particolarmente critico, in quanto la lista può essere sottoposta a verifica da un solo processo per volta e, nel caso il processo in questione venisse interrotto, questa diverrebbe inaccessibile per gli altri processi.
- una soluzione parziale di questi problemi consiste nel dividere
ogni descrittore dì file in due strutture distinte:
- un descrittore centrale di file per ogni file aperto
- i descrittori centrali sono collegati con gli opportuni descrittori di periferica
- contiene informazioni identiche per tutti i processi che usano
il file:
- nome del file;
- indirizzo del descrittore della periferica in cui è memorizzato il file;
- locazione del primo blocco del file;
- use count del file;
- write bit del file.
- un descrittore locale di file per ogni processo che utilizza un
file
- viene creato ogni qualvolta un processo apre un file
- tutti i descrittori locali di un determinato file puntano all'unico descrittore centrale relativo al file in questione.
- contiene informazioni pertinenti al processo che fa uso del
file:
- la locazione del blocco successivo da leggere o scrivere;
- il modo d'accesso;
- nonché un puntatore rivolto al descrittore centrale di file.
- l'introduzione dei descrittori centrali di file
- elimina la doppia memorizzazione delle informazioni in descrittori separati
- diminuisce la lunghezza della lista dei descrittori per ogni periferica.
- diminuisce l'entità dell'attività svolta dalle procedure di open e close inerente la ricerca all'interno della lista dei descrittori
- consente di applicare la mutua esclusione singolarmente a ciascun processo, anziché alla lista nel complesso, evitando così il rischio riguardante il verificarsi di strozzature con conseguente caduta dell'efficienza del sistema (bottleneck)
- Il semaforo di mutua esclusione può essere contenuto nel descrittore centrale di ciascun file.
- un descrittore centrale di file per ogni file aperto
- una variante di questa tecnica (Courtois et al., 1971)consiste
nel sostituire il write bit del descrittore centrale di file con un
altro semaforo w.
- le procedure di open e close quindi vengono redatte in modo da
includervi i seguenti segmenti di codifica
- Open
- if modo = read then
- begin wait (mutex);
- usecount:=usecount + 1;
- if usecount I then wait (w);
- signal (mutex)
- end
- begin wait (mutex);
- else wait (w)
- if modo = read then
- Close
- if modo = read then
- begin wait (mutex);
- usecount:=usecount - 1;
- if usecount = O then signal (w);
- signal (mutex)
- end
- begin wait (mutex);
- else signal (w)
- if modo = read then
- Open
- in questa variante, le richieste d'accesso respinte vengono implicitamente inserite nella coda d'attesa al semaforo w, mentre nella versione originaria il progettista di sistema conserva la facoltà di mettere o meno in coda le richieste, in base all'applicazione
- il funzionamento della procedura close è relativamente
semplice.
- si cancella il descrittore locale di file
- si effettua il decremento dello use count del descrittore
centrale.
- se lo use count è uguale a zero, viene cancellato anche il descrittore centrale e si aggiorna la directory conformemente alle necessità del caso (se, per esempio, il file è appena stato creato).
- la cancellazione di un file può essere gestita come una chiamata della open con un parametro modo opportuno.
- si presenta comunque lo svantaggio che, se il file è già
aperto, come spesso avviene per i file di libreria, la richiesta di
cancellazione viene respinta.
- tutto ciò rende alquanto problematica la sostituzione dei file di libreria
- un modo per aggirare il problema consiste nell'inserire in ogni descrittore centrale di file un "delete pending bit" (bit di cancellazione pendente) che viene settato ogniqualvolta viene effettuata una richiesta di cancellazione per un file aperto.
- la procedura di close verifica lo stato di questo bit:
- se è settato a 1 e lo use count va a zero, si può cancellare il file.
- la cancellazione viene accelerata se la open respinge una richiesta d'accesso ad un file il cui bit di cancellazione pendente è settato a 1.
- le procedure di open e close quindi vengono redatte in modo da
includervi i seguenti segmenti di codifica
- è possibile superare questa situazione effettuando la stesura
delle procedure di open e close sotto forma di sezioni critiche,
ciascuna racchiusa dallo stesso semaforo di mutua esclusione
- 1) "write bit" (bit di scrittura)
- apertura del file
- conclusioni
- in questo capitolo abbiamo trattato vari aspetti dei file system per applicazioni universali.
- il passo successivo nella costruzione del nostro sistema operativo ipotetico consiste nell'adozione di un sistema particolare basato sulle tecniche che abbiamo descritto.
- otterremo così un altro strato da aggiungere alla nostra "cipolla", costituito dalla codifica per l'implementazione di particolari meccanismi volti a garantire protezione ed integrità e finalizzati anche ad amministrare lo spazio disponibile e ad aprire e chiudere i file.
- le ulteriori strutture dati permanenti sono le directory ed una qualsiasi struttura che serve per registrare l'allocazione dello spazio di memoria.
- invece, le strutture dati temporanee esistenti solo mentre è aperto un file sono costituite dai descrittori locali e centrali di file.