Corso di Sistemi Operativi

Funzioni di un SO: gestione della memoria secondaria e dell’I/O

 

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 l’elevata 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 è l’implementazione 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 l’indirizzo del primo blocco e la dimensione dei dati) e l’accesso alle informazioni è più efficiente, perché è possibile leggere l’intero 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.

Quest’ultimo 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 un’allocazione 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 all’allocazione contigua, rallenta l’accesso ai file.
Un ulteriore metodo per tenere traccia dei blocchi appartenenti ad un file consiste nell’associare 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 un’altra utile funzione dei SO, la gestione dell’I/O, il cui scopo è quello di nascondere sia all’utente 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 dall’hardware;
- presentazione di un’interfaccia 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 l’accesso 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