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

  1. Che cos'è un thread e come si differenzia da un processo pesante?
  2. 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.

  3. Quali sono le caratteristiche principali di un thread?
  4. 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.

  5. Quali sono i vantaggi delle soluzioni miste nella gestione dei thread?
  6. 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.

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community