Sei sulla pagina 1di 5

CONCETTI INTRODUTTIVI AI SISTEMI OPERATIVI

Object 3
1
2

I computer moderni sono costituiti da una struttura hardware interna molto complessa: processori,
dischi di memoria, schede video, schede di rete e cosi via… Tuttavia il programmatore medio non
conosce il funzionamento di tutti questi componenti (e non deve farlo), nell’utilizzare le risorse del
calcolatore esso è aiutato dal sistema operativo. Il compito del sistema operativo è quello di fornire
ai programmatori (e quindi ai programmi da loro implementati) un modello del computer migliore,
più semplice e chiaro. Esso deve permettere una gestione semplificata delle risorse. In una parola
esso deve fornire “astrazione”.
Tutti abbiamo avuto a che fare con almeno un sistema operativo, basta pensare alle distribuzioni
Microsoft Windows, Mac OS o Linux oppure ai diversi sistemi portatili come Google Android,
Apple IOS o Windows Mobile; tuttavia non dobbiamo farci ingannare: l’interfaccia con cui
utilizziamo il computer, che sia essa grafica (Graphical User Interface) o testuale (Shell) fa
raramente parte del sistema operativo.

Kernel Mode vs. User Mode


Tutti i “programmi” in esecuzione sul nostro computer vengono eseguiti (normalmente) in due
modalità operative distinte: modalità kernel o modalità user. Il sistema operativo viene eseguito in
modalità kernel, questa modalità garantisce pieno accesso all’hardware e permette l’esecuzione di
tutte le istruzioni dell’ISA (Set d’Istruzioni dell’Architettura). Il resto del software viene invece
eseguito in modalità utente, in questa modalità i programmi possono eseguire un ristretto numero
d’istruzioni dell’ISA e si devono interfacciare con il S.O. per accedere all’hardware. Questo sistema
permette di salvaguardare l’uso delle risorse e di proteggere il funzionamento del computer.
Kernel Mode:
• Il codice in esecuzione sul calcolatore ha accesso completo e senza restrizioni all’hardware
sottostante;
• Il processo può fare riferimento a qualsiasi area della memoria;
• Il processo in esecuzione può eseguire qualsiasi istruzione appartenente all’ISA del
processore;
• Errori in modalità kernel implicano errori critici e blocchi del sistema (la famosa Blue Death
Screen presente in alcune versione di Microsoft Windows).
User Mode:
• Il codice in esecuzione non ha possibilità di accedere direttamente all’hardware sottostante,
specialmente alla memoria;
• Il processo in esecuzione può eseguire un ristretto numero d’istruzioni dell’ISA;
• Errori in modalità user pregiudicano solo il funzionamento dei processi coinvolti.
Le modalità kernel/user sono gestite direttamente dall’hardware della CPU, se un programma utente
cerca di fare qualcosa che non è di sua competenza viene generata una eccezione che blocca
immediatamente il funzionamento del programma. Il passaggio dalla modalità utente alla modalità
kernel avviene tramite la chiamata di una System Call o di una eccezione. Il procedimento opposto
avviene invece tramite una procedura di ritorno di sistema (istruzione IRET).
Ring di Intel
Abbiamo visto come il software in esecuzione su un calcolatore venga suddiviso in due modalità
d’esecuzione. Tuttavia l’architettura Intel originare prevedeva l’esistenza di quattro anelli
concentrici con priorità e compiti differenti.
Le specifiche originali prevedevano:
• Il primo anello doveva essere riservato al solo sistema operativo, eseguito in modalità
kernel;
• Il secondo anello era riservato ai servizi del sistema operativo;
• Il terzo anello doveva contenere le estensioni, da eseguire in modalità utente;
• Il quarto anello doveva contenere tutte le applicazioni utente, eseguite in user mode.
Questa architettura non è però stata adottata dai progettisti di sistemi operativi, la struttura odierna
prevede:
• Il primo anello è usato dal sistema operativo e dai suoi servizi;
• Il secondo è il terzo anello sono inutilizzati;
• Il quarto anello contiene tutte le altre applicazioni eseguiti in user mode.

Strutture dei Sistemi Operativi


Nel corso degli anni sono emerse quattro tipologie differenti di sistemi operativi:
• Sistemi monolitici;
• Sistemi stratificati;
• Sistemi microkernel;
• Sistemi client-server.
Questi sistemi sono destinati ad architetture e scopi differenti.

Sistemi Monolitici
L’intero sistema operativo è costituito da blocchi di funzioni che vengono eseguite come fossero
unico processo in modalità kernel. Fisicamente il S.O. è scritto come un insieme di procedure
linkate tra loro. Questi sistemi sono pesanti e il codice che li costituisce risulta particolarmente
difficile da comprendere. Per ottenere questo tipo di sistema le diverse procedure vengono
compilate individualmente, per poi essere fuse assieme tramite un linker di sistema.
Il kernel di Unix è un esempio di sistema monolitico.

Sistemi Stratificati o a Livelli


In questa modalità i moduli che compongono il S.O. sono organizzati tra loro in un modello
gerarchico. Ogni livello, o layer, è costruito sopra al livello sottostante. Ad ogni modulo è assegnato
in modo inverso un livello a cui corrisponde una priorità (a livelli bassi corrispondono priorità alte e
viceversa). Un modulo di livello potrà accedere solo alle risorse dei livelli con priorità inferiore e
quindi con livello almeno .
Questi sistemi sono facili da mantenere ma non sono efficienti.

Sistemi Microkernel
Un sistema microkernel viene realizzato includendo nel kernel solo i servizi indispensabili per il
funzionamento del sistema, in questo elenco vengono generalmente inclusi:
• Gestore dei processi;
• Sistema di comunicazione dei processi;
• Gestore dei messaggi.
I restanti servizi sono considerati processi utenti assestanti. Questo approccio riduce il numero di
errori critici che portano al blocco totale del computer. Infatti, se si verifica un errore in un servizio
secondario, eseguito in modalità utente, si andrà incontro al solo blocco dello stesso. Questa
soluzione presenta un kernel contenuto, con un codice corto e facilmente estendibile. Di contro non
permette grosse prestazioni.

Sistemi Client-Server
Il modello dei sistemi client-server può essere visto come un’estensione del modello microkernel.
Partiamo dall’idea del sistema microkernel e distinguiamo due grossi processi:
• Server;
• Client.
I server mettono a disposizione i servizi che sono utilizzati dai client. A differenza del sistema
precedente l’architettura client-server utilizza diverse macchine collegata tra loro (in questo modo
un calcolatore può essere costituito da macchine localizzate in ambienti molto diversi).

Hypervisor
Un hypervisor o VMM (Virtual Machine Monitor) è un software in grado di generare e gestire
macchine virtuali. Le macchine virtuali, e in particolari le macchine virtuali di sistema, sono
particolari programmi creati per emulare l’esecuzione di una macchina fisica su cui è poi possibile
installare un sistema operativo.
I vantaggi delle macchine virtuali di sistema sono:
• Permettono l’esecuzione di sistemi operativi diversi da quello realmente in esecuzione sul
calcolatore;
• Le macchine virtuali possono fornire un set d’istruzioni dell’architettura (ISA) diverso;
• Il crash di un sistema in esecuzione su una macchina virtuale non pregiudica il
funzionamento del sistema operativo del calcolatore.
Il principale svantaggio delle macchine virtuali risiede nella loro scarsa efficienza rispetto alla
macchina fisica. Malgrado quello che si potrebbe pensare le VMM e le VM non sono prodotti molto
recenti, la loro creazione risale infatti agli anni ’70.
Gli hypervisor si suddividono in due tipologie differenti, create in momenti diversi tra loro:
• Hypervisor di tipo 1, sono particolari software che vengono eseguiti sopra all’hardware della
macchina. Sono stati utilizzati da IBM negli anni ’70 per creare l’illusione di un sistema
operativo diverso per ogni utente.
• Hypervisor di tipo 2, sono particolari software che vengono eseguiti come programmi utenti
all’interno di un sistema operativo reale detto sistema host.

Astrazioni fornite dal Sistema Operativo


Il compito del sistema operativo è quello di fornire tramite astrazione, un modello del computer
migliore. Quali astrazioni fornisce il sistema operativo?
1. System Call (Syscall);
2. Shell;
3. Processi (e thread);
4. Memoria virtuale;
5. File (e file system).

Le syscall
Il sistema operativo è il gestore di tutte le risorse, se a un programma occorre una qualsiasi risorsa
della macchina, esso dovrà interfacciarsi con il sistema operativo per averne accesso. Per svolgere
questa azione si utilizzano le syscall. Le syscall sono particolari funzioni implementate dal sistema
operativo che possono essere utilizzate dai programmi utente. Le syscall costituiscono uno degli
strati in grado di collegare i programmi con l’hardware sottostante, il loro compito è quello di
fornire una semplice interfaccia d’uso.
Le syscall di un sistema possono essere catalogate in gruppi:
• Controllo processi;
• Gestione file;
• Gestione device;
• Gestione informazioni;
• Gestione comunicazione;
• Gestione tempo.
Abbiamo visto in precedenza che i programmi in esecuzione in user mode possono ricorrere alle
syscall per delegare un compito al sistema operativo. Dopo la chiamata di una syscall il processore
entra automaticamente in kernel mode. Tutti i processori contengono all’interno del loro ISA (Set
d’Istruzioni dell’Architettura) un istruzione di tipo syscall.
Vediamo qualche esempio:
• x86: int/iret
• MIPS: syscall
• Altri: trap
Ad ogni syscall è assegnato un numero univoco che la contraddistingue. Una volta lanciata, il
sistema operativo riconosce la syscall dal suo numero, ed esegue come conseguenza una serie di
operazioni.
Ogni syscall è costituita da:
• Un numero univoco;
• Un insieme di argomenti di input;
• Un valore di ritorno che indica la sua corretta esecuzione;
• Un corpo di esecuzione.
Normalmente le applicazioni non richiamano direttamente le syscall, esse richiamano delle funzioni
di libreria che a loro volta richiamano le syscall, secondo l’interfaccia corretta. Ad esempio: un
programma C richiama la funzione printf() nella libreria stdio.h, che a sua volta richiama la syscall
write(), che a sua volta stampa un messaggio a video.

La shell
All’inizio di questo articolo, dedicato all’introduzione ai sistemi operativi, abbiamo detto che
l’utente interagisce con il sistema operativo attraverso le GUI, o attraverso la Shell. Vediamo ora un
po’ più nel dettaglio che cos’è la shell; La shell è la parte del sistema operativo che ha il compito di
interpretare i comandi forniti dall’utente. Esistono diversi tipi di shell, ad esempio i sistemi Unix o
Unix-Like utilizzano la shell testuale Bash. La shell non è una vera parte del sistema operativo,
infatti, essa opera in modalità utente.
La shell di un sistema operativo lavora seguendo un rigido ciclo:
1. Attesa input utente;
2. Interpretazione comando utente;
3. Esecuzione comando/i utente.
4. Ritorno al punto 1
Nel corso dei prossimi capitoli esamineremo gli altri componenti principali dei sistemi operativi.