Thread (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
monothreading e multithreading
fix
 
(19 versioni intermedie di 16 utenti non mostrate)
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'''<ref>Lett. "filone".</ref> o '''thread di esecuzione''', in [[informatica]], è una suddivisione di un [[processo (informatica)|processo]] in due o più filoni (istanze) o sottoprocessi che vengono [[esecuzione (informatica)|eseguiti]] [[concorrenza (informatica)|concorrentemente]] da un [[computer|sistema di elaborazione]] mono[[processoremonoprocessore]] (monothreading) o [[multiprocessore]] ([[multithreading]]) o [[multicore]].<ref>{{Cita pubblicazione|autore=Edward A. Lee|data=Maggio 2006|titolo=The Problem with Threads|lingua=en|abstract=https://ieeexplore.ieee.org/abstract/document/1631937}}</ref>
 
== Definizioni ==
La specificaspecificazione dell'implementazione dei thread e dei [[Processo (informatica)|processi]] dipende dal [[sistema operativo]], ma in generale un thread è contenuto all'interno di un processo e diversi thread contenuti nello stesso processo condividono alcune risorse, lo spazio d'indirizzamento del processo<ref>{{Cita pubblicazione|autore=Mike Accetta|autore2=Robert Baron|autore3=William Bolosky|coautori=David Golub, mentreRichard processiRashid, differentiAvadis nonTevanian, condividonoMichael leYoung|anno=1986|titolo=Mach: loroA risorseNew Kernel Foundation For UNIX Development|editore=Computer Science Department, Carnegie Mellon University|città=Pittsburgh, Pa. 15213|pp=3-4|lingua=en|url=https://cseweb.ucsd.edu//classes/wi11/cse221/papers/accetta86.pdf|citazione=A thread is the basic unit of CPU utilization. It is roughly equivalent
to an independent program counter operating within a task. All threads within a task share access to all task resources.}}</ref>, 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 thread 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.<ref>{{Cita web|url=https://learn.microsoft.com/it-it/windows/win32/procthread/processes-and-threads|titolo=Processi e thread - Win32 apps|autore=Karl-Bridge-Microsoft|sito=learn.microsoft.com|data=2023-06-13|lingua=it-it|accesso=2023-10-24}}</ref>
 
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.
Line 15 ⟶ 16:
 
Ci sono quattro operazioni di base associate ai cambiamenti di stato di un thread.
* '''Creazione:''' quando un processo viene creato, si crea anche un thread. Successivamente un thread può creare un altro thread a cui deve fornire il [[Puntatore (programmazione)|puntatore]] delle istruzioni e gli argomenti: vengono creati un contesto per i registri e gli stack, e il nuovo thread è messo nella coda dei ''ready''.
* '''Blocco:''' quando un thread deve aspettare un particolare evento entra in stato ''blocked'' (salvando i registri utente, il program counter e lo [[stack pointer]])
* '''Sblocco:''' quando si verifica l'evento per cui il processo era stato posto in stato blocked, il thread passa allo stato ready.
* '''Terminazione:''' quando un thread completa il suo compito, il suo contesto per i registri e i suoi stack vengono deallocati.
 
== Applicazioni ==
Line 30 ⟶ 31:
 
== Difficoltà==
La [[programmazione concorrente]], cioè la scrittura di applicazioni multithread, ha reputazione di essere una tecnica abbastanza difficile. In realtà usare un thread non comporta particolari difficoltà di per sé: la difficoltà consiste, usualmenteinvece, nel sincronizzare l'accesso alle risorse da parte di diversi thread che agiscono in concorrenza sulle medesime risorse. La presenza di due o più thread che accedono contemporaneamente agli stessi dati può portare a risultati imprevisti e indesiderati. Infatti, senza l'applicazione di particolari tecniche di programmazione, non è possibile prevedere in maniera deterministica, al momento dell'esecuzione, quando verrà eseguito quel thread specifico: la loro progressione dipende infatti dalle priorità decise dallo [[scheduler]] del sistema operativo e non dal programmatore.
 
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.
Line 52 ⟶ 53:
 
== Altri progetti ==
{{interprogetto|preposizione=sul}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC||thread}}
 
{{Controllo di autorità}}