Sistemi Operativi Giuseppe Prencipe Il modello a thread

Transcript

Sistemi Operativi Giuseppe Prencipe Il modello a thread
Il modello a thread : motivazioni
Sistemi Operativi
Giuseppe Prencipe
 Nel modello a processi, ogni processo
ha il suo spazio di indirizzamento
privato ed il modo per interagire è
quello di utilizzare i meccanismi di IPC
messi a disposizione dal sistema
Thread
Es.: send, receive
 Questo implica alti costi di interazione,
se i dati da scambiare sono molti!
1
Scambio dati fra due processi
Scambio dati fra due processi
 Come posso passare informazioni fra
 Due processi diversi non hanno spazio
di indirizzamento comune!!!
2
Proc. P2
P1 e P2 ?
Proc. P1
Stack1
Aree di memoria diverse!
Stack2
Stack1
dati2
dati1
testo2
testo1
1
Stack2
dati2
dati1
Proc. P2
Proc. P1
testo1
3
????
?????
testo2
4
Esempio: send-receive
Esempio: send-receive
 Una possibile implementazione :
 IPC -- Inter Processor Communication)
Il canale è una struttura dati del kernel
snd e rcv sono due chiamate di sistema
Es.: send, receive
Proc. P2
Proc. P1
Proc. P2
Proc. P1
Stack2
Stack1
snd
Stack2
Stack1
snd
rcv
rcv
dati1
dati2
dati1
dati2
testo1
testo2
testo1
testo2
5
Esempio: send-receive
Esempio: send-receive
 Altra possibile implementazione :
 Costi :
Dati sono copiati almeno una volta dal processo
mittente al processo destinatario
Si paga : il cambio di contesto, l’overhead delle
chiamate di sistema per snd e rcv
Proc. P2
Proc. P1
Stack2
Stack1
snd
dati1
testo1
rcv
Il canale è un file ‘speciale’ accessibile ai due
processi
snd e rcv corrispondono a chiamate di sistema
che effettuano letture/scritture su un file
il costo non migliora!!!!!!!!!!!!! Pipe in UNIX!!!!
Proc. P2
Proc. P1
Stack2
Stack1
snd
dati2
dati1
testo1
testo2
7
2
6
rcv
dati2
testo2
8
Il modello a thread: motivazioni
Quindi : se i dati da
scambiare sono molti avere
spazi di indirizzamento
separati è estremamente
costoso !
 Nel modello a processi, l’attivazione di un
processo, il cambio di contesto sono
operazioni molto complesse che richiedono
ingenti quantità di tempo per essere portate
a termine
 Tuttavia a volte l’attività richiesta ha vita
relativamente breve rispetto a questi tempi
Es.: invio di una pagina html da parte di un
server Web
 troppo ‘leggera’ per motivare un nuovo processo
9
Thread
Il modello a thread
 Thread (processo leggero – lightweight
 Idee di base dietro il modello a thread :
process, LWP)
permettere la definizione di attività
‘leggere’ (lightweight processes -LWP) con costo di attivazione e
terminazione limitato
possibilità di condividere lo stesso spazio
di indirizzamento
Identificatore di thread
Contatore di programma
Insieme di registri
Pila
 Condivide con gli altri thread che
appartengono allo stesso processo
 Ogni processo racchiude più flussi di
Sezione codice
Sezione dati
Risorse di sistema (es.: file aperti)
controllo (thread) che condividono le
aree testo e dati
11
3
10
12
Processo a singolo e multi
thread
Struttura di un processo
mutithreaded
Stack del thread T1
Stack del thread T2
Stack del thread T3
T2
T1
dati
T3
testo
Processo P1 (Multithreaded)
13
Thread
 Di solito un’applicazione svolge diversi compiti
 Es.: browser
Rappresentazione sullo schermo di immagini e testo
Reperimento dati nella rete
 Es.: elaboratore testi
Rappresentazione grafica
Lettura dati immessi da tastiera
Correzione ortografica e grammaticale
Thread
 Se l’applicazione fosse eseguita come un
singolo thread (processo)
Come si fa per fare tutto?
Crea un processo per ogni attività....
 CAMBIO DI CONTESTO!!!!
Molto costoso (implica un cambio dello
spazio di indirizzamento, copia di vari dati,
ecc....)
 Es.: server Remote Procedure Call
15
4
14
16
Il modello a thread
Il modello a thread
 Se un processo P1 ammette un singolo
 Se un processo P1 più thread di controllo
thread di controllo
lo stato di avanzamento della computazione
di P1 è determinato univocamente da :
 valore del PC (prossima istruzione da eseguire)
 valore di SP/PSW e dei registri generali
 contenuto dello Stack (ovvero storia delle
chiamate di funzione passate)
 stato del processo : pronto, in esecuzione,
Lo stato di avanzamento della computazione
di ogni thread è dato da :
 valore del PC (prossima istruzione da eseguire)
 valore di SP/PSW e dei registri generali
 contenuto dello Stack privato di quel thread
 stato del thread : pronto, in esecuzione, bloccato
 Sono invece comuni a tutti i thread :
bloccato
 stato dell’area testo e dati
 stato dei file aperti e delle strutture di IPC
utilizzate
stato dell’area testo e dati
stato dei file aperti e delle strutture di IPC
utilizzate
17
Il modello a thread
18
Il modello a thread
 Quindi, lo stato di avanzamento di un
processo multithreaded è dato da
lo stato di avanzamento di tutti i suoi
thread
stato dell’area testo e dati
stato dei file aperti e delle strutture di IPC
utilizzate
 Condiviso da tutti i thread di un
processoPrivato a ogni thread
19
5
 Privato a ogni
thread
20
Word processor con 3 threads
Uso dei thread
Applicazioni che :
 possono essere suddivise in più
flussi di controllo
 interagiscono molto strettamente
la condivisione dello spazio di
indirizzamento e delle altre risorse
permette di interagire senza pagare
copie e cambi di contesto
Comunica con l’utente
Formatta il testo
Salva su dico
21
Struttura di un word
processor multithreaded
Legge i caratteri
da tastiera e
visualizza
StackT1
StackT2
Struttura di un word
processor multithreaded
Formatta
il testo
Formatta
il testo
Legge i caratteri
da tastiera e
visualizza
T2
T2
T1
dati
testo
T3
disco
T1
StackT3
dati
Salva
periodicamente
su disco
23
6
22
tastiera
testo
T3
Salva
periodicamente
su disco
24
Un web server multithreaded
Un web server multithreaded
All’arrivo di una nuova
richiesta dalla rete :
- il dispatcher CREA un
nuovo thread ‘worker’
che controlla se la
pagina sta nella
cache, e altrimenti
va a leggere la
pagina da disco
Thread
Dispatcher
Dispatcher
T1
Connessione
di rete
(Network)
Connessione
di rete
(Network)
testo
Cache (pagine
richieste
recentemente)
testo
Processo Web Server
25
Un web server multithreaded
work1
work1
Dispatcher
Connessione
di rete
(Network)
work2
7
testo
WEB Cache
(pagine
richieste
recentemente)
26
Un web server multithreaded
Disco/i
Dispatcher
WEB Cache (pagine
richieste recentemente)
work2
Ogni worker
1) legge le
informazioni
su cache o
disco
2) aggiorna la
cache
3) risponde
alla richiesta,
4) TERMINA
testo
27
28
Un web server multithread
Un web server multithreaded
 Possibile struttura del codice del web server
Dispatcher riceve le richieste
Dispatcher sceglie un worker
Worker controlla la cache
(a) dispatcher thread
(b) worker thread
 buf e page sono appropriate strutture per
memorizzare le pagine web
29
Implementazione dei thread
Vantaggi
 Ogni thread è descritto da un
 Tempo di risposta
descrittore di thread :
Maggiore interattività
thread identifier (tid)
 Condivisione delle risorse
Tutti i thread condividono memoria e risorse
 Economia
Minore costo del cambio di contesto
 Uso di più unità d’elaborazione
Molti vantaggi nelle macchine parallele
(thread eseguiti in parallelo)
31
8
30
PC, SP, PCW, registri generali
info sulla memoria occupata dallo stack
privato del thread
stato del thread (pronto, in esecuzione,
bloccato)
processo di appartenenza (pid, process
identifier)
32
User–level thread
Implementazione dei thread
 Realizzati da una libreria di normali
 Thread table :
funzioni che girano in modo utente
tabella che contiene i descrittori di thread
simile della process table
se ne può avere una unica nel kernel o
una privata di ogni processo
thread_create(), thread _exit(),
thread_wait()…
Strato sopra il nucleo
 Il SO e lo scheduler non conoscono
 Possono essere realizzati da :
l’esistenza dei thread e gestiscono
solamente il processo intero
 Lo scheduling dei thread viene effettuato
dal run time support della libreria
librerie che girano interamente in stato
utente (user level thread)
all’interno del kernel (kernel level thread)
33
34
User–level thread
User–level thread
St1
St2
St3
 La thread table è una struttura privata
del processo
 C’è una TT per ogni processo
 I thread devono rilasciare
esplicitamente la CPU per permettere
allo scheduler dei thread di eseguire un
altro thread
thread _yield ()
35
9
T1
T2
dati
testo
T3
RTS
Tabella
dei processi
Thread
table
Spazio
Utente
Spazio
Kernel
36
User–level thread
User–level thread
 Quando un thread esegue un chiamata di sistema e si
blocca in attesa di un servizio tutto il processo a cui
appartiene viene bloccato
Es.: nel web server una qualsiasi lettura da disco blocca tutti i
thread!
 Addio parallelismo ...
 Problemi di scheduling: un thread in esecuzione non
può essere interrotto a meno che non rilasci
esplicitamente la CPU
Blocco di tutto il sistema in caso di SC bloccante!!!!
 Esempi
POSIX Pthreads
Mach C-threads
Solaris threads
37
38
Kernel–level thread
Kernel–level thread
• Thread table unica (nel kernel)
• Le primitive che lavorano sui thread
sono system call
St1
St2
St3
dati
testo
• thread_create(), thread _exit(), thread_wait()...
• Non è necessario che un thread rilasci
esplicitamente la CPU
• Le system call possono bloccarsi senza
bloccare tutti i thread di quel processo
T1
Thread
table
39
10
T2
Tabella
dei processi
T3
Spazio
Utente
Spazio
Kernel
40
Kernel–level thread
Kernel–level thread
 Implementati nel nucleo
 Il nucleo fornisce un insieme di SC che
supportano i thread
 Esempi
-
Windows 95/98/NT/2000
Solaris
Tru64 UNIX
BeOS
Linux
41
42
Modelli ibridi
User–level thread vs kernellevel thread
St1
 User—level
Creazione di thread e thread switch molto veloce
Si può effettuare uno scheduling “personalizzato”,
dipendente dall’applicazione
Gestione problematica delle system call bloccanti
T1
 librerie di SC non bloccanti
St3
dati
testo
T2
T3
RTS
 Kernel—level
Buona gestione delle SC bloccanti
Cambio di contesto più lento (SC al nucleo)
Creazione e terminazione thread più lenta (SC al nucleo)
43
11
St2
Thread
table K
Thread
table U
Tabella
dei processi
Spazio
Utente
Spazio
Kernel
44
Modelli di programmazione
multithread
Modelli ibridi
 Da molti a uno
Molti thread a livello utente corrispondono a
un singolo thread a livello del nucleo
Gestione dei thread nello spazio utente
L’intero processo si blocca se un thread
invoca una SC bloccante
Green threads – Solaris2
45
46
Modelli di programmazione
multithread
Molti a uno
 Da uno a uno
Fa corrispondere a ciascun thread a livello
utente un thread a livello del nucleo
Maggiore grado di concorrenza
 Se un thread invoca una SC bloccante, è
possibile eseguire un altro thread (perchè??)
La creazione di ogni thread utente comporta
la creazione di un thread a livello del nucleo
 Per ovviare all’overhead, si limita il numero max
di thread gestibili dal sistema
 Windows NT e Windows 2000
47
12
48
Modelli di programmazione
multithread
Molti a molti
 Da molti a molti
Mette in corrispondenza più thread del
livello utente con un numero minore o
uguale di thread del livello del nucleo
Concorrenza e nessun limite sul numero di
thread
 In caso di SC bloccante??
UNIX, Solaris2, Windows NT/2000 with the
pacchettoThreadFiber
49
fork e exec
Cancellazione
 Se un thread invoca una fork
 Cancellare un thread serve a far
terminare un thread prima che completi
il suo compito
il nuovo processo contiene un duplicato del
solo thread invocante o di tutti i thread del
processo
Es.: diversi thread stanno effettuando una
ricerca su un DB, uno di essi riporta il
risultato e tutti gli altri vengono cancellati
Es.: terminazione del caricamento di una
pagina web
 Se un thread invoca una exec
Il programma specificato come parametro
sostituisce il processo (inclusi i thread)
 Se si invoca la exec immediatamente
 Un thread da cancellare è spesso detto
dopo la fork, conviene duplicare?
thread bersaglio
51
13
50
52
Gestione dei segnali
Cancellazione
 I segnali si usano per comunicare ai processi il
verificarsi di determinati eventi
 Asincrona
Un thread fa immediatamente terminare il thread
bersaglio
 Differita
Il thread bersaglio controlla periodicamente se deve
terminare
Tipicamente esiste un thread che segnala la
necessità di cancellare un certo thread bersaglio
 Problemi possono nascere se il thread ha
All’occorrenza di un particolare evento si genera un
segnale
S’invia il segnale al processo
Una volta ricevuto, si gestisce il segnale
 Gestore predefinito
 Gestore definito dall’utente
Segnali possono essere sincroni, o
 Es.: divisione per zero
 Si inviano allo stesso processo che ha causato l’operazione che
ha generato il segnale
assegnate delle risorse
Asincroni
Es.: thread viene cancellato mentre aggiorna dati
che condivide con altri thread
 Es.: Scadenza temporizzatore, terminazione processo con
combinazione di tasti
 Di solito si inviano a un altro processo
53
Gruppi di thread
Gestione dei segnali
 Web server
Crea un nuovo thread per ogni richiesta  non si pone un
limite al numero di thread attivi nel sistema
 Per i processi a singolo thread, la gestione è
 Gruppi di thread
semplice: si fa riferimento al processo
interessato
 Con il multithread
Alla creazione di un processo, si crea un certo numero di
thread organizzati in gruppo
Quando il server riceve una richiesta, la invia a uno dei thread
del gruppo (
Si invia il segnale al thread interessato
Si invia il segnale a ogni thread del processo
Si invia il segnale a specifici thread del processo
Si definisce un thread specifico per ricevere tutti i
segnali diretti al processo
 Se ne esiste uno disponibile  OK; else, ne attende uno
disponibile
 Vantaggi
Gestione più rapida: perchè????
 Il thread già esiste!!
Limite al numero di thread nel sistema
 Il metodo scelto dipende dal tipo di segnale
 Numero di thread per gruppo determinate tramite euristiche e/o
dinamicamente
55
14
54
56
Pthreads
Thread Solaris 2
 Standard POSIX che definisce l’API
(Application Program Interface) per la
creazione e la sincronizzazione dei thread
Non è una realizzazione
 Librerie Pthreads esistono per UNIX
 Es. a pag. 144 del libro di testo (in C)
57
58
Thread Windows 2000
Processi Solaris
 Implementa il modello uno a uno
 Ogni thread contiene
- thread id
- insieme di registri
- stack utente e kernel separati
- area privata di memorizzazione dati
59
15
60
Thread in Java
Thread Linux
 Linux li chiama tasks
 Permette la gestione dei thread a livello di
 La creazione avviene tramite la SC clone()
 Clone()
permette al task figlio di
condividere lo spazio di indirizzi del task
padre
linguaggio di programmazione
 Sono gestiti dalla JVM (non da una libreria
a livello utente o nucleo)
 Tutti i programmi Java prevedono almeno
un thread di controllo
61
62
Thread in Java
 Creazione thread tramite classe Thread
 Esecuzione tramite metodo run()
Il metodo start invocato all’interno del processo chiamante crea
effettivamente il nuovo thread
 Assegnazione memoria e inizializzazione di un nuovo thread nella
JVM
 Chiamata del run, che rende il thread disponibile a essere esguito
dalla macchina virtuale
 NOTA: run non viene mai chiamato esplicitamente, ma sempre
tramite start
Per oggi basta!!!!
 Es. Pag. 150 del libro di testo: quanti thread vengono
creati?
 Come i thread Java vengono implementati nel SO
dipende da come la JVM è implementata
Windows: uno a uno, Solaris: molti a molti
63
16
64