Video appunto: Thread - Tecnologie e progettazione

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.