Concetti Chiave
- Un thread è un flusso di controllo che opera in parallelo ad altri thread all'interno di un processo, condividendo risorse e spazio di indirizzamento.
- I thread possiedono caratteristiche comuni ai processi pesanti, come un identificatore, uno stato di esecuzione e uno stack di esecuzione.
- La gestione dei thread a livello kernel consente una schedulazione efficiente, con il kernel che gestisce i thread come normali processi.
- Le soluzioni miste combinano i meccanismi a livello utente e kernel, permettendo un controllo più flessibile e l'esecuzione parallela su più processori.
- Le chiamate al kernel da parte di un thread non bloccano necessariamente il processo originario, migliorando l'efficienza complessiva dell'esecuzione.
Definizione di 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.
Caratteristiche dei thread
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.
Gestione dei thread a livello kernel
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.
È l’utente che decide l’avvicendarsi dell’esecuzione dei thread. Servono apposite librerie che interagiscono con il kernel.
Orientato al parallelismo.
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.
Vantaggi delle soluzioni miste
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 come si differenzia da un processo pesante?
- Quali sono le caratteristiche principali di un thread?
- Quali sono i vantaggi delle soluzioni miste nella gestione dei thread?
Un thread è un flusso di controllo che può essere attivato in parallelo ad altri thread all'interno dello stesso processo, condividendo risorse e spazio di indirizzamento, mentre un processo pesante è un'entità più complessa e autonoma.
Un thread possiede un identificatore (ID), un program counter, registri, uno stato di esecuzione, un contesto salvato, uno stack di esecuzione e uno spazio di memoria privato per le variabili locali, mantenendo così un insieme di caratteristiche comuni ai processi pesanti.
Le soluzioni miste combinano le proprietà dei thread a livello utente e kernel, permettendo l'esecuzione parallela su processori diversi e evitando che la chiamata al kernel da parte di un thread blocchi l'intero processo, migliorando così l'efficienza e la gestione delle risorse.