sistemi operativi - home page luca orrù

Transcript

sistemi operativi - home page luca orrù
CENTRO MULTIMEDIALE MONTIFERRU
Concetti introduttivi
1. Quali sono le funzioni fondamentali di un sistema
operativo?
Il Sistema Operativo è un componente software di un sistema di elaborazione.
Un sistema di elaborazione può essere rappresentato come un insieme di tre
componenti organizzati in tre livelli:
Livello hardware: costituito dalle risorse fisiche come cpu-memoria principalememoria di massa-stampante-mouse-modem-tastiera-video;
Livello di sistema operativo;
Livello dei programmi di utente: sono i programmi usati direttamente
dagli utenti come word processor-web browser-compilatore -shell (interprete dei
comandi); appartengono a questo livello anche il loader e il linker.
Il sistema operativo agisce come intermediario tra i programmi applicativi e
l’hardware del sistema di elaborazione. Il sistema operativo mette a disposizione dei
programmi applicativi un’interfaccia costituita da una serie di funzioni (system call)
con la quale gli stessi programmi applicativi possono richiedere le risorse hardware
necessarie per la loro esecuzione.
CENTRO MULTIMEDIALE MONTIFERRU
Le principali funzioni di un sistema operativo sono:
• Semplificare l’utilizzo e lo sviluppo dei programmi nascondendo i dettagli
hardware. Il programmatore non deve preoccuparsi delle interazioni con
l’hardware poiché questo compito è demandato al sistema operativo. Ogni qual
volta è necessaria l’interazione con un dispositivo fisico, il programmatore
richiede l’intervento del sistema operativo facendo ricorso alle funzioni
apposite offerte dallo stesso sistema operativo (system call). Il sistema
operativo s’interesserà di tradurre le system call in una sequenza di comandi
per la gestione della risorsa richiesta. Il fatto che i programmi possano essere
sviluppati indipendentemente dall’hardware ha come conseguenza positiva la
portabilità dei programmi.
• Gestire in maniera efficiente le risorse hardware (CPU, memoria, dispositivi di
I/O): anche in un normale PC è possibile mandare in esecuzione
contemporaneamente più programmi. Un utente potrebbe contemporaneamente
navigare in Internet, tenere aperto un word processor, per copiare magari delle
informazioni, e ascoltare musica. Essendo il sistema monoprocessore, il
sistema operativo deve gestire l’accesso alla risorsa condivisa (CPU) in modo
tale da far procedere a turno i tre programmi. Il sistema operativo deve quindi
decidere a chi assegnare la CPU nel momento in cui ci sono più richieste
contemporanee e quale politica usare nell’assegnazione della risorsa. Anche
per la memoria vale lo stesso discorso: se a un certo punto un programma deve
essere caricato in memoria per essere eseguito e non c’è spazio disponibile per
allocarlo, allora il S.O deve decidere quale programma sostituire per far posto
al nuovo programma.
• Gestire le situazioni di errore e di malfunzionamento e garantire la protezione
dei dati dei vari utenti: in un sistema multiutente è necessario che il sistema
operativo garantisca la protezione dei dati dei vari utenti da accessi
indesiderati.
CENTRO MULTIMEDIALE MONTIFERRU
2. Si descriva la tecnica della multiprogrammazione
Con questa tecnica più programmi vengono caricati contemporaneamente in
memoria fisica. Una parte della memoria contiene il sistema operativo e poi vi
sono altre partizioni dedicate ad ospitare più programmi applicativi.
Naturalmente il numero dei programmi che possono essere
contemporaneamente presenti in memoria principale dipende dalla dimensione
della memoria.
Il vantaggio principale della multiprogrammazione è l’aumento dell’efficienza
nell’uso della CPU a differenza dei sistemi monoprogrammati. In un sistema
monoprogrammato un solo programma, oltre al sistema operativo, è caricato in
memoria e questo comporta un basso utilizzo della CPU (bassa efficienza.)
Un programma viene mantenuto in memoria per tutto il tempo necessario alla
sua esecuzione, per cui ogni volta che richiede un’operazione di I/O, la CPU
rimane inattiva per tutto il tempo necessario al completamento dell’operazione
di I/O. Se il programma è di tipo I/O bound, ovvero richiede molte operazioni
di I/O e poca elaborazione, allora l’efficienza della CPU scende drasticamente.
CENTRO MULTIMEDIALE MONTIFERRU
Con la tecnica della multiprogrammazione, essendoci più programmi residenti
in memoria, quando il programma che è in esecuzione richiede un’operazione
di I/O, il sistema operativo sospende momentaneamente tale programma e lo
sostituisce con un nuovo programma residente in memoria in modo tale che la
CPU non rimanga inattiva.
Naturalmente esistono ancora intervalli di tempo in cui la CPU non è utilizzata
(tempo necessario per il cambio di contesto da un programma all’altro:
overhead) ma l’efficienza è comunque molto maggiore rispetto al caso
monoprogrammato. Si possono ottenere valori di efficienza anche superiori
all’80%.
La multiprogrammazione comporta un Sistema Operativo più complesso. Il
sistema operativo deve ora garantire, oltre alla protezione dell’area del sistema
operativo dall’area dei programmi, anche la protezione dell’ area di un
programma dagli accessi non autorizzati degli altri programmi. Il sistema
operativo deve scegliere i programmi da caricare in memoria in modo da
massimizzare l’uso della CPU e delle altre risorse. Un criterio usato è quello di
scegliere un mix di programmi con caratteristiche diverse (alcuni CPU bound
che richiedono molti calcoli) e altri I/O bound (che richiedono pochi calcoli e
molte operazioni di I/O). Il sistema operativo deve implementare poi opportuni
algoritmi di scheduling sia per quanto riguarda la scelta di quale programma
mandare in esecuzione, sia per quanto riguarda la scelta dei programmi da
caricare in memoria principale dalla memoria di massa.
3. Si descrivano i sistemi time-sharing
In un sistema time-sharing ci sono diversi programmi in memoria pronti per
essere eseguiti cosi come in un sistema batch multiprogrammato. In un sistema
multiprogrammato, se un programma va in esecuzione ed è di tipo CPU bound,
allora questo utilizzerà la CPU per molto tempo, impedendo agli altri
programmi di essere eseguiti. Un sistema time sharing risolve questo problema
in quanto assegna a ciascun programma un quanto di tempo di CPU ( time
slice) dell’ordine di alcune decine di msec, terminato il quale la CPU viene
assegnata ad un nuovo programma.
La scelta dei programmi da mandare in esecuzione avviene in modalità Round
Robin ( a rotazione tutti vengono mandati in esecuzione). Un programma può
andare nuovamente in esecuzione solo se tutti gli altri programmi hanno usato
CENTRO MULTIMEDIALE MONTIFERRU
il loro quanto di tempo.
Se durante il quanto di tempo assegnato il programma richiede un’operazione
di I/O allora il Sistema Operativo sospende la sua esecuzione anche se il suo
time slice non è terminato e la CPU viene assegnata ad un nuovo processo. Lo
stesso accade se durante il time slice il programma termina. Il Sistema
Operativo provvede subito ad assegnare la CPU ad un altro programma. Questa
tecnica presenta il vantaggio di assegnare la CPU ai vari programmi in maniera
equa (non ci sarà mai un programma che monopolizza la CPU). Lo svantaggio
è che l’efficienza nell’uso della CPU diminuisce in quanto ci sono i numerosi
cambi di contesto tra i vari programmi. Ogni volta che, un programma termina
il suo quanto di tempo, dovrà essere salvato il suo contesto (PC e registro di
stato) e poi dovrà essere ripristinato quando gli verrà nuovamente assegnata la
CPU. L’utilizzo della CPU nei cambi di contesto è overhead che porta quindi
ad una diminuzione della efficienza (rapporto tra tempo necessario per eseguire
i programmi e il tempo totale).
4. Qual è la differenza tra un sistema batch
multiprogrammato e un sistema time sharing?
La differenza principale riguarda la proprietà d’interattività degli utenti. Un
sistema operativo time sharing consente l’interazione diretta con il sistema da
parte di più utenti, quindi è un sistema interattivo e multiutente. Un sistema
batch multiprogrammato non consente l’interazione diretta dell’utente con il
sistema. In un sistema time sharing l’utente opera all’interno di sessioni di
lavoro. Ogni sessione di lavoro inizia specificando nome utente e password
(login in). A questo punto l’utente inizia ad interagire con il sistema attraverso
opportuni comandi (quelli relativi ai compiti richiesti) alla quale il sistema
risponde attivando il programma che esegue il compito richiesto. Ogni volta
che il sistema termina di eseguire il compito richiesto propone nuovamente
all’utente il prompt dei comandi, in modo tale che l’utente possa digitare un
nuovo comando.
Se l’utente non ha più operazioni da far svolgere al sistema chiude la sessione
di lavoro attraverso il logout. In un sistema batch multi programmato questo
non era possibile. Un sistema operativo time sharing non consente alcuna
discriminazione riguardo alla complessità dei programmi perché a tutti i
programmi è dedicato lo stesso time slice.
CENTRO MULTIMEDIALE MONTIFERRU
Questo significa che un sistema time sharing privilegia i programmi semplici e
danneggia quelli più complessi. In un sistema batch multiprogrammato questo
non avviene.
5. Si descriva la tecnica di spooling
Nei primi sistemi di elaborazione, i sistemi batch, l’efficienza nell’uso della
CPU era molto bassa in quanto i dispositivi periferici (stampante e lettori di
schede perforate) avevano una velocità notevolmente inferiore rispetto a quella
della CPU. Per questo motivo quando la CPU attivava un trasferimento dati
con questi dispositivi (lettura di una scheda o stampa dei risultati), rimaneva in
attesa per lunghi periodi di tempo. L’introduzione dei dischi magnetici e della
tecnica del DMA consentì l’utilizzo della tecnica di spooling che portò ad un
miglioramento in termini di efficienza. Con questa tecnica venivano
preventivamente caricati su disco un insieme di job. La CPU operava solo con
il disco, ovvero prelevava da disco i dati necessari per eseguire il job e caricava
su disco i risultati dell’elaborazione. Con la tecnica del DMA, durante
l’esecuzione di un job era possibile contemporaneamente stampare i risultati di
un job, precedentemente terminato, prelevandoli dal disco, e inserire su disco
un nuovo job letto dal lettore di schede.
Questa tecnica consenti anche di utilizzare delle politiche di scheduling
riguardo ai jobs presenti su disco. Il sistema operativo, quando un programma
(job) terminava, decideva quale programma, tra quelli presenti su disco,
caricare in memoria principale per essere eseguito.
Tra tutti i job presenti su disco veniva scelto, mediante una certa regola, quale
job mandare in esecuzione (per esempio poteva essere scelto il programma con
tempo di esecuzione più breve: politica SJF (Shortest Job First)).
CENTRO MULTIMEDIALE MONTIFERRU
6. Un sistema a divisione di tempo (time sharing) non
raggiunge un’elevata utilizzazione della CPU. Perché?
Perché in questi sistemi c’è un overhead di tempo necessario alla CPU per
salvare e ripristinare il contesto dei vari programmi che hanno terminato il loro
quanto di tempo. L’overhead non si può eliminare.
7. Si descriva il concetto di overhead
L’overhead è particolarmente rilevante, come già detto nella risposta alla
domanda 5, nei sistemi di tipo time sharing, vale a dire nei sistemi in cui la
CPU viene assegnata ai vari programmi per un certo quanto di tempo, in
modalità Round Robin. Trascorso il quanto di tempo assegnato ad un
programma, il Sistema Operativo sospende quel determinato programma ed
assegna la CPU ad un altro programma , scelto tra quelli residenti in memoria
principale e quindi pronti per essere eseguiti. Prima di assegnare la CPU ad un
nuovo programma, il sistema operativo deve preoccuparsi di salvare il contesto
del programma che ha visto scadere il suo quanto di tempo, ovvero deve
salvare il contenuto del Program Counter (PC) e il contenuto del registro di
stato (PSW: Program Status Word) che contiene i bit che codificano i risultati
di una istruzione e altri bit .
CENTRO MULTIMEDIALE MONTIFERRU
Il Program Counter contiene l’indirizzo della successiva istruzione da eseguire,
che è quella immediatamente successiva all’istruzione in cui il programma ha
terminato il suo quanto di tempo e quindi deve essere ripristinato nel momento
in cui il programma viene nuovamente scelto per continuare la sua esecuzione
dal punto d’interruzione. Questo tempo, impiegato per il salvataggio del
contesto e per il suo ripristino, non è lavoro utile (tempo per eseguire il
programma) per la CPU, bensì è un overhead.
Nella figura seguente è rappresentato il caso di due programmi che operano in
modalità time sharing. Il primo programma ad andare in esecuzione è il
programma 2 e poi passa in esecuzione il programma 1, ma solo dopo un
intervallo di tempo necessario per salvare il contesto del programma 2 (parte in
azzurro)
8. Si descrivano i sistemi in tempo reale
In un sistema in tempo reale i programmi devono terminare la loro esecuzione
entro un certo intervallo di tempo prefissato (deadline del programma). Il
compito principale di un sistema operativo real time non è quello di
massimizzare l’efficienza d’uso delle risorse come nei sistemi batch e neanche
quello di minimizzare i tempi di risposta come nei sistemi time sharing, ma
garantire che tutti i programmi vengano eseguiti entro il tempo
CENTRO MULTIMEDIALE MONTIFERRU
prefissato ovvero entro la propria deadline. Se il sistema operativo non fosse in
grado di garantire ciò si potrebbe incorrere in problemi gravi. Si pensi ad
un’auto che si muove su una catena di montaggio e il robot dedicato a saldare
salda troppo presto o troppo tardi. Certamente l’auto verrà rovinata. I sistemi
real time possono essere classificati in sistemi hard real-time e sistemi soft real time.
Nei sistemi hard real-time il tempo di risposta ha dei vincoli stringenti (deve
essere assolutamente rispettato) mentre nel caso di sistemi soft real-time i
vincoli sono meno stringenti anche se naturalmente occorre che il sistema
risponda entro un tempo ragionevole. In un sistema soft real- time non
rispettare una deadline non compromette il funzionamento del sistema fisico
che si sta controllando, ma semplicemente riduce la qualità di servizio.
9. Quali compromessi si adottano nei sistemi palmari?
La categoria dei sistemi palmari comprende i pocket PC ma anche i cellulari.
Le principali caratteristiche di questi dispositivi sono:
a. ridotta dimensione e di conseguenza peso limitato (poche centinaia di
grammi)
b. costi contenuti.
A cause delle loro ridotte dimensioni questi dispositivi hanno dei limiti in
riferimento a CPU, memoria e schermo.
CPU con prestazioni ridotte, memoria limitata e schermo piccolo. La velocità
della CPU è solitamente una frazione di quella di una CPU per PC. La quantità
di memoria è tipicamente compresa tra 512KB e 128MB. Lo schermo non
supera solitamente i 6x9 cm.
La CPU non può avere prestazioni elevate in quanto comporterebbe avere
batterie più grosse, perché crescono i consumi, e di conseguenza non si
potrebbe mantenere il peso ridotto del dispositivo. In alternativa ci sarebbe la
necessità di ricaricarle più spesso.
CENTRO MULTIMEDIALE MONTIFERRU
La quantità di memoria è limitata in quanto la memoria è molto costosa e
quindi una quantità di memoria superiore comporterebbe un notevole
incremento dei costi.
Il Sistema Operativo di questi dispositivi deve avere le seguenti caratteristiche:
a. Garantire una alta efficienza nell’uso della memoria essendo questa di
capacità ridotta. Quando la memoria non è in uso occorre subito
restituirla al gestore della memoria in modo che possa essere riallocata.
b. Il sistema operativo deve essere semplice ossia non deve richiedere
prestazioni elevate al processore proprio perché il processore ha
prestazioni limitate
10. Si descrivano le chiamate di sistema (system call)
Le chiamate di sistema sono usate dai programmi applicativi per chiedere un
servizio al sistema operativo. Ogni sistema operativo mette a disposizione dei
programmi applicativi un insieme di system call che possono essere divise nelle
seguenti categorie:
a. System call per il controllo dei processi: creazione (fork), sospensione
(wait), terminazione volontaria (exit), caricamento di un nuovo
programma (exec).
b. System call per la gestione dei file: creazione di un file (creat), lettura di
un file (read), scrittura di un file (write), apertura di un file (open),
chiusura di un file (close)
c. System call per la gestione dei dispositivi di Input/Output: read e write
d. System call per la gestione delle informazioni: sono chiamate di sistema
per ottenere determinate informazioni (ora,data, spazio disponibile su
disco, quantità di memoria disponibile, versione del sistema operativo,
numero utenti collegati al sistema.
e. System call per la gestione delle directory e del file system: creazione
nuova directory (mkdir), cancellazione directory vuota (rmdir) etc.
Le system call sono solitamente disponibili come routine in linguaggio C.
Ad ogni system call è associata una funzione di libreria. Se per esempio in un
programma C vi è la funzione printf() allora la libreria C intercetta la funzione
e invoca la corrispondente chiamata di sistema che sarà la system call write().
CENTRO MULTIMEDIALE MONTIFERRU
Il sistema operativo esegue la write e poi restituisce il controllo alla funzione di
libreria che a sua volta ritorna il controllo al programma utente.
L’esecuzione della write avviene naturalmente in modalità kernel.
Alcune system call richiedono l’utilizzo di parametri che devono essere passati
dalla corrispondente funzione di libreria. Nel caso di Unix per esempio la
system call che permette di leggere un file necessita di tre parametri: nome del
file da leggere, area di memoria dove trasferire i dati e numero di byte da
leggere. In un programma C per eseguire la chiamata di sistema read occorre
chiamare la corrispondente funzione di libreria che ha lo stesso nome della
system call (read) specificando i tre parametri visti precedentemente:
read (nome-file, buffer, numbyte)
CENTRO MULTIMEDIALE MONTIFERRU
Questa istruzione provoca il passaggio dei tre parametri alla funzione di
libreria. La funzione di libreria carica i parametri in dei registri oppure in una
zona di memoria il cui indirizzo è reso disponibile in un registro. Ora il sistema
operativo preleva i parametri per eseguire la sequenza di codice che
implementa la system call. Quando il S.O ha completato la system call passa i
risultati alla funzione di libreria che a sua volta fornisce i risultati al
programma chiamante.
Nella figura è rappresentato il funzionamento della system call read. Quando il
programma vuole eseguire la system call READ interviene la funzione di
libreria read. Questa carica i parametri, indicati in figura con x, in un blocco di
memoria il cui indirizzo iniziale è posto in un registro. Tutto ciò avviene in
modalità utente. La funzione di libreria informa il sistema operativo con un
segnale di interruzione (istruzione INT) (freccia 2). La INT permette di
cambiare lo stato di esecuzione del processore che passa ora da modo utente a
modo kernel (vedi domanda 11).
CENTRO MULTIMEDIALE MONTIFERRU
Ora il sistema operativo preleva i parametri dall’area di memoria specificata
nel registro, esegue la system call e al termine (freccia 3) ripassa il controllo
alla funzione di libreria (istruzione IRET) che penserà poi a passare i risultati
della system call al programma utente.
11. Quali sono le modalità di funzionamento di un sistema di
calcolo?
Un sistema di calcolo può operare secondo due modalità di funzionamento:
a. modo utente (user mode)
b. modo kernel (kernel mode)
Per distinguere le due modalità di funzionamento le CPU moderne dispongono
nel registro PSW di un bit opportuno chiamato bit di modalità. Il valore del bit
di modalità consente di stabilire se si sta eseguendo una istruzione relativa ad
un programma di utente (bit di modalità =1) oppure una istruzione di sistema
(bit di modalità =0). Tutti i programmi applicativi vengono eseguiti in modalità
utente (bit modalità=1). Tutte le funzioni del sistema operativo vengono invece
eseguite in modalità kernel (bit di modalità=0).
Quando un programma applicativo richiede l’intervento del sistema operativo, lo
fa attraverso una chiamata di sistema (system call). Il sistema, prima di poter
eseguire la system call, deve passare dalla modalità utente alla modalità kernel
(il bit di modalità viene modificato da 1 a 0). Viene ora eseguita la system call
(routine di servizio) e al termine viene modificato nuovamente il bit di modalità
che viene posto a 1 e passato nuovamente il controllo al programma di utente. La
figura seguente riassume quanto detto.
CENTRO MULTIMEDIALE MONTIFERRU
In modalità utente non è possibile eseguire istruzioni privilegiate come può
essere l’istruzione che modifica il bit di modalità nel PSW o le istruzioni che
coinvolgono l’input/output. Quando un programma richiede una operazione di
I/O viene eseguita una chiamata di sistema che porta il controllo al sistema
operativo. Le istruzioni privilegiate sono tipicamente tutte quelle istruzioni
macchina che possono causare danni allo stato del sistema. In modalità utente
non è possibile accedere all’area di memoria del sistema operativo. Un errore di
programmazione, che potrebbe causare danni al sistema operativo, viene subito
segnalato dall’hardware che scatena un’eccezione e porta subito il sistema in
modalità kernel, consentendo al sistema operativo di gestire tale eccezione.
L’eccezione viene trattata come una normale interruzione.
Le vecchie architetture Intel 8086 e 8088 sul quale girava il sistema operativo
MSDOS erano prive del bit di modalità.
Un qualunque programma scritto dall’utente in modo non corretto poteva
accedere all’area di memoria del sistema operativo e quindi cancellare tutto o in
parte il sistema operativo stesso.