Sistemi operativi/Evoluzione dei sistemi operativi: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 211:
 
Inizialmente c'erano solo due tipi di chiamate di sistema, una per l'ingresso e una per l'uscita; ma in seguito, man mano che i sistemi diventavano più complessi, sono stati aggiunti numerosi altri tipi.
 
 
 
 
Con l'uso di un sistema operativo, l'elaboratore è utilizzato da almeno due utenti simultanei: l'operatore di sistema, che ''utilizza'' il sistema operativo per far funzionare in modo efficiente l'elaboratore; e l'utente finale/programmatore, che ha consegnato all'operatore il programma applicativo e i dati, che utilizza il programma applicativo per elaborare i propri dati.
Nei sistemi multiprogrammati ci possono essere altri utenti simultanei.
 
Se un programma contiene degli errori o comunque degli algoritmi che usano le risorse in modo non economicamente conveniente (per esempio, impiegano dei minuti per eseguire un calcolo che potrebbe essere eseguito in pochi secondi), danneggia gli altri utenti.
Siccome i programmi applicativi spesso contengono difetti, un sistema di elaborazione dati multiutente deve impedire ai programmi applicativi tali comportamenti devianti e dannosi.
 
Il problema non si presenta per i difetti che può avere il sistema operativo stesso, in quanto, se il sistema operativo genera un malfunzionamento, comunque il funzionamento del software applicativo è compromesso.
 
Quindi un obiettivo del sistema operativo è fare in modo che qualunque comportamento possa avere un programma applicativo, questo non possa danneggiare l'esecuzione del sistema operativo stesso e di altri programmi in esecuzione simultanea o che verranno eseguiti in seguito.
Questo era semplicemente impossibile nei primi computer negli anni '50 e nei primi microprocessori (quelli a 8 bit).
 
Per renderlo possibile sono state apportate modifiche all'hardware dei computer.
Tali accorgimenti tecnici prendono il nome di "protezione hardware".
 
La protezione hardware è quindi l'insieme dei dispositivi elettronici che permettono al sistema operativo di assicurare che un programma applicativo non possa eseguire operazioni che danneggino l'esecuzione di altri programmi.
 
La protezione hardware dei primi sistemi operativi si basava essenzialmente su tre concetti: il registro base, il timer, e la modalità del processore.
 
Il registro base contiene l'indirizzo di memoria a partire dal quale viene caricato il programma applicativo.
Le posizioni di memoria che precedono tale indirizzo sono quelle che contengono codice e dati del sistema operativo.
 
Tutte le volte che il processore emette un indirizzo sul bus indirizzi, per leggere un dato, per scrivere un dato, o per caricare un'istruzione, un circuito verifica immediatamente che tale indirizzo non sia inferiore al registro base.
In caso negativo, cioè se il programma applicativo tenta di accedere a una posizione di memoria riservata al sistema operativo, viene generato un interrupt e il controllo torna al sistema operativo, che arresta il programma e passa al programma successivo.
 
Il timer è un dispositivo che viene impostato da un'apposita istruzione ad un certo intervallo di tempo, e quando tale tempo scade, invia un interrupt che passa il controllo al sistema operativo.
Prima di lanciare un programma applicativo, il sistema operativo imposta il timer al tempo massimo previsto per l'esecuzione.
Se il programma applicativo non ha ancora terminato l'esecuzione dopo tale tempo, il timer passa il controllo al sistema operativo che arresta il programma e passa al programma successivo.
Questa tecnica solleva l'operatore dall'onere di cronometrare la durata dei programmi.
 
Il processore ha (almeno) due modalità di funzionamento:
* La '''modalità sistema''', detta anche ''modalità protetta'' (in inglese, ''protected mode''), o ''modalità supervisore'' (in inglese, ''supervisor mode''), o ''modalità kernel'' (in inglese, ''kernel mode'').
* La '''modalità utente''' (in inglese, ''user mode'').
 
Il processore è in modalità sistema solo quando è in esecuzione il codice del sistema operativo.
La modalità sistema è priva di qualunque limitazione.
 
Il processore è in modalità utente quando è in esecuzione il codice applicativo, o anche il codice del sistema operativo che non richiede i privilegi propri della modalità sistema.
La modalità utente è sottoposta a varie limitazioni.
 
Le istruzioni di alcuni tipi, dette "istruzioni privilegiate" (in inglese, "privileged instructions"), possono essere eseguite solo in modalità sistema.
Esse sono quelle che svolgono i seguenti compiti:
* Abilitazione e disabilitazione degli interrupt.
* Ingresso/uscita (input/output).
* Cambio di modalità del processore.
* Impostazione del registro base.
* Impostazione del timer.
 
Il fatto che le istruzioni di ingresso/uscita siano privilegiate costringe i programmi applicativi a invocare il sistema operativo per effettuare qualunque operazione di ingresso/uscita.
Questo genera un continuo rimpallo del controllo tra il codice applicativo e il codice di sistema.
 
Quando il sistema operativo lancia l'applicazione, pone il processore in modalità utente, e quando il controllo torna al sistema operativo a causa della terminazione dell'applicazione, il processore torna in modalità sistema.
 
Ma come fa l'applicazione a chiedere al sistema operativo di eseguire un'operazione di ingresso/uscita, dato che non può saltare direttamente nel codice del sistema operativo?
 
Per risolvere questo problema, è stata introdotta una nuova istruzione, la '''chiamata di sistema''' (in inglese, ''system call'' o ''supervisor call''), a volte chiamata impropriamente ''interrupt software''.
Eseguendo tale istruzione, il processore passa automaticamente in modalità sistema.
 
=== Il flusso di controllo del sistema operativo ===
 
SiRicapitolando, tengatramite presentel'uso delle schede di controllo e dai dispositivi di protezione hardware, il sistema operativo può avere la seguente operatività, che questatuttavia non è la descrizione di uno specifico sistema operativo, bensì una descrizione semplificata della modalità di funzionamento dei primi sistemi operativi esistenti negli anni '50.:
# Carica dal nastro magnetico di ingresso la prima scheda, verificando che si tratti di una scheda di inizio programma.
 
# Carica eventuali altrialtre recordscheda che completino la descrizione del programma, verificandone la correttezza formale. Tra le informazioni lette, ci sono il tempo massimo previsto per l'esecuzione del programma, il numero di byte di memoria richiesti dal programma e dai suoi dati, e il numero massimo di recordpagine che potranno essere emessistampate.
Tramite l'uso delle schede di controllo e dai dispositivi di protezione hardware, il sistema operativo può avere la seguente operatività:
# Carica dalle nastroschede magnetico diche ingressocontengono il primo recordprogramma, verificandofino a quella che sisegnala trattila difine undel recordprogramma die l'inizio programmadei dati.
# Carica eventuali altri record che completino la descrizione del programma, verificandone la correttezza formale. Tra le informazioni lette, ci sono il tempo massimo previsto per l'esecuzione del programma, il numero di byte di memoria richiesti dal programma e dai suoi dati, e il numero massimo di record che potranno essere emessi.
# Carica i record che contengono il programma, fino a quello che segnala la fine del programma e l'inizio dei dati.
# Imposta il registro base all'indirizzo a partire dal quale è stato caricato il programma.
# Imposta il timer al tempo previsto per l'elaborazione.
# Imposta il processore in modalità utente.
# Salta alla prima istruzione del programma applicativo.
# Il programma applicativo esegue le sue istruzioni. Qualunque tentativo di eseguire istruzioni privilegiate, o di accedere allo spazio di memoria riservato al sistema operativo provoca un interrupt. Anche il fatto che scatti il timer provoca un interrupt. L'interrupt provoca il passaggio del controllo alla routine del sistema operativo di gestione dell'interrupt, e l'impostazione del processore in modalità sistema. Tale routine emette in output ununa recordpagina di segnalazione dell'errore, provvede a leggere tuttitutte ile recordschede di dati rimanenti fino alalla prossimoprossima recordscheda di inizio programma, e torna al punto 1.
# Quando il programma applicativo vuole leggere unouna o più recordschede dal nastro magnetico di ingresso o scrivere unouna o più recordpagine sul nastro magnetico di uscita, esegue un'istruzione di chiamata di sistema, impostando preventivamente in alcuni registri il tipo di operazione (lettura o scrittura), il numero della periferica, il numerol'indirizzo di recordmemoria dadove elaborare, einizia l'indirizzo di memoriaarea da utilizzare per il trasferimento, e la lunghezza di tale area (ossia dei dati da trasferire). Tale istruzione imposta automaticamente il processore in modalità sistema. Il sistema operativo effettuatenta di effettuare la lettura o la scrittura, e poi memorizza in un registro l'esito dell'operazione, reimposta il processore in modalità utente, e salta all'istruzione del programma successiva a quella di chiamata di sistema.
# Quando il programma ha terminato il proprio compito, torna il controllo al sistema operativo, che emette sul nastro ununa recordpagina di fine elaborazione, e torna al punto 1.
 
== L'uso delle memorie secondarie ad accesso diretto ==
 
La memoria principale dei primi elaboratori era molto piccola, di poche decine dipochi chilobyte, in quanto di elevatissimo costo unitario, e quindi era possibile contenere in memoria, oltre al sistema operativo, solo piccoli programmi, che elaborassero pochi dati per volta.
 
Tuttavia, molti problemi di calcolo richiedono che il programma o i dati abbiano dimensioni maggiori della memoria principale disponibile.
Per poter eseguire questo tipo di elaborazioni su sistemi con poca memoria, si è pensato di caricaretenere ein scaricarememoria principale solamente le routine e i dati necessari alla fase corrente dell'elaborazione, e, quando si passa a un'altra fase, copiare su una memoria secondaria le porzioniroutine die programmai didati voltanon inpiù voltanecessari, richiestiliberando dallalo spazio da loro occupato nella memoria principale, ae unacopiare da un'altra porzione di tale memoria secondaria, moltoin piùmemoria lenta,principale male ancheroutine moltoe piùi dati necessari per la nuova fase di economicaelaborazione.
 
L'operazione di copia di informazioni dalla memoria principale alla memoria secondaria e poi liberare lo spazio da loro occupato nella memoria principale veniva detta "scaricamento", mentre l'operazione di copia di informazioni dalla memoria secondaria alla memoria principale veniva detta "caricamento".
 
In pratica, quando si leggeva il programma dal nastro in realtà lo si copiava tutto nella memoria secondaria, e poi si caricavano e scaricavano le porzioni d programma secondo necessità.
 
Tale memoria secondaria aveva il difetto di essere molto più lenta della memoria principale, ma il pregio di essere molto più economica, e quindi, a parità di costo, di avere dimensioni molto maggiori.
 
Siccome tali caricamenti e scaricamenti non seguono un ordine lineare, l'uso dei nastri magnetici, che sono ad accesso sequenziale, si è dimostrato inadeguato, e sono state inventate memoria secondarie magnetiche ad accesso diretto.
Line 336 ⟶ 280:
 
== I ''file system'' ==
 
D'ora in poi, per riferirsi alle memorie secondarie, non si parlerà più di tamburi, in quanto rapidamente abbandonati, e si userà l'espressione "unità disco", invece che semplicemente "disco", in quanto in molti casi la periferica che gestisce la memoria secondaria permette la sostituzione "a caldo" dell'oggetto fisico contenente i dati, detto "volume".