Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
di Giacomo Marciani
Sistemi Operativi
Thread
usso indipendente di esecuzione
1
all'interno di un processo,
Un thread un
che viene schedulato ed eseguito come tale dal sistema operativo, costituendo perci l'unit elementare di lavoro dei moderni sistemi time-sharing con supporto multithread . I thread di uno stesso processo condividono lo stesso spazio loro terminazione.
tid: identicatore del thread. stack um: registri: propriet dello scheduling: maschera dei segnali: dati specifici del thread: variabile
errno :
4 un processo composto da un solo thread: vi
La programmazione
Un heavyweight process
Un multithread process un processo composto da pi thread: vi sono dunque pi ussi di esecuzione concorrenti e indipendenti. La programmazione
Programmazione Multithread
al meglio la concorrenza. I vantaggi della programmazione multithread possono identicarsi nei seguenti quattro fattori principali:
pria esecuzione, anche se una parte di esso bloccata o sta eseguendo un'operazione particolarmente lunga.
oggi la maggior parte dei moderni sistemi time-sharing supportano la programmazione multithread. 2 quindi i cambiamenti fatti da un thread sono visibili agli altri thread del processo, e letture/scritture nella stessa memoria richiedono tecniche di sincronizzazione previste dalle librerie thread-safe. 3 Pthread, Win32 e Java permettono l'impiego dei dati specici dei thread. 4 ovvero processo pesante, anche detto processo a singolo thread, o anche processo tradizionale. 5 anche detta programmazione tradizionale.
2
1 ad
vidono le risorse tramite opportune tecniche IPC, i thread condividono per denizione la memoria e le risorse del processo al quale appartengono, denendo cos una comunicazione immediata.
maggiore ecienza:
maggiore scalabilit:
dei thread.
multicore sono:
individuarvi porzioni di lavoro parallelizzabili. i vari task devono eseguire compiti di mole e valore conTalvolta pu
frontabili, cos da contribuire bilanciatamente al processo complessivo, di modo che risulti conveniente impegnare core distinti. multithread su pi core. risultare ininuente o addirittura sconveniente parallelizzare un'applicazione
l'accesso e la manipolazione opportuna da parte di core distinti. la sincronizzazione dei thread deve garantire la co-
erenza dei dati condivisi. essendoci diversi possibili ussi di esecuzione, il test e il
user thread7 : gestiti senza l'aiuto del kernel. kernel thread8 : gestiti interamente dal sistema operativo.
Le possibili corrispondenze stabilite fra user thread e kernel thread deniscono quattro modelli di programmazione multithread:
modello molti a uno: fa corrispondere pi user thread ad un singolo kernel thread. La gestione dei thread risulta eciente, in quanto, essendo svolta nello spazio utente, non necessario limitare il numero di
6 ad esempio, in Linux, creare un thread richiede un processo. 7 anche detti thread a livello utente. 8 anche detti thread a livello kernel.
1 10
user thread. Tuttavia, poich il meccanismo di scheduling del kernel pu scegliere un solo kernel thread alla volta, talvolta impossibile realizzare una pura parallelizzazione .
modello molti a molti: fa corrispondere pi user thread ad un numero minore uguale di kernel thread dei thread, e la possibilit della parallelizzazione.
Ptherads 11
procedurali
Una libreria dei thread una libreria necessaria ai linguaggi che fornisce al programmatore una API per la creazione e la gese
tione dei thread. Attualmente le librerie dei thread maggiormente in uso sono:
Pthreads, Win32
Java.
libpthread 12 .
mutua esclusione,
condition variable:
di condizioni.
synchronization:
di thread. 10 il numero di kernel thread pu dipendere dall'applicazione, o dall'architettura del calcolatore. 11 alcuni linguaggi di programmazione orientati agli oggetti includono una classe standard di tipo thread, i cui metodi realizzano tutte le funzionalit per la programmazione multithread. 12 spesso inclusa nella libreria libc.
9 se uno user thread invoca una chiamata di sistema bloccante, questa blocca l'intero insieme
Creazione di un thread
menti.
La routine
13 , e non pone 14 limiti impliciti al numero dei thread creabili all'interno di uno stesso processo .
Essa pu essere invocata sempre e ovunque nel codice Alla routine devono essere indicate le seguenti informazioni riguardanti il nuovo thread: il TID, gli attributi, la funzione da eseguire e i suoi eventuali argomenti. Una volta creato, un thread pu creare altri thread all'interno dello stesso processo: non vi un'implicita gerarchia o dipendenza tra i thread creati. In un programma multithread cambia la semantica della Se un thread invoca una
fork() e della exec(). fork(), il nuovo processo pu contenere un duplicato di tutti i thread, oppure del solo thread invocante. Se un thread invoca una exec(),
il programma specicato sostituisce l'intero processo, inclusi tutti i thread.
Terminazione di un thread
exec().
exit()
o con una
il thread termina l'esecuzione della sua routine. il thread viene cancellato da un altro thread tramite il thread chiama
pthread_cancel().
pthread_exit().
La cancellazione dei thread l'operazione Un I
Cancellazione di un thread
punto di cancellazione.
deve terminare, di modo che possa farlo opportunamente. Questo metodo permette di denire i cosiddetti cancellation point
17 , ovvero punti del 18 usso d'esecuzione in cui il thread sia cancellabile senza problemi .
una volta creato, un thread pu creare un altro thread invocando la routine pthread_create. 14 il numero massimo di thread creabili per ogni processo dipende dall'architettura dell hardware. 15 ovvero thread bersaglio. 16 come ad esempio l'incoerenza di dati condivisi. 17 ovvero punti di cancellazione. 18 il thread potrebbe non essere opportunamente cancellabile qualora venisse cancellato mentre aggiorna dati condivisi con altri thread, o nel caso in cui le sue risorse siano assegnate ad altri thread.
13 quindi,
Attesa di un thread
Un thread pool
La routine
pthread_join()
fa attendere al thread
chiamante la terminazione del thread specicato, restituendo 0 in caso di successo o un numero d'errore altrimenti. Non esiste alcun modo per attendere la terminazione di un thread qualunque. creazione del processo.
architetturali
determinato dinamicamente
euristiche
I compiti
assegnati al thread pool vengono indirizzati al primo thread disponibile, il quale, una volta terminato il lavoro, torner nello stato di attesa. Questo paradigma organizzativo elimina l'attesa dovuta alla creazione di nuovi thread e, limitando il numero di thread, garantisce ecienza prestazionale a quei sistemi che non sopporterebbero un elevato numero di thread concorrenti.
Un segnale pu essere:
kernel
utente.
inviare il segnale al thread cui il segnale si riferisce. inviare il segnale ad ogni thread del processo. inviare il segnale a specici thread del processo. denire un thread specico per ricevere tutti i segnali diretti al processo.
task 20 .
Thread di Linux
processi
thread :
esistono solo
nel kernel un'unica struttura dati, che punta ad altre strutture dati, dove i dati sono eettivamente contenuti. L'implementazione dei thread in Linux basata sul concetto di Light Weight
Process (LWP)21 , ovvero un task che condivide alcune risorse selezionate con
19 ovvero 20 ovvero 21 ovvero
CLONE_FS: condivisione delle informazioni sul le system. CLONE_VM: condivisione dello stesso spazio di memoria. CLONE_SIGHAND: condivisione dei gestori dei segnali. CLONE_FILES: condivisione dei le aperti. CLONE_THREAD: stesso processo.
clone() con la massima intensit di condivisione equivale a pthread_create(); mentre una clone()
crea e rende eseguibile un nuovo LWP. Si tratta di una
che non preveda alcuna condivisione equivale a duplicare un processo, quindi ad La routine
fork(). clone()
indirizzo della cime dello stack UM del nuovo LWP. ag di intensit della condivisione.
chiamata di sistema clone() presenta una semantica dierente. int clone(ags, stack); ags : ag di intensit della condivisione. stack : indirizzo della cime dello stack UM del nuovo LWP. In caso fosse nullo, il glio utilizza una copia dello stack del genitore. L'esecuzione del glio inizia con l'istruzione successiva alla chiamata di sistema clone().
7
22 la