Processo

In Informatica per processo si intende l'esecuzione di un programma. Più precisamente è un'attività controllata da un programma che si svolge su un processore.

Il concetto di processo è associato a quello di thread, con cui si intende una posizione nell'esecuzione del programma. Un processo ha sempre almeno un thread, ma in alcuni casi un processo può avere più thread che avanzano in parallelo.

Quando si vuol far riferimento indistintamente a un processo o un thread, si usa la parola task.

Le definizioni sono le seguenti:

Programmi e processi

 

Un programma è costituito dal codice oggetto generato dalla compilazione del codice sorgente. Esso è un'entità statica, che rimane immutata durante l'esecuzione. Un processo, invece, è un'entità dinamica, che dipende dai dati che vengono elaborati, e dalle operazioni eseguite su di essi. Il processo è quindi caratterizzato, oltre che dal codice eseguibile, dall'insieme di tutte le informazioni che ne definiscono lo stato, come il contenuto della memoria indirizzata, i thread, i descrittori dei file e delle periferiche in uso.

Processi e thread

In un sistema che non supporta i thread, se si vuole eseguire contemporaneamente più volte lo stesso programma, è necessario creare più processi basati sullo stesso programma. Tale tecnica funziona, ma è dispendiosa di risorse, sia perché ogni processo deve allocare le proprie risorse, sia perché per comunicare tra i vari processi è necessario eseguire delle relativamente lente chiamate di sistema, sia perché la commutazione di contesto tra thread dello stesso processo è più veloce che tra thread di processi distinti. Avendo più thread nello stesso processo, si può ottenere lo stesso risultato allocando una sola volta le risorse necessarie, e scambiando i dati tra i thread tramite la memoria del processo, che è accessibile a tutti i suoi thread.

Un esempio di applicazione che può far uso di più thread è un browser Web, che usa un thread distinto per scaricare ogni immagine in una pagina Web che contiene più immagini.

Un altro esempio è costituito dai processi server, spesso chiamati servizi o daemon, che possono rispondere contemporaneamente alle richieste provenienti da più utenti.

In un sistema multiprocessore (SMP), si possono avere miglioramenti prestazionali, grazie al parallelismo fisico dei thread. Tuttavia, l'applicazione deve essere progettata in modo da suddividere tra i thread il carico di elaborazione. Tale progettazione è difficile e soggetta a errori, e il programma risultante, se eseguito su un sistema monoprocessore, potrebbe essere più lento di uno con un solo thread; pertanto oggi sono ancora pochi i software che usano i thread per sfruttare i sistemi SMP.

Supporto del sistema operativo

I sistemi operativi si classificano nel seguente modo in base al supporto che offrono a processi e thread:

Si noti inoltre che la mancanza di supporto ai thread da parte del sistema operativo non impedisce la programmazione parallela. Infatti il parallelismo tra thread può essere simulato da librerie di programmazione o anche dal supporto run-time del linguaggio di programmazione. In tal senso si parla di "thread del kernel" per indicare un thread gestito dal sistema operativo, e di "thread utente" per indicare un thread gestito da una libreria applicativa. Per esempio, alcune versioni di Unix non supportano i thread, per cui si ricorre ai thread utente.

Stati di un thread

In un sistema operativo multitasking, ci sono più thread contemporaneamente in esecuzione. Di questi, al massimo un numero pari al numero di processori può avere effettivamente il controllo di un processore. Gli stati in cui un thread si può trovare sono:

Con commutazione di contesto si indica il meccanismo per cui un thread in esecuzione viene fermato (perché ha eseguito una chiamata di sistema o perché lo scheduler ha deciso di eseguire un altro thread), e un altro pronto viene messo in esecuzione.

Genesi di processi e thread

Al bootstrap del sistema operativo c'è in esecuzione uno o più processi creati dal sistema operativo stesso. Durante l'avvio del sistema, in base alla configurazione, possono essere creati numerosi processi. Durante la normale operatività, in base alle richieste degli utenti, possono essere creati nuovi processi e altri possono terminare.

Quando il sistema operativo inizia l'esecuzione di un programma, crea un processo dotato di un solo thread. Durante l'esecuzione di tale thread, detto thread principale, il codice può creare altri thread o altri processi con apposite chiamate di sistema.

La creazione di un processo differisce tra i vari sistemi operativi. In ambiente Windows, si usa la chiamata di sistema "CreateProcess", con cui si specifica il nome del file contenente il programma eseguibile; tale file viene caricato in memoria ed eseguito. In ambiente Unix, si usa la chiamata di sistema "fork" per creare un processo identico al chiamante eccetto che per il valore reso dalla chiamata stessa; e si usa la chiamata "exec" per caricare il codice eseguibile di un nuovo programma nel processo corrente, e mandarlo in esecuzione.

La creazione di un thread invece, è più uniforme. Infatti, sia la chiamata di sistema "CreateThread" di Windows che la chiamata di sistema "thr_create" di Solaris (una variante di Unix) richiedono il passaggio dell'indirizzo di una routine, e della dimensione del nuovo stack, oltre ad altri parametri. La chiamata di sistema fa sì che venga eseguito il corpo della routine specificata, concorrentemente con il codice che il chiamante sta eseguendo.

Strutture dati relative a processi e thread

Nel sistema operativo, ciascun processo è identificato da un numero, detto PID (Process IDentifier) oppure "process handle".

Ad un processo sono associate le seguenti strutture dati:

Se il sistema operativo gestisce i thread, anche ciascun thread è identificato da un numero, detto TID (Thread IDentifier) oppure "thread handle".

Ad un thread sono associate le seguenti strutture dati:

Se il sistema operativo non gestisce i thread, le suddette informazioni fanno parte dello stato del processo.