Concetti Chiave
- Un thread è un flusso di controllo che opera in parallelo con altri thread all'interno dello stesso processo, condividendo risorse e spazio di indirizzamento.
- I thread mantengono caratteristiche simili ai processi pesanti, come un ID, un program counter, registri, stato di esecuzione, contesto e stack di esecuzione.
- La gestione dei thread può avvenire a livello utente, dove l'utente controlla l'esecuzione tramite librerie specifiche, favorendo il parallelismo.
- A livello kernel, il kernel gestisce i thread come processi, migliorando l'efficienza in termini di tempo d'esecuzione e gestione delle risorse.
- Una soluzione mista combina vantaggi di entrambi i livelli, mappando thread utente su thread kernel, permettendo esecuzioni parallele su processori diversi.
I Thread
Un thread è un flusso di controllo che può essere attivato in parallelo ad altri thread nell’ambito di uno stesso processo e quindi nell’esecuzione dello stesso programma.
Un thread è un “segmento di codice” che viene eseguito in modo sequenziale all’interno di un processo pesante e tutti i thread definiti all’interno di un processo ne condividono le risorse, risiedono nello stesso spazio di indirizzamento e hanno accesso a tutti i suoi dati.
Per evolvere parallelamente agli altri thread o processi che si contendono la CPU, il thread mantiene comunque un insieme di caratteristiche comuni a processi pesanti:
-
un identificatore di thread (ID);
un program counter;
un insieme di registri;
uno stato di esecuzione (running, ready, blocked);
un contesto che è salvato quando il thread non è in esecuzione;
uno stack di esecuzione;
uno spazio di memoria privato per le variabili locali.
In base alla capacità di un sistema di gestire a livello kernel i thread ottenuti dalla combinazione delle possibili situazioni:
-
singolo processo e thread singolo;
singolo processo e thread multiplo per processo;
multiplo processo e thread singolo per processo;
multiplo processo e thread multiplo per processo.
User-Level
È l’utente che decide l’avvicendarsi dell’esecuzione dei thread. Servono apposite librerie che interagiscono con il kernel.
Orientato al parallelismo.
Kernel-Level
A livello di nucleo la gestione dei thread affidata al kernel tramite chiamate di sistema e quindi è il kernel che gestisce i thread come tutti gli altri processi, li deve schedulare, sospendere e risvegliare assegnandogli le risorse di sistema.
Il livello kernel è più efficiente. Gestisce meglio il tempo d’esecuzione, la concorrenza e la competizione.
Soluzione mista
Esistono anche soluzioni miste che combina le proprietà di entrambi i meccanismi permettendo di creare a livello utente dei thread che solo però preventivamente devono essere definiti a livello di kernel (i thread utente vengono “mappati” sopra i thread a livello kernel, quindi non possono essere in numero superiore a essi), e lasciano all’utente le politiche di scheduling e di sincronizzazione. I principali vantaggi sono che thread della stessa applicazione possono essere eseguiti in parallelo su processori diversi e che la chiamata al kernel da parte di un thread non blocca necessariamente il processo che lo ha generato.
Domande da interrogazione
- Che cos'è un thread e quali sono le sue caratteristiche principali?
- Qual è la differenza tra la gestione dei thread a livello utente e a livello kernel?
- Quali sono i vantaggi di una soluzione mista nella gestione dei thread?
Un thread è un flusso di controllo che può essere eseguito in parallelo ad altri thread all'interno dello stesso processo. Condivide le risorse del processo, risiede nello stesso spazio di indirizzamento e ha accesso a tutti i suoi dati. Mantiene caratteristiche comuni ai processi pesanti, come un ID, un program counter, registri, stato di esecuzione, contesto salvato, stack di esecuzione e spazio di memoria privato per le variabili locali.
A livello utente, l'esecuzione dei thread è decisa dall'utente tramite librerie che interagiscono con il kernel, mentre a livello kernel, la gestione è affidata al kernel stesso tramite chiamate di sistema. Il kernel gestisce i thread come tutti gli altri processi, occupandosi di schedulazione, sospensione e risveglio, risultando più efficiente nella gestione del tempo d'esecuzione, concorrenza e competizione.
Una soluzione mista combina le proprietà dei meccanismi a livello utente e kernel, permettendo di creare thread a livello utente che devono essere definiti a livello kernel. I vantaggi principali includono l'esecuzione parallela dei thread della stessa applicazione su processori diversi e il fatto che una chiamata al kernel da parte di un thread non blocca necessariamente il processo che lo ha generato.