LEZ06software - Istituto di Calcolo e Reti ad Alte Rrestazioni

Il Software
Una programmazione diretta della macchina hardware
da parte degli utenti è molto difficile:

l’utente dovrebbe conoscere l’organizzazione fisica
del computer e il suo linguaggio macchina;

ogni programma dovrebbe essere scritto
utilizzando sequenze di bit ed ogni piccola
differenza hardware comporterebbe una riscrittura
del programma stesso.





Questo non è accettabile ed è necessario fornire
all’utente un meccanismo per:
astrarre dall’organizzazione fisica della macchina;
usare nello stesso modo, o in modo molto simile,
macchine leggermente diverse dal punto di vista
hardware o, al limite, macchine con hardware
profondamente differente;
avere un linguaggio di interazione semplice con
la macchina;
linguaggi semplici e ad alto livello per
programmare la macchina;
avere un insieme di programmi applicativi per
svolgere diversi compiti (videoscrittuta, fogli di
calcolo, database, etc…)
Nei moderni sistemi di elaborazione questi obiettivi
vengono raggiunti grazie alla definizione di macchine
virtuali che vengono realizzate al di sopra della
macchina hardware reale
Utente
HW
macchina virtuale
Macchine Virtuali




Ogni macchina reale ha un suo linguaggio macchina
L0 le cui istruzioni sono direttamente eseguibili dai
circuiti elettronici (HW)
Al di sopra di questo linguaggio è possibile definire
una gerarchia di linguaggi Li e fornire delle regole per
tradurne le istruzioni in opportune sequenze di
istruzioni in linguaggio macchina
L’insieme di queste nuove istruzioni definisce una
macchina virtuale in quanto non esiste fisicamente
ma viene realizzata mediante il software
La macchina virtuale si occupa della traduzione delle
istruzioni al livello Li nell'opportuna sequenza di
istruzioni di livello Li-1 che realizza la stessa funzione
Machine virtuali
Utente
Interfaccia
Macchina virtuale N - sistema di comandi LN
Macchina virtuale 1 - sistema di comandi L1
Interprete dei comandi
Hardware - Linguaggio macchina L0
Esempio esecuzione di un comando virtuale
supponiamo che l'utente voglia stampare
un documento doc1 (un file).
A livello fisico questa operazione è complessa
e richiede operazioni di trasferimento dati dal disco
alla stampante (via memoria principale)
La macchina virtuale può fornire all'utente un
semplice comando di stampa del tipo:
> print doc1
mediante il quale può richiedere la stampa delle
informazioni contenute nel file di nome doc1




La macchina virtuale deve innanzitutto verificare se
si tratta di un comando valido
Poi tradurlo nell’opportuna sequenza di istruzioni a
basso livello per la macchina fisica
Una volta eseguito il comando, la macchina virtuale
si pone in attesa di un nuovo comando da parte
dell'utente
Grazie a questo livello software si può astrarre dalle
caratteristiche fisiche della macchina e della
periferica (la stampante)

Si può anche fare in modo che macchine differenti
siano usabili in modo simile: si tratta, infatti, di
costruire al di sopra delle diverse macchine fisiche
la stessa macchina virtuale

Per ogni comando della macchina virtuale si
dovranno però avere diversi programmi di
traduzione, uno per ogni tipo di hardware
Software di base


Strumenti per l’uso di linguaggi ad alto livello:
– Interpreti e compilatori
– Strumenti per l’esecuzione di programmi
Sistema Operativo: insieme di programmi che
interagiscono e cooperano tra di loro per realizzare
due obiettivi fondamentali:
– gestire efficientemente il computer e le sue
periferiche, cercando di sfruttare al massimo
tutte le componenti hardware
– creare un ambiente virtuale per facilitare
l'interazione uomo-macchina
Compiti del Sistema operativo

Configurazione e accensione macchina
Gestione del processore

Gestione della memoria principale

Gestione di informazione su memoria
secondaria

=> FILE SYSTEM
Gestione delle risorse
– uso semplificato e astratto risorse per utente, es.
stampanti, dischi, nastri ...
– uso ottimale a seconda del sistema
 Interazione utente macchina: interfaccia e
interprete comandi
 Protezione dei dati (sicurezza)
 supporto per l’esecuzione dei programmi
applicativi
Il Sistema Operativo fornisce i servizi che sono
necessari a tutti gli altri programmi in esecuzione

Struttura del sistema operativo
nucleo
gestione memoria
processore, risorse
interfaccia comandi
Tipi di sistemi operativi

Esistono diversi tipi di sistemi operativi per diverse
classi di computer

Primi sistemi operativi (anni 60) avevano lo scopo di
semplificare interazione con il computer

Distinzioni tradizionali
– sistemi mono-utente - sistemi multi-utente
– sistemi interattivi - sistemi batch
Il Sistema Operativo


Sistemi mono-utente interattivi pensati per Personal
Computer
– IBM PC - Compatibili (DOS - Windows)
– Macintosh
Due diversi tipi di interazione utente/computer:
– interazione testuale (es. MS-DOS per PC-IBM)
– interazione grafica (es. Macintosh, Windows 95-982000)
Sistemi operativi multi-utente:
 UNIX (Workstation, PC: LINUX)
– Utilizzato per computer collegati in rete
– supporta varie interfacce grafiche (a
finestre)
 Windows NT
– Utilizzato per computer collegati in rete
Il Sistema Operativo: Esempio
Eseguiamo il programma che permette di
ottenere una finestra MS-DOS
Immettiamo il comando date
Premendo il tasto “Enter” si ottiene

L’esecuzione di un comando semplice come date
provoca l’esecuzione di una decina (o anche più) di
funzionalità del S.O.

Le operazioni effettuate provocano una serie di
eventi in cui vengono coinvolte sia risorse hardware
che risorse software

Il coordinamento e la gestione delle varie risorse
viene effettuato dal Sistema Operativo

Per ogni carattere immesso tramite la tastiera viene
inviato un codice corrispondente al computer

Il codice viene ricevuto dal controller della tastiera

Il codice viene memorizzato in un’area di memoria
riservata (buffer) e viene inviato un segnale alla
CPU (interrupt)

Quando la CPU riceve un interrupt dalla tastiera
attiva un modulo (un piccolo programma) chiamato
terminal driver

Il terminal driver invia al monitor una copia del
codice del carattere immesso per visualizzare il
carattere





Il codice corrispondente al carattere “Enter” indica
che il comando immesso (date) è completo
Il terminal driver attiva un altro modulo chiamato
listener (perchè attende i comandi provenienti dagli
utenti)
Il listener legge i caratteri dal buffer della tastiera e
ricerca un programma chiamato date, lo carica in
memoria centrale e lo esegue
Il programma date “va a leggere” un “orologio” (un
contatore che tiene conto dello scorrere del tempo)
e passa l’informazione letta al terminal driver
Il terminal driver trasmette la data al monitor che la
visualizza
Ognuno di questi eventi può essere descritto in
dettaglio, per esempio:
– prima che il programma listener carichi il
programma date in memoria deve localizzare la
“directory” dove tale comando si trova, ecc.
– La fase di caricamento del programma
comprende una fase di lettura dal disco rigido
Esempio
dat
BUFFER
MEMORIA
CENTRALE
listener
directory manager
file manager
terminal driver
disk driver
Monitor
dat
BUFFER
Disco rigido
148.608.043.200.010
timer
Tastiera
Ogni carattere dato in input dalla tastiera viene
ricevuto dal terminal driver che lo invia al monitor per
la visualizzazione
Esempio
date<cr>
BUFFER
MEMORIA
CENTRALE
listener
directory manager
file manager
terminal driver
disk driver
Monitor
date<cr>
BUFFER
Disco rigido
148.608.043.200.020
timer
Tastiera
Quando viene immesso il carattere Enter <cr> il
terminal driver passa la stringa date al programma
listener che interpreta il comando
Esempio
BUFFER
MEMORIA
CENTRALE
listener
directory manager
file manager
terminal driver
disk driver
Monitor
BUFFER
Disco rigido
148.608.043.200.032
timer
Tastiera
Il listener richiede al directory manager di cercare (nella
directory dei comandi) date. Il programa directory manager
richiede al programma file manager, che a sua volta si avvale
del programma disk driver, di localizzare sul disco rigido il
programma date
Esempio
BUFFER
date
listener
directory manager
file manager
terminal driver
disk driver
Monitor
BUFFER
Tastiera
MEMORIA
CENTRALE
Disco rigido
148.608.043.200.045
timer
Quando il comado date è stato localizzato (è un file
eseguibile) il listener (mediante il file manager) lo
carica in memoria. Per fare questa operazione il file
manager utilizza il disk driver
Esempio
BUFFER
date
listener
directory manager
file manager
terminal driver
disk driver
Monitor
BUFFER
Tastiera
MEMORIA
CENTRALE
Disco rigido
timer
148.608.043.200.101
Il listener manda in esecuzione il programma date
che legge il timer ed effettua delle operazioni di
conversione per trasformare il valore letto nella data
del giorno
Esempio
27/03/02
BUFFER
date
listener
directory manager
file manager
terminal driver
disk driver
Monitor
BUFFER
Tastiera
MEMORIA
CENTRALE
Disco rigido
timer
148.608.043.200.104
Il programma date tramite il terminal driver visualizza
sul monitor la data



La gestione dei vari eventi è compito del sistema
operativo
E’ necessario avere una gerarchia di livelli di
astrazione. Le funzionalità presenti ad ogni livello
possono ignorare i dettagli sulle funzionalità offerte
da altri livelli
Al livello più alto della gerarchia di funzionalità si
trova l’utente del sistema

l’utente è ignaro di tutti i dettagli delle operazioni
svolte dai livelli inferiori della gerarchia

L’utente ha conoscenza solo delle operazioni che è
interessato ad effettuare (Nell’esempio di
precedente l’utente è interessato alla data e
conosce solo il comando che serve per ottenere tale
informazione)
Compiti del Sistema operativo

Configurazione e accensione macchina
Gestione del processore

Gestione della memoria principale

Gestione di informazione in memoria
secondaria (File System)

Gestione delle periferiche

Interazione utente macchina: interfaccia e
interprete comandi


Protezione dei dati (sicurezza)
Avviamento del computer
Fase di bootstrap:
 Verifica delle risorse hardware e
inizializzazione dei programmi relativi di
gestione
 diagnostica (antivirus)
 caricamento completo e mantenimento del
sistema operativo
BIOS (Basic Input-Output System)



E’ la parte piu’ interna del SO risiede su un
chip di memoria RAM permenente (e ROM)
gestisce direttamente le risorse hardware
(terminal driver)
gestisce anche il caricamento (avviamento)
del sistema operativo (ad es. Windows o
DOS)
Gestione del processore e dei processi

Il processore è la componente più importante di un
sistema di elaborazione e pertanto la sua corretta
ed efficiente gestione è uno dei compiti principali di
un sistema operativo

Il ruolo del processore è quello di eseguire
programmi

Si chiama processo un programma in esecuzione
Processore e processi
La gestione del processore è in modo:
mono-tasking: esegue un processo per volta
(DOS)

multi-tasking: esegue più processi
contemporaneamente (Windows varie versioni
dal 95, Macintosh, UNIX)

Limite del mono-tasking

qualunque processo alterna fasi di esecuzione a fasi
in cui è bloccato in attesa di qualche evento esterno

Un processo può essere in attesa che sia terminata
un’operazione di input di dati oppure in attesa di
poter usare una risorsa in quel momento occupata

mentre il processo è bloccato in attesa di eventi
esterni, il processore rimane inattivo, in uno stato
chiamato idle, e risulta pertanto sotto-utilizzato
I tempi di lavoro delle periferiche di input/output, o
addirittura i tempi di reazione umani sono maggiori di
molti ordini di grandezza della velocità del processore
(quindi del tempo in cui un processo è in esecuzione)
Multi-tasking




Come è possibile eseguire più programmi
contemporaneamente sullo stesso processore?
Ad ogni istante vi è un solo processo attivo
Il processore alterna l’esecuzione dei vari
programmi
Il tempo di lavoro della CPU viene suddiviso tra i
vari programmi
Se l'alternanza tra i processi è frequente (ad es.10
millisecondi), l'utente ha l'impressione che
l'esecuzione dei programmi sia simultanea

A livello macroscopico si ha quindi l'impressione
della
contemporaneità,
mentre
a
livello
microscopico si ha una semplice alternanza
sequenziale molto veloce

Il tempo di esecuzione, cioè il tempo che intercorre
tra l'inizio e la fine del processo, risulta aumentato
rispetto
al
caso
mono-tasking
a
causa
dell’alternanza con gli altri processi
Un processo può trovarsi in tre diversi stati:

in esecuzione,
processore;
quando
sta
utilizzando
il

in attesa (bloccato), quando è in attesa del
verificarsi di un evento esterno (terminazione di
un’operazione di input/output o altro)

pronto, quando è potenzialmente in condizione
di utilizzare il processore che è occupato da un
altro processo
Gestione del processore e dei processi
terminazione
in_esecuzione
scambio
esecuzione
richiesta I/O o risorsa
pronto
creazione
in_attesa
I/O terminato o
risorsa disponibile





Il sistema operativo stabilisce quale processo deve
avere il controllo della CPU adottando una politica di
scheduling
tutte le informazioni relative ad un processo attivo
vengono salvate in una tabella dei processi
ogni volta che un processoP1 viene sospeso
dall’esecuzione vengono salvate le informazioni relative
(il contenuto dei registri) nella tabella dei processi.
Se un processo P2 viene ammesso all’esecuzione si
caricano nei registri le informazioni relative a P2
contenute nella tabella
Lo scambio di controllo del processore tra P1 e P2 viene
chiamato context switch
Gestione della memoria principale



Nel caso multi-tasking la memoria deve essere
condivisa da piu’ programmi
la memoria viene suddivisa in blocchi, ad ogni
programma viene assegnato un certo numero di
blocchi (non necessariamente contigui) di
memoria
Meccanismi di partizione:
– paginazione: blocchi di dimensione costante:
– segmentazione: blocchi di dimensione
variabile
Indirizzi fisici e indirizzi logici



indirizzi logici: gli indirizzi presenti nei programmi
indirizzi fisici: gli indirizzi RAM assegnati al
programma quando viene caricato dal disco
Per poter essere caricato a blocchi il programma
viene suddiviso in blocchi logici e il SO si occupa di
assegnare a ciascun blocco logico un blocco fisico
facendo corrispondere gli indirizzi logici a quelli fisici
Corrispondenza tra blocchi logici e fisici
RAM
P1/2
P3/1
P2/1
P1/1
P2/2
P1/2
P1/3
P1/3
P3/2
P2/1
P3/1
P2/2
P2/3
P2/3
P3/2
P1/1
Memoria virtuale



Come è possibile eseguire uno o più progammi
contemporaneamente che richiedono piu’ memoria
di quanta sia disponibile?
Per eseguire un programma non è necessario
caricarlo completamente in memoria
È sufficiente caricare in memoria principale solo
quelle parti del programma e dei dati che servono
durante una certa fase dell’esecuzione; le altre parti
possono essere tenute su un supporto di memoria
secondaria
Per gestire la memoria in modo virtuale, si usa:
 La
memoria principale in cui tenere solo i
programmi, o i pezzi di programmi, che servono in
un certo istante.
 Un
supporto di memoria secondaria in cui
mantenere tutte le informazioni relative ai processi
(programma e dati). Si utilizzano i dischi rigidi
perché sono abbstanza veloci e hanno accesso
diretto)
Demand paging



Le pagine vengono caricate nella RAM
indipendentemente, quando sono richieste
per l’esecuzione (on demand)
Il SO stabilisce quali pagine scaricare o
eliminare dalla RAM per far posto a nuove
pagine di processi in esecuzione. Se le
pagine sono state modificate devono essere
ricopiate sul disco
La gestione della memoria virtuale può
essere costosa in termini di tempo e rallenta
l’esecuzione di un programma
Esempio: la RAM non è sufficiente a contenere
P1, P2 e P3
RAM
P1/2
P3/1
P2/1
P1/1
P2/2
P1/2
P1/3
P1/3
P3/1
P3/2
P2/1
P2/2
P2/3

Visione astratta della memoria: un
programma non deve conoscere la
configurazione e le dimensioni della memoria
reale e può essere eseguito su computer con
dotazioni di memoria differenti