Processo zombie
# Processo zombie

Un processo zombie (processo defunto) nei sistemi operativi Unix e Unix-like è un processo informatico che, nonostante abbia terminato la propria esecuzione, possiede ancora un PID ed un Process control block, necessario per permettere al proprio processo padre di leggerne il valore di uscita.

## Origine del termine

Il termine processo zombie deriva dalla definizione comune di zombie: una persona non completamente morta. Seguendo questa metafora, il processo figlio è morto ma non è stato ancora mietuto dalla grande falciatrice (la morte personificata ha con sé una falce fienaia).

## Origine dei processi zombie

Quando un processo termina, tutta la memoria e le risorse ad esso associate vengono liberate così da poter essere utilizzate da altri processi. Ciò nonostante, il process control block del processo resta nella tabella dei processi (process table) affinché il processo padre possa leggerne il valore di uscita eseguendo la chiamata di sistema wait, al seguito della quale il processo zombie viene definitivamente rimosso. La chiamata a wait può essere eseguita in normale codice sequenziale ma, più comunemente, viene invocata all'interno di un gestore del segnale SIGCHLD, il quale è inviato ad un processo padre ogniqualvolta un proprio processo figlio muore. In seguito alla rimozione del processo zombie, i relativi PID e process control block possono essere riutilizzati.

Quando il processo padre non invoca la chiamata di sistema wait, il processo zombie continua a rimanere nella tabella dei processi: in alcuni casi ciò viene fatto di proposito, ad esempio quando il processo padre, creando un nuovo processo figlio, vuole assicurarsi che questo abbia un PID diverso da un figlio creato in precedenza appena terminato.

Lo standard POSIX.1-2001, a differenza del precedente POSIX.1-1990, permette di ignorare esplicitamente il segnale SIGCHLD, impostandone SIGN IGN come gestore, così da poter scartare il valore di uscita di un processo ed evitare che questo diventi zombie. Questo comportamento è seguito ad esempio dai sistemi operativi basati su Linux (a partire dalla versione 2.6 del kernel) e da HP-UX, mentre altri sistemi, come gli storici sistemi BSD e UNIX System V, seguono comportamenti differenti che rendono l'uso di wait l'unico modo certo per evitare la creazione di processi zombie.

## Identificazione di processi zombie

I processi zombie possono essere identificati dall'output del comando Unix ps tramite la presenza di una "Z" nella colonna STAT. Processi zombie che persistono più a lungo di un breve periodo di tempo tipicamente indicano un bug del programma padre. Come capita per altri tipi di memory leak, la presenza di pochi processi zombie non preoccupa di per sé, ma può prospettare un problema che sotto maggiori carichi di sistema diverrebbe serio. Dato che non vi è memoria allocata per i processi zombie a parte il process control block stesso, il problema principale non è il consumo di memoria quanto l'esaurimento dei PID disponibili e il riempimento della tabella dei processi, cose che porterebbero all'impossibilità di creare nuovi processi.

## Eliminazione di processi zombie

Per eliminare un processo zombie nel caso tipico in cui il suo processo padre non recupera il suo valore di uscita occorre eliminare il suo processo padre, ad esempio inviando a quest'ultimo un segnale SIGTERM o SIGKILL.

Così facendo, il processo zombie diviene un processo orfano, che viene immediatamente adottato da init il quale esegue periodicamente la chiamata di sistema wait o waitpid, mietendo così i propri processi figli zombie.

