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
- Le funzioni di un sistema operativo
- consideriamo ai nostri scopi una macchina base
- unità centrale
- memoria
- varie unità periferiche
- sequenza in un sistema batch a cura dell'operatore
- 1. sistemare il programma sorgente nel dispositivo di input;
- 2. avviare un programma per la lettura delle istruzioni;
- 3. avviare un compilatore per compilare il programma sorgente;
- 4. avviare l'esecuzione del programma compilato;
- 5. introdurre i dati nell'unità di input;
- 6. ritirare i risultati ottenuti dalla stampante di linea.
- La sequenza batch dipendente da un operatore è poco
performante:
- un primo miglioramento lo si ottiene si che la macchina svolga
automaticamente l'intera sequenza.
- il ruolo svolto dall'operatore viene limitato da un lato all'avvio di un programma di lettura ed, all'altro, a staccare fogli di carta.
- per far funzionare il tutto occorre dedicare parte della macchina ad un programma in grado di portare a termine le operazioni necessarie per ordinare i job in sequenza.
- non tutti i job hanno bisogno delle stesse operazioni di
ordinamento sequenziale (per alcuni job può essere superflua la
compilazione) il programma di controllo deve essere in grado di
dedurre da una o più istruzioni di controllo esattamente quali sono
le operazioni da svolgere per ogni caso specifico.
- In altri termini, il programma di controllo deve essere in grado di interpretare un job control language.
- non si può lasciare che gli eventuali errori influiscano su Job successivi e quindi il programma di controllo deve assumersi il compito di gestire gli errori razionalmente.
- Un programma di controllo con queste caratteristiche in realtà è un sistema operativo in nuce
- Un secondo miglioramento consiste nel ridurre la dipendenza dei
job dagli I/O
- il primo metodo con cui si ottenne questo risultato fu
l'off-lining
- tramite il quale tutte le operazioni di input ed output
avvenivano per mezzo di nastri magnetici (il mezzo di
memorizzazione più veloce dell'epoca
- un computer ausiliario provvedeva a passare i dati dai nastri magnetici ad altri mezzi di memorizzazione e viceversa
- il trasferimento dei nastri magnetici tra il computer centrale e l'ausiliario avveniva manualmente
- questo metodo fu usato negli anni '50 e '60
- affinchè tutto funzioni al sistema operativo in nuce si è dovuto aggiungere una serie di routine per codificare ed immagazzinare su nastro magnetico dei dati che, in ultima istanza, erano destinati ad una qualche altra unità periferica (e, per contro, sotto forma di input)
- tramite il quale tutte le operazioni di input ed output
avvenivano per mezzo di nastri magnetici (il mezzo di
memorizzazione più veloce dell'epoca
- il primo metodo con cui si ottenne questo risultato fu
l'off-lining
- il terzo miglioramento consiste nell'eliminare la dipendenza
dei Job dagli I/O
- occorre poter sovrapporre le operazioni di I/O all'elaborazione
- a tale scopo si aggiungono du componenti hardware:
- canale
- dispositivo che controlla una o più unità periferiche e che esegue i trasferimenti di dati tra queste ultime e la memoria in modo del tutto autonomo rispetto all'unità centrale di elaborazione
- interrupt
- segnale che trasferisce il controllo dell'unità centrale d'elaborazione ad una locazione fissa, memorizzando al contempo il valore precedente relativo al contatore di programma, in modo che possa essere ripreso
- canale
- Adesso è possibile per l'unità centrale di elaborazione iniziare un trasferimento tra unità periferiche, continuare l'elaborazione mentre il canale controlla il trasferimento e ricevere un segnale d'interrupt, quando il trasferimento è completo.
- il quarto miglioramento si ottiene aggiungendo una routine che
gestisce gli interrupt e una schedulazione (scheduler)
- lo scheduler decide quale è il prossimo job da mandare in
esecuzione
- è resa possibile dall'impiego dell'hard-disk, dispositivo ad accesso casuale
- sarebbe stata impossibile con l'uso di dispositivi seriali come i nastri
- Un sistema operante in questo modo viene definito single stream
batch monitor
- dove "single stream" (flusso singolo) sta ad indicare che viene eseguito un solo job per volta.
- Tali sistemi erano preponderanti verso la metà degli anni '60.
- lo scheduler decide quale è il prossimo job da mandare in
esecuzione
- il quinto miglioramento, la multiprogrammazione
- consente di eseguire parecchi job nella stessa macchina contemporaneamente
- L'idea di fondo consiste nel tenere in memoria svariati
programmi simultaneamente, mentre il processore centrale suddivide
tra di essi il proprio tempo disponibile in base alle risorse
(quali, ad esempio, i canali o le periferiche) necessarie a
ciascuno di essi in ogni dato istante.
- in tal modo è possibile ottenere un'utilizzazione ottimale delle risorse
- L'onere aggiuntivo che grava sul sistema operativo è il
controllo delle risorse e la protezione di un lavoro dalle attività
relative ad un altro.
- Un sistema operativo di questo tipo viene definito multi-stream
batch monitor
- in alcune versioni è ampiamente presente in tutti i grossi elaboratori dei primi anni settanta.
- La realizzazione di questi sistemi deve molto al lavoro d'avanguardia svolto all'inizio degli anni sessanta sul calcolatore Atlas presso l'Università di Manchester
- Un sistema operativo di questo tipo viene definito multi-stream
batch monitor
- un primo miglioramento lo si ottiene si che la macchina svolga
automaticamente l'intera sequenza.
- La discussione precedente ci ha portati verso un sistema
operativo che deve almeno eseguire le seguenti funzioni:
- 1) pianificazione del job;
- 2) interpretazione del job control language;
- 3) gestione degli errori;
- 4) gestione dell'I/O;
- 5) gestione degli interrupt;
- 6) schedulazione;
- 7) controllo delle risorse;
- 8) protezione;
- 9) accesso multiplo.
- Inoltre, il sistema operativo dovrebbe risultare semplice da
usare e amministrare:
- 10) disponibilità di una buona interfaccia con l'operatore;
- 11) contabilizzazione delle risorse di calcolo.
- consideriamo ai nostri scopi una macchina base
- Caratteristiche essenziali di un sistema operativo
- Concorrenza
- La concorrenza dipende dall'esistenza di parecchie attività simultanee, o parallele.
- Esempi sono la sovrapposizione delle operazioni di I/O con quelle di calcolo e la copresenza in memoria di svariati programmi applicativi.
- La concorrenza porta con sé il problema di passare dall'una all'altra attività, di proteggere l'una dagli effetti dell'altra e di sincronizzare le attività che sono in rapporto di dipendenza reciproca.
- Condivisione
- Può risultare necessario che le attività concorrenti
condividano risorse o informazioni, essenzialmente per quattro
ordini di motivi:
- a) Il costo
- risulta eccessivamente oneroso fornire separatamente risorse sufficienti per tutti gli utenti.
- b) Valorizzazione del lavoro altrui
- è utile poter impiegare i programmi e le routine di altri.
- c) Condivisione dei dati
- può risultare necessario utilizzare lo stesso data base per svariati programmi differenti, se possibile operativi per svariati utenti distinti.
- d) Eliminazione del superfluo
- è economicamente conveniente condividere un'unica copia di un programma (per esempio, un compilatore) tra parecchi utenti, anzichè dover fornire una copia distinta per ciascun utente.
- a) Il costo
- I problemi connessi con la condivisione sono l'allocazione delle risorse, l'accesso simultaneo ai dati, l'esecuzione simultanea di programmi e la protezione dalla contaminazione degli errori altrui.
- Può risultare necessario che le attività concorrenti
condividano risorse o informazioni, essenzialmente per quattro
ordini di motivi:
- Memorizzazione a lungo termine
- L'esigenza di condividere programmi e dati porta con sé anche la necessità di memorizzare le informazioni a lungo termine.
- Ciò consente, inoltre, all'utente di sfruttare la comodità di tenere i propri programmi o i propri dati nell'elaboratore, anzichè dover ricorrere ad un qualche supporto esterno (per esempio, schede).
- I problemi che sorgono riguardano l'accesso facile, la protezione dalle ingerenze altrui (intenzionali o di altra natura) e la protezione da eventuali gravi malfunzionamenti del sistema.
- Determinatezza
- mettendo in macchina lo stesso programma, oggi o domani, a parità di dati si dovrebbero ottenere i medesimi risultati.
- D'altro canto il contesto è indeterminato, in quanto deve far
fronte ad avvenimenti che si succederanno in un ordine
imprevedibile.
- richieste di assegnazione di risorse, errori nella fase esecutiva dei programmi ed interrupt provenienti da unità periferiche.
- A causa dell'enorme numero di evenienze fortuite che possono aver luogo, non è ragionevole pensare di poter scrivere il sistema operativo in modo tale che provveda a tutte singolarmente;
- al contrario, si deve scrivere il sistema così da gestire qualsiasi successione di eventi.
- Vale la pena mettere in rilievo che nessuna di queste
caratteristiche è specifica dei soli sistemi universali.
- Ad esempio, la capacità di mantenere in memoria dati a lungo termine è chiaramente necessaria anche per i sistemi a consultazione di file, mentre la concorrenza è una delle caratteristiche primarie dei sistemi per il trattamento delle transazioni.
- Concorrenza
- Requisiti auspicabili in un sistema operativo
- Efficienza
- E' difficile valutarla, a tal scopo esistono vari criteri:
- a) tempo medio intercorrente tra i job;
- b) tempo di CPU non utilizzato;
- c) tempo d'esecuzione per i job di tipo batch;
- d) tempo di risposta (nei sistemi ad accesso multiplo);
- e) utilizzazione delle risorse;
- f) produttività (numero di job all'ora).
- Non è purtroppo possibile soddisfare tutti questi criteri contemporaneamente.
- E' difficile valutarla, a tal scopo esistono vari criteri:
- Affidabilità
- In linea di principio, un sistema operativo dovrebbe essere totalmente privo d'errori e dovrebbe essere in grado di gestire tutti gli eventi.
- Nella pratica questo non avviene mai anche se sono stati fatti progressi notevoli in questa direzione.
- Facilità di manutenzione
- Dovrebbe risultare possibile effettuare interventi di manutenzione su un sistema operativo (sia migliorandolo, che correggendone gli errori) senza dover impiegare un esercito di sistemisti.
- Da qui deriva la necessità che il sistema presenti una costruzione modulare, con interfacce tra i moduli chiaramente definite, e che sia dotato di una documentazione esauriente.
- Dimensioni ridotte
- Lo spazio utilizzato per contenere il sistema operativo, sia esso in memoria centrale che su memoria di massa, è sprecato per quanto riguarda le attività di calcolo produttive.
- Inoltre, rispetto ad un sistema di dimensioni ridotte, in uno più voluminoso tendono maggiormente a verificarsi situazioni d'errore ed, ovviamente, ci vuole più tempo per scriverlo.
- Efficienza