Nelle scorse puntate abbiamo visto che, per rendere possibile
la multiprogrammazione e il timesharing, si ricorre ad una gestione
della memoria principale che utilizza intensamente la memoria secondaria,
con continui spostamenti di dati e programmi da e verso lo swap
device.
Data lelevata frequenza con cui viene richiesto questo trasferimento
di informazioni, per gestire efficacemente un ambiente di questo
tipo, un SO deve offrire prestazioni elevate, riducendo al minimo
il sovraccarico (overhead) dovuto a queste operazioni.
Per ottimizzare questi meccanismi, il SO deve fornire le seguenti
funzionalità:
- tener conto dello spazio occupato sul disco e di quello inutilizzato;
- allocare spazio ai processi che lo richiedono e deallocarlo quando
può essere liberato;
- schedulare le operazioni del disco rispetto a più richieste provenienti
da processi utente e di sistema.
Un problema interessante che caratterizza fortemente un sistema
è limplementazione del file system, cioè il modo in cui vengono
memorizzati file e directory, e in particolare come vengono associati
i blocchi di disco a ciascun file.
Il più semplice schema di allocazione prevede che ogni file sia
costituito da blocchi contigui di dati sul disco.
In questo modo è più semplice tenere traccia della collocazione
dei blocchi relativi ad un file (basta memorizzare lindirizzo
del primo blocco e la dimensione dei dati) e laccesso alle
informazioni è più efficiente, perché è possibile leggere lintero
file con una sola operazione.
Tuttavia non è realizzabile, perché difficilmente si conosce a priori
la grandezza massima di ogni file; inoltre porta ad una frammentazione
del disco, dovuta allo spreco di spazio che potrebbe essere utilizzato
altrimenti.
Questultimo problema potrebbe risolversi con la compattazione,
o deframmentazione, che risulta spesso proibitivamente lunga
e costosa (in termini di risorse di sistema).
Le soluzioni più diffuse ricorrono ad unallocazione a lista
concatenata, in cui i blocchi associati ad un file sono sparpagliati
nel disco.
Ogni blocco può contenere un puntatore al blocco successivo, oppure
si può ricorrere ad una tabella, chiamata FAT (file allocation
table) che contiene, in ordine, i puntatori ai blocchi di disco
costituenti il file e che deve essere costantemente mantenuta in
memoria.
Utilizzare una lista concatenata di blocchi permette di non perdere
spazio a causa della frammentazione del disco, ma, rispetto allallocazione
contigua, rallenta laccesso ai file.
Un ulteriore metodo per tenere traccia dei blocchi appartenenti
ad un file consiste nellassociare a ogni file una piccola
tabella, detta i-node, che elenca gli attributi e gli indirizzi
dei blocchi del file.
Questo schema, utilizzato in UNIX e nei suoi derivati,
è molto flessibile e consente di avere una frammentazione del disco
praticamente nulla.
Accenniamo adesso ad unaltra utile funzione dei SO, la gestione
dellI/O, il cui scopo è quello di nascondere sia allutente
che al sistema, le caratteristiche dei dispositivi di input/output.
Nel sottositema di I/O possiamo trovare essenzialmente tre elementi:
- gestione della memoria, per ottimizzare gli scambi di informazioni
tra la memoria centrale e i dispositivi;
- una collezione di driver associati ai vari dispositivi del sistema,
contenenti tutte le caratteristiche che dipendono dallhardware;
- presentazione di uninterfaccia generica, che permette ai
programmatori di utilizzare in maniera uniforme i driver dei dispositivi.
Una caratteristica molto importante dei sistemi UNIX, che vale
la pena di citare, è il buffer cache, una particolare
soluzione adottata per ottimizzare laccesso al disco, che
utilizza la memoria principale come una cache per aumentare
le prestazioni di I/O.
Infatti, ogni blocco di disco che deve essere letto e/o scritto
viene prima caricato in questa struttura, che viene utilizzata direttamente
dai processi in modo da non dover ricorrere al disco ogni qualvolta
occorre accedere a quel blocco.
Poiché la memoria principale è molto più veloce dei dischi, il buffer
cache produce un sostanziale miglioramento delle prestazioni, riducendo
le operazioni di I/O solo al momento in cui sono necessarie.
Torna all'indice Generale del corso di Corso di Sistemi Operativi di Software Planet