Home
Accesso / Registrazione
 di 

Thread o Processo: quale usare?

thread processi microcontrollori e diagrammi di flusso

Thread o Processo: quale usare? I sistemi operativi multi-tasking, in grado di gestire la concorrenza tra più task in esecuzione sullo stesso hardware, sono sempre più diffusi e trovano applicazione anche nei dispositivi con cui interagiamo tutti i giorni, come cellulari e smartphone. Parlando di multi-tasking, si usano spesso i termini processo e thread, ma qual'è la differenza tra i due e quando usare l'uno o l'altro?

Thread o Processo - Overview

Anzitutto possiamo dire che i thread possono essere paragonati a dei processi "light", nel senso che offrono vantaggi analoghi a quelli dei processi, senza però richiedere le tecniche di comunicazione tipiche dei processi. I thread permettono di dividere il flusso di controllo principale di un programma in più flussi di controllo in esecuzione concorrente. Ogni processo ha un proprio spazio di indirizzamento e delle risorse proprie; ne consegue che la comunicazione tra parti di codice in esecuzione su processi differenti può avvenire solo attraverso appositi meccanismi di gestione della concorrenza: pipe, code fifo, mailbox, aree di memoria condivise, ecc. I thread, viceversa, permettono di creare parti di programma in esecuzione concorrente, in cui ogni parte può accedere allo stesso spazio di indirizzamento, variabili, e costanti.

Definizione di thread

Per thread si intende un blocco di codice eseguibile all'interno di un sistema operativo che ha la capacità di essere schedulato (la schedulazione è il meccanismo con il quale il sisema operativo assegna il tempo di elaborazione alle unità che ne fanno richiesta). Un thread richiede molta meno informazione di un processo, e quindi comporta un minore overhead per il sistema operativo. Ogni processo ha almeno un thread (il thread primario, o principale) ma in genere dispone di thread multipli, ciascuno dei quali viene eseguito in modo concorrente ed indipendente dagli altri; in questo caso si parla di processo multi-thread. Tutti i thread in esecuzione all'interno di un processo condividono lo stesso spazio di indirizzamento e le altre risorse: i thread non hanno quindi risorse proprie, ma hanno ovviamente un proprio program counter, stack, e registri di stato. Gli stack dei vari thread saranno tutti contenuti all'interno del segmento stack del processo, menre il segmento dati del processo verrà condiviso tra i thread.

I thread possono inoltre creare altri thread, al'interno dello stesso processo, e possono anche eseguire suspend, resume, o terminare altri thread dello stesso processo. Nei sistemi multi-processore, i thread appartenenti ad uno stesso processo possono essere eseguiti su processori diversi, ma solo sui processori assegnati a quel processo. Nei sistemi mono-processore, i thread sono costretti a competere per l'uso della risorsa condivisa. Quando poi più thread sono in esecuzione concorrente all'interno dello stesso processo, il processo stesso viene detto multi-thread.

E' fondamentale osservare come il context-switch ("cambio di contesto", il meccanismo con cui il controllo passa da un processo, o thread, ad un altro) sia molto più oneroso per il sistema quando esso avviene tra thread appartenenti a processi differenti, rispetto al caso in cui i thread appartengano allo stesso processo; il motivo per cui ciò avviene è che nel primo caso avviene anche un context-switch tra processi, mentre nel secondo caso avviene solo tra thread.

Confronto tra thread e processo

Come già accennato in precedenza, la principale differenza è che ogni processo ha il proprio spazio di indirizzamento, mentre il thread no. Quando un processo crea altri processi figli, questi avranno ciascuno il proprio spazio di indirizzamento ed una copia del segmento dati: se pertanto un processo figlio modifica parte dei suoi dati, questo non avrà conseguenze sui dati del processo padre; se si vogliono pertanto scambiare informazioni tra i processi, occorre ricorrere a meccanismi di inter-process-communication (IPC). Per contro, i thread appartenenti ad uno stesso processo possono comunicare e scambiarsi informazioni semplicemente accedendo ai dati del processo padre.

I principali vantaggi dei thread si possono così riassumere:

  • context-switch più veloce e meno oneroso per il sistema
  • miglioramento delle performance dell'applicazione (mentre un thread è sospeso in attesa di eseguire un'operazione di I/O, un altro può eseguire altre operazioni)
  • semplificano la struttura del programma: l'architettura di un'applicazione può essere decomposta in vari task e ciascun task assegnato ad un thread, con la sua priorità
  • non richiedono meccanismi espliciti di IPC: i thread comunicano utilizzando la memoria condivisa nello spazio di indirizzamento del processo
  • permettono un controllo completo sugli altri thread dello stesso processo (un processo può controllare solo i suoi processi figli)

Gli svantaggi dei thread sono essenzialmente i seguenti:

  • possono corrompere l'area dati del processo di appartenenza
  • anche se non richiedono meccansimi di IPC, necessitano comunque di un'opportuna sincronizzazione quando accedono concorrentemente alle stesso aree di memoria
  • un thread può terminare altri thread, e tra questi anche il main thread del processo!
  • scarsa riusabilità del codice di un thread
  • se mal gestiti, possono causare il blocco/terminazione del processo: i thread non sono isolati come i processi, per cui un fatal access eseguito da un thread può mandare in crash l'intero processo

 

Come in tutte le cose, anche in questo caso la decisione su quale tra processo o thread sia la soluzione migliore dipende dal particolare tipo di applicazione e dal livello di affidabilità che si intende raggiungere. I thread sono più veloci, efifcienti, e semplici da usare dei processi, però si perde in sicurezza e performance.

Nell'immagine seguente viene mostrata la struttura di un processo, con i vari segmenti (stack, heap, static data e codice) ed i registri per puntare allo stack (SP) ed al codice (PC).

Quest'altra immagine, invece, si riferisce al caso di due thread (T1 e T2) definiti all'interno dello stesso processo; si osservi la presenza di due stack pointer e program counter separati per ogni thread.

 

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di giovanni.daloiso

ok

Ma su device di portata S5, note3 inutile avere diverse opzioni anche se solo commerciali non volute o almeno che si possa decidere e no che tramite la vusuale di servizi o altri parte una descrizione e quindi visione del mio profilo in forma da far in modo cosa proiettare nelle mie pagine web ricerche vudeo....e su video qui ci vogliamo SOFFERMARE DATO CHE DEVICE DI QUESTE PORTATE CHE IN INTERNET COMPARE MILUONI DI VIDEO DI INFORMAZIONE....CHE PERO'NON SONO VISIBILI...?!!!!

ritratto di giovanni.daloiso

ok...e perché non sono visibili ad ovgi

Con tecnologie che si fronteggiano..me anke più! ? Per un plug in nessuno vuole mettere ciò come una difesa di questa apk...ma ciò che essa fa ...che in tutti i siti internet di pc ..etc etc mette in visuale video che sono di informazione e mille altre cose.

ritratto di Giusepper

Complimenti! Davvero un

Complimenti! Davvero un ottimo articolo!
L'ho trovato molto completo e soprattutto di immediata comprensione!
Grazie,
Giuseppe

ritratto di Emiliano

Grazie

Grazie 1000! Qualche volta ho preso GAPIL in mano per provare a capire qualcosa e questo argomento mi richiede sempre un grande sforzo, ora mi è molto più chiaro e sento di poter fare con più facilità le correlazioni necessarie.

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ultimi Commenti