Evoluzione S.O. - Sistemi e reti di computer

Evoluzione S.O.
La
1.
2.
3.
gestione dell' I/O in un calcolatore può essere gestita :
A controllo di programma
Con le interruzioni
Con la tecnica Direct Memory Access
Gestione I/O a controllo di programma
interfaccia
CPU
interfaccia
BUFFER
STATO
CONTROLLO
dispositivo
L'interfaccia, da un lato,
colloquia con la cpu comportandosi
come una piccola memoria ; dall'altro interagisce con un
dispositivo esterno di I/O. L'interfaccia appare al programmatore
come un insieme di registri di tre categorie. I registri buffer
che servono per lo scambio di dati tra il processore (CPU) e il
dispositivo esterno tramite l'interfaccia; il registro di stato
che dà informazioni sulle condizioni interne dell'interfaccia
(tipicamente indica se è in corso un trasferimento tra interfaccia
e dispositivo esterno); i registri di controllo che stabiliscono
le modalità di funzionamento dell'interfaccia medesima, fra quelle
possibili.
L'interfaccia può essere montata sia nello spazio di memoria sia
nello spazio di I/O. (tipicamente nello spazio di I/O).
Gestione I/O con interrupt
E’ il dispositivo di I/O che richiama l’attenzione della CPU
attraverso una segnalazione hardware chiamata interrupt.
Pag. 1 di 13
Evoluzione S.O.
Gestione I/O con DMA
interrupt
CPU
Disco
Comando input
Copia blocco
controllore
DMA
RAM
1 La cpu richiede un copia blocco con comando input al DMA
2 La copia del blocco avviene senza intervento della cpu
3 L'interrupt del DMA sancisce la fine della Copia
Pag. 2 di 13
Evoluzione S.O.
SISTEMI OPERATIVI
Sistema operativo come macchina estesa
L'architettura della maggior parte dei computer a livello del
linguaggio macchina (set di istruzioni, organizzazione della
memoria, I/O e struttura del bus) è primitiva ed estremamente
sgradevole da programmare, specialmente per quanto riguarda
l'input/output.
Ciò che il programmatore desidera ed un utilizzatore ancora di più
è avere a che fare con una astrazione semplice e di più alto
livello.
Il sistema operativo è il
programma che nasconde i dettagli
dell'hardware e fornisce una machina estesa o macchina virtuale.
Utente
finale
Programmatore
Programmi applicativi
Sistema operativo
Progettista S.O.
Hardware
Sistema operativo come gestore delle risorse
Il concetto di sistema operativo che fondamentalmente offre una
interfaccia comoda corrisponde ad una visione top-down o dall'alto
verso il basso. Una visione alternativa dal basso verso l'alto
(bottom up) è quella di considerare il sistema operativo come
gestore di tutti i componenti di un sistema complesso. I computer
sono costituiti da processori, memorie, timer, dischi, interfacce
di rete, stampanti ecc. Secondo questa visione alternativa il
compito di un sistema operativo è quello di fornire un utilizzo
controllato del processore, della memoria , dei dispositivi di
I/O.
Una definizione più comune afferma che il sistema operativo è
l’unico programma che è sempre in funzione (normalmente chiamato
kernel o nucleo) nel computer, mentre tutto il resto è
classificabile come programmi di sistema e programmi applicativi.
Stabilire ciò che fa parte di un sistema operativo è divenuto
sempre più importante. ( Nel 1998 il Dipartimento della Giustizia
degli Stati Uniti ha portato in tribunale Microsoft, affermando
che essa aveva inserito troppe funzionalità nel proprio sistema
operativo, escludendo così dalla competizione i venditori di
programmi applicativi.
Pag. 3 di 13
Evoluzione S.O.
Evoluzione dei sistemi operativi
Prima generazione (valvole e pannelli di collegamento)
Sui primi computer non esisteva un sistema operativo; l'operatore
interagiva
direttamente
con
l'hardware.
Le
macchine
erano
controllate da una console costituita da indicatori luminosi,
interruttori a levetta, qualche forma di dispositivo di input e
una stampante.
Seconda generazione transistor
Semplici sistemi batch
Poiché le prime macchine erano molto costose era della massima
importanza utilizzarle al meglio.
Per migliorare l'utilizzo delle macchine, si sviluppò il concetto
di sistema operativo batch (a lotti).
L'idea centrale alla base del sistema batch è quella di avere una
porzione di software nota come monitor. Ciascun programma è
costruito in modo che, alla fine della elaborazione, ritorni il
controllo al monitor che, automaticamente , inizia a caricare il
programma successivo.
Nastro
in ingresso
Nastro
di sistema
Nastro
di uscita
Il nastro in ingresso contiene i programmi da eseguire letti da un
lettore di schede perforate.
Il nastro di uscita con i risultati delle elaborazioni viene
portato alla stampa.
Spooling
Un miglioramento nelle prestazioni dei sistemi batch si ebbe con l’introduzione della tecnica dello
spooling. Tutti i job di un batch venivano preventivamente caricati su disco in modo tale che,
durante le loro esecuzioni, la CPU leggesse i dati e producesse i risultati operando solo col disco
(molto più veloce dei lettori di schede e della stampante). Mentre il calcolatore eseguiva i
programmi di un batch, operando in DMA, venivano contemporaneamente caricati sul disco i job
del batch successivo e, in parallelo, venivano stampati i risultati del batch precedente prelevandoli
ancora dal disco.
Pag. 4 di 13
Evoluzione S.O.
disco
stampante
CPU e memoria
Lettore di
schede
Memoria Monitor
(Sistema Operativo
batch)
Elaborazione delle
interruzioni
Driver dei dispositivi
Interprete del linguaggio di
controllo
Confine di separazione
Area del programma
utente
Terza generazione : circuiti integrati
Sistemi batch multi programmati
Anche con la serializzazione automatica dei job fornita da un
semplice sistema batch, il processore rimane spesso inattivo
poiché, in confronto alla cpu , i dispositivi di I/O sono lenti.
Per rendersi conto dei vantaggi della multiprogrammazione si può
considerare l' esempio di un computer con 256 K parole di memoria
utilizzabile dagli utenti, un disco, un terminale ed una
stampante. Tre programmi, JOB1,JOB2 e JOB3 con gli attributi
elencati
in
tabella,
sono
pronti
contemporaneamente
per
l'esecuzione.
Job 1
Job 2
Partizioni di memoria
Job 3
Sistema operativo
Pag. 5 di 13
Evoluzione S.O.
Tipo di job
Durata
Memoria richiesta
Ha bisogno del disco
Ha bisogno di un terminale
Ha bisogno di una stampante
JOB1
Calcolo pesante
5 min
50K
no
no
no
JOB2
I/O pesante
15 min
100K
no
si
no
JOB3
I/O pes.
10 min
80K
si
no
si
In un semplice ambiente batch questi job saranno eseguiti in
sequenza: JOB1 finisce dopo 5 minuti, JOB2 dopo 20 minuti e JOB3
dopo 30 minuti dal momento in cui erano pronti per l'esecuzione.
Se tali job vengono eseguiti concorrentemente, in un sistema
operativo multiprogrammato, poiché la competizione per accedere
alle risorse è modesta, tutti e tre possono essere eseguiti in un
tempo pari alla loro durata. Entro 15 minuti tutti e tre i job
sono completati.
Sistemi time-sharing
I sistemi in multiprogrammazione a lotti hanno fornito un ambiente
in cui la varie risorse del sistema (CPU,memoria,periferiche)
venivano utilizzate in modo efficiente, ma non offrivano alcuna
possibilità di interazione tra l’utente e il computer. Nei sistemi
time-sharing la CPU esegue parecchi programmi contemporaneamente
commutando tra di essi, ma la commutazione è così frequente che
gli utenti possono interagire con ogni programma mentre è in
esecuzione.
Il
time-sharing
richiede
un
sistema
operativo
interattivo, che fornisca comunicazione diretta tra utente e
computer. L’utente da istruzioni direttamente al sistema operativo
o a un programma, utilizzando una tastiera e aspetta dei risultati
immediati sul proprio terminale. Il tempo di risposta dovrebbe
quindi essere breve, tipicamente meno di un secondo. I terminali
collegati al sistema possono essere tanti, anche centinaia. I
sistemi time-sharing devono anche fornire un file-system che
risiede in un insieme di dischi. L’idea del time-sharing fu
introdotta negli anni Sessanta ma per la loro complessità sono
divenuti comuni negli anni Settanta.
Quarta generazione :sistemi desktop ( personal computer)
I primi sistemi operativi per PC non erano ne multiutente ne
multitasking, funzionalità oggi offerte dai PC. Tuttavia, a
differenza dei sistemi multiprogrammati e time-sharing il cui
scopo principale consiste nel massimizzare l’utilizzo della CPU e
delle periferiche, i sistemi operativi per PC devono massimizzare
la comodità e prontezza di risposta:( interfacce più amichevoli ,
interfacce grafiche (GUI Graphical User Interface).
Le scelte
progettuali sono quindi diverse anche se i sistemi operativi di
questi computer hanno beneficiato sotto diversi aspetti dello
sviluppo dei sistemi operativi per mainframe.
Pag. 6 di 13
Evoluzione S.O.
Sistemi multiprocessore
Pressoché tutti i moderni sistemi operativi -tra cui Windows 2000,
Windows XP, MacOS X , Linux, Solaris una versione commerciale di
UNIX prodotta dalla Sun Microsystem – forniscono supporto SMP
(sistema multiprocessore simmetrico). In tali sistemi tutti i
processori sono allo stesso livello e utilizzano una memoria
comune.Incrementando il numero di processori si tende a ottenere
una maggiore quantità di elaborazione in minor tempo. L’incremento
di velocità con N processori non è però N volte. Quando più
processori cooperano in modo parallelo a un lavoro si verifica un
certo sovraccarico per far funzionare correttamene tutte le parti.
Sistemi distribuiti
Reti si computer
Sistemi client-server
Sistemi cluster
Analogamente ai sistemi paralleli i sistemi cluster mettono
assieme parecchie cpu per eseguire le elaborazioni richieste;
diversamente dai sistemi multiprocessore, però, i sistemi cluster
sono composti da due o più computer accoppiati tra di loro.
Sistemi in tempo reale
Un sistema in tempo reale (real time)viene usato quando è
indispensabile completare la computazione o il trasferimento di
dati entro un tempo prefissato; spesso sono dedicati per
supportare il controllo di un’apparecchiatura dedicata. Sistemi
per esperimenti scientifici, sistemi medicali per acquisizione di
immagini,
sistemi
di
controllo
industriale,
sistemi
per
l’automazione della casa(domotica), sistemi per il controllo dei
motori a iniezione delle automobili, sono tutti sistemi in tempo
reale.
Sistemi palmari
I sistemi palmari comprendono i personal digital assistant
(PDA)quali il Palm,i Pocket-PC e i telefoni cellulari.
Programmi di sistema
I programmi di sistema forniscono un ambiente opportuno per lo
sviluppo e la esecuzione di programmi. Forniscono:




Gestione dei file
Supporto ai linguaggi di programmazione
Caricamento ed esecuzione dei programmi
Comunicazioni
Forse il più importante programma di sistema per un sistema
operativo è l’interprete dei comandi, la cui principale funzione
è di ottenere ed eseguire il comando successivo specificato
dall’utente.
Struttura del sistema operativo
Pag. 7 di 13
Evoluzione S.O.
Una struttura semplice
Alcuni sistemi commerciali non hanno strutture ben definite;
spesso hanno avuto origine come sistemi piccoli, semplici e
limitati, per poi crescere al di là dello scopo originario. L’MSDOS ne è un esempio. Nell’MS-DOS i livelli di funzionalità non
sono ben separati. Ad esempio, i programmi applicativi possono
accedere alle risorse I/O di base per scrivere direttamente sullo
schermo e sui dischi.
programma applicativo
programma residente
di sistema
La struttura di MS-DOS
driver dei
dispositivi
in MS-DOS
driver dei dispositivi
nel BIOS in ROM
File di sistema: command.com (interprete dei comandi)
msdos.sys
io.sys
(config.sys, autoexec.bat)
Un altro esempio di struttura limitata è l’originario sistema
operativo UNIX consistente in due parti separabili: il nucleo
(kernel) e i programmi di sistema.
Programmi applicativi
Programmi di sistema
Kernel
Hardware
Le chiamate di sistema definiscono l’interfaccia dei programmi
applicativi ( API Application Program Interface).
Pag. 8 di 13
Evoluzione S.O.
Visione più dettagliata del kernel UNIX
Programmi utente
Librerie
Livello utente
Livello kernel
Interfaccia per le chiamate di sistema
Comunicazioni
Sottosistema dei file
Controllo
dei
Schedulatore
processi
Buffer
Gestione memoria
Carattere
Blocco
Driver dei dispositivi
Controllo dell’hardware
Livello kernel
Livello dell'hardware
Hardware
La struttura stratificata
Un sistema può essere reso modulare in molti modi. Il primo è
rappresentato dalla struttura stratificata in cui il sistema
operativo viene decomposto in un certo numero di strati o livelli.
Lo strato inferiore è l’hardware (livello 0) ; quello più elevato
(livello N) è l’interfaccia utente.Il sistema operativo OS/2
discendente di MS-DOS è stato implementato in questo modo.
L’approccio a strati trova il suo logico sbocco nel concetto di
macchina virtuale ( Sistema operativo VM per sistemi IBM)
I microkernel (client-server)
Man mano che UNIX si espandeva il suo kernel diveniva grande e
difficile da gestire; si pensò di modularizzare il suo nucleo
usando il metodo del microkernel. Questo metodo struttura il
sistema
operativo
rimuovendo
tutte
le
componenti
non
indispensabili dal kernel e implementandole come programmi di
sistema. Il risultato è un kernel più piccolo. Il kernel deve
Pag. 9 di 13
Evoluzione S.O.
fornire funzionalità di comunicazione fra il programma client e i
fari servizi che sono in funzione attraverso la tecnica dello
scambio di messaggi.
processo processo
client
client
Processi
server
file
server
memory
server
Nucleo microkernel
La struttura modulare
Forse la migliore metodologia di progetto di un sistema operativo
coinvolge l’uso di tecniche di programmazione orientate agli
oggetti per creare un kernel modulare. In questo caso, il kernel
possiede un gruppo di componenti base e si collega dinamicamente
ai servizi addizionali sia al momento del boot, sia durante
l’esecuzione.
Una
tale
strategia
è
comune
nelle
moderne
implementazioni di Unix, quali Solaris, Linux e MacOS X.
Driver
del dispositivo
Classi di
schedulazione
e del bus
File system
Kernel
Moduli
vari
Formati
eseguibili
Chiamate
di sistema
caricabili
Il risultato finale assomiglia a un sistema a strati, poiché ogni
sezione ha interfacce protette e definite; è però piu flessibile
perché ogni modulo può richiamare qualunque altro modulo. Inoltre
l’approccio è simile al metodo del microkernel in quanto il modulo
primario ha solo funzioni basilari e sa come caricare e comunicare
con gli altri moduli, ma è più efficiente, perché i moduli non
hanno
bisogno
di
richiedere
l’invio
di
messaggi
per
la
comunicazione.
Pag. 10 di 13
Evoluzione S.O.
Processi
Un concetto chiave in tutti i sistemi operativi è quello di
processo. Un processo è fondamentalmente un programma in
esecuzione. Associato a questo processo c'è il suo spazio di
indirizzamento cioè una lista di locazioni di memoria compresa tra
un minimo ed un massimo che il processo può usare per letture e
scritture. Lo spazio di indirizzamento contiene il programma
eseguibile, i dati del programma e il suo stack. Associato al
processo vi sono inoltre i valori assunti da una serie di registri
come il program counter, il puntatore allo stack, nonché tutte le
altre informazioni necessarie all'esecuzione del programma.
Se il sistema operativo prevede la multiprogrammazione ogni
processo può essere in esecuzione, bloccato o pronto.
1.
In esecuzione o running ( il processo stà effettivamente
utilizzando la cpu)
2.
Pronto o Ready ( il processo è eseguibile ma temporaneamente
sospeso per consentire l'esecuzione di un altro processo.
3.
Bloccato ( il processo è impossibilitato a proseguire fino al
verificarsi di un evento esterno)
esecuzione
2
1
3
Bloccato
Pronto
4
1 Attesa evento (I/O)
2 Termine del quanto di tempo assegnato
3 Lo schedulatore lo sceglie
4 Avviene l'evento (I/O) atteso
Il sistema operativo si interfaccia con i programmi applicativi
attraverso le chiamate di sistema.
Le chiamate di sistema fondamentali per la gestione dei processi
sono quelle che si occupano della creazione e della terminazione
dei processi. Si consideri un esempio tipico in ambiente Unix . Un
processo chiamato interprete dei comandi o shell legge comandi da
un terminale. L'utente ha appena eseguito un comando per
richiedere la compilazione di un programma. La shell deve quindi
creare un nuovo processo che eseguirà il compilatore. Quando la
compilazione ha termine il processo eseguirà una chiamata di
sistema per terminare. Se un processo può creare uno o più altri
Pag. 11 di 13
Evoluzione S.O.
processi ( chiamati child o processi figli) e questi a loro volta
possono creare processi figli si arriva rapidamente ad una
struttura ad albero.
A
B
D
C
E
figli di A
figli di B
Processi correlati, che devono cooperare per conseguire il loro
scopo, necessitano spesso di comunicare l'uno con l'altro e di
sincronizzare le loro attività.
Questa comunicazione viene chiamata comunicazione interprocesso.
Altre chiamate di sistema possono essere usate per richiedere più
memoria,
rilasciare
memoria
inutilizzata,
attendere
la
terminazione di un processo figlio, sovrascrivere il programma
corrente con uno diverso.
A volte c'è bisogno di comunicare informazioni ad un processo in
esecuzione che non è in attesa di riceverle. Per esempio un
processo può richiedere al sistema operativo di essere avvertito
dopo un determinato numero di secondi dello scadere di un certo
tempo. Dopo aver impostato questo timer il programma può
continuare tranquillamente le sue elaborazioni. Quando il numero
specificato di secondi è trascorso il sistema operativo invia un
segnale (signal) al processo. Il segnale fa sì che il processo
sospenda l'esecuzione normale, salvi i suoi registri nello stack,
ed inizi ad eseguire una speciale procedura di gestione dei
segnali. Quando il gestore dei segnali termina, il processo in
esecuzione viene ripristinato nello stato in cui si trovava prima
del segnale.
I segnali sono l'analogo software delle interruzioni hardware e
possono essere generati da un certo numero di cause oltre che la
scadenza di un timer. Molte eccezioni, intercettate dall'hardware
come l'esecuzione di una istruzione illegale o l'uso di un
indirizzo non valido, sono convertite in segnali diretti al
processo responsabile.
I processi sono caratterizzati da un uid (identificatore di
utente) che lo ha lanciato. Un processo figlio ha lo stesso uid
del suo genitore.
Chiamate di sistema per la gestione dei processi
La fork è l'unico mezzo per creare un nuovo processo. Essa crea
una copia esatta del processo originario, compresi i descrittori
dei file, i registri. Dopo il fork il processo originario e la
copia (il genitore e il figlio) prendono la loro strada.
Al momento della invocazione della fork tutte le variabili hanno
gli stessi valori, ma dal momento in cui si effettua la copia dei
dati le modifiche su uno dei due non interferiscono sull'altro.
( il codice non modificabile viene condiviso tra genitore e
figlio)
Pag. 12 di 13
Evoluzione S.O.
La chiamata fork restituisce un valore che è 0 nel figlio e uguale
all'identificatore del processo figlio (pid) nel padre. Usando il
valore restituito i due processi possono individuare il figlio ed
il genitore.
Uno schema di shell
while (TRUE) {
read_command(command,parameters);
if (fork() != 0) {
/* codice del genitore*/
waitpid(-1, &status, 0);
/* attende la terminazione del
figlio */
} else
{
/* codice del figlio*/
execve(command, parameters,0); /* esegue il comando */
}
}
Pag. 13 di 13