Thread (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
m in italiano le parole straniere sono invarianti in numero, corretto uso delle virgole
Riga 1:
{{F|sistema operativo|maggio 2012|Questa voce manca completamente di fonti}}
[[File:Multithreaded process.svg|thumb|Un processo con due thread]]
Un '''thread''' o '''thread di esecuzione''', in [[informatica]], è una suddivisione di un [[processo (informatica)|processo]] in due o più filoni o sottoprocessi, che vengono [[esecuzione (informatica)|eseguiti]] [[concorrenza (informatica)|concorrentemente]] da un [[computer|sistema di elaborazione]] mono[[processore]] ([[multithreading]]) o [[multiprocessore]] o [[multicore]].
== Definizioni ==
La specifica implementazione dei thread e dei [[Processo (informatica)|processi]] dipende dal [[sistema operativo]], ma, in generale, si può dire che un thread è contenuto all'interno di un processo, e che diversi thread contenuti nello stesso processo condividono alcune risorse, (lo spazio d'indirizzamento del processo), mentre processi differenti non condividono le loro risorse.
 
Un thread è composto essenzialmente da tre elementi: [[program counter]], valori nei [[registro (informatica)|registri]] e stack. Le risorse condivise con gli altri threadsthread di uno stesso ''task'' sono essenzialmente la sezione di codice, la sezione di dati e le risorse del [[sistema operativo]].
 
Nelle architetture a processore singolo, quando la [[CPU]] esegue alternativamente [[istruzione (informatica)|istruzioni]] di thread differenti, si parla di [[multithreading]] a divisione di tempo: la commutazione fra i thread avviene di solito tanto frequentemente da dare all'utente l'impressione che tutti i task siano eseguiti contemporaneamente. Nelle architetture multi-processore i thread vengono invece realmente eseguiti contemporaneamente, cioè in parallelo, ciascuno su un distinto core.
 
Quando delle azioni sono effettuate a livello di thread tutta l'informazione di stato riguardante l'esecuzione viene tenuta in strutture dati a livello di thread. Ci sono, comunque, molte azioni che influiscono su tutti i thread di un processo e che il sistema operativo deve gestire a livello di processo. A questo genere di azioni appartengono la ''sospensione'' e la ''terminazione'' di un processo. In entrambi i casi, la rimozione dalla memoria dello spazio di indirizzamento si ripercuote su tutti i thread che condividono quello spazio di indirizzamento e che entrano quindi tutti insieme nello stato di sospensione o di terminazione.
 
Come i processi anche i thread hanno uno stato di esecuzione e possono sincronizzarsi tra loro. Gli stati di un thread sono '''ready''', '''running''' e '''blocked'''.
Riga 20:
 
== Applicazioni ==
Applicazioni tipiche dei thread sono la parallelizzazione di un [[programma (informatica)|programma]] per sfruttare i moderni processori [[multi core]]: infatti, un singolo thread può essere eseguito su un solo core per volta.
 
Nelle [[interfaccia utente|interfacce utente]], i thread sono usati estensivamente per evitare di congelare l'interfaccia quando il programma sta eseguendo un altro compito in [[Esecuzione in background|background]]. Per esempio, un [[browser Web]] può scorrere una [[pagina web]] anche se il suo caricamento non è completato; allo stesso modo, i controlli di un lettore [[multimedialità|multimediale]] sono accessibili anche mentre il lettore sta riproducendo un filmato.
 
Il vantaggio principale dei Thread è nelle prestazioni: operazioni come creazione, terminazione e cambio tra due thread di un processo richiedono meno tempo rispetto alla creazione, terminazione e cambio di processi.
Riga 29:
 
== Difficoltà==
La [[programmazione concorrente]], cioè con diversi thread, ha reputazione di essere una tecnica abbastanza difficile. In realtà, usare un thread non comporta particolari difficoltà di per sé: la difficoltà consiste usualmente nel sincronizzare questi diversi thread, perché non è mai possibile sapere, al momento della [[Programmazione (informatica)|programmazione]], a che punto dell'esecuzione sarà un thread specifico: la loro progressione dipende infatti dalle priorità decise dal sistema operativo.
 
In particolare la caratteristica tipica dei thread di condividere risorse tra loro, come appunto la sezione di dati, può portare ad alcuni problemi. Più thread infatti possono accedere ad una stessa [[variabile (informatica)|variabile]] e modificarne il contenuto o valore. Sebbene questo non accada nello stesso momento, perché l'accesso ad una variabile, che di fatto è memorizzata in [[memoria RAM]], è intrinsecamente limitata ad un'unità al massimo, può accadere che un thread modifichi il valore di una variabile, mentre un altro thread necessita del vecchio valore memorizzato in essa. Si ricorre pertanto all'uso di tecniche di sincronizzazione come la mutua esclusione per risolvere il problema.
 
Ne consegue che, idealmente, un thread dovrebbe eseguire del [[codice sorgente|codice]] quanto più possibile indipendente dal resto del programma. Inoltre, gli errori nella sincronizzazione tra thread sono spesso molto difficili da individuare, perché la loro occorrenza dipende essenzialmente dall'ambiente in cui il programma viene eseguito.
 
La sincronizzazione di un thread con un altro è normalmente necessaria per permettere a questi di comunicare tra di loro e di restituire i risultati di una funzione al processo principale; essa viene normalmente realizzata tramite [[mutex]].