Che cos’è un processo zombie?

Un processo zombie è un’istanza di un programma per computer che conserva un record della tabella dei processi nonostante abbia terminato l’esecuzione. Processi defunti come questi sono in genere associati a Unix® e altri sistemi operativi simili a causa del modo in cui gestiscono i processi figlio. Quando un processo figlio ha terminato l’esecuzione, il genitore è in genere responsabile della sua rimozione dalla tabella dei processi. Di solito non è possibile rimuovere direttamente un processo zombie con il comando kill, sebbene spesso si possa fare in modo che il genitore lo rimuova se l’operatore utilizza la notifica del figlio del segnale (SIGCHLD). In caso contrario, un processo zombie può essere rimosso indirettamente uccidendo il genitore.

Il processo zombie è un termine descrittivo metaforico che fa riferimento ai morti viventi. I processi defunti in Unix® e sistemi operativi simili possono essere visti come analoghi agli zombi in quanto mantengono una presenza nella tabella dei processi nonostante non svolgano più le funzioni previste. Quando un processo ha terminato l’esecuzione, a volte si dice che sia morto, mentre il mezzo con cui il sistema operativo recupera la sua allocazione della tabella del processo può essere noto come mietitura. Tecnicamente si suppone che il processo genitore di uno zombi mieti i suoi figli, anche se ciò non accade sempre.

Ci sono alcuni casi in cui l’esistenza di un processo zombie può essere intenzionale o addirittura desiderata. Dopo che un processo figlio ha cessato l’esecuzione, il genitore potrebbe dover eseguire un’altra istanza dello stesso programma in un secondo momento. Se uno zombi non è stato rimosso dalla tabella dei processi, a un nuovo bambino non verrà assegnata la stessa identificazione (ID) del bambino precedente. Alcuni programmi possono beneficiare o addirittura richiedere questo tipo di differenziazione.

Se un processo padre non ha eseguito il comando wait per raccogliere gli zombi di cui è responsabile, potrebbe essere possibile forzare il problema. Questo viene in genere fatto tramite il comando kill e inviando il segnale SIGCHLD al processo padre. Se tutto funziona correttamente, un processo genitore che riceve questo segnale dovrebbe raccogliere i suoi figli zombie in modo che i loro ID e le posizioni della tabella dei processi possano essere riutilizzati.

In determinate circostanze, un processo genitore può ignorare il segnale SIGCHLD. Se ciò si verifica e l’operatore desidera ancora che la tabella dei processi venga cancellata, il processo padre può essere interrotto. Tutti gli zombi creati dal processo padre verranno quindi assegnati come figli al processo init. Poiché init avvia periodicamente il comando wait sui suoi figli, tutti gli zombi di cui è responsabile verranno eventualmente rimossi dalla tabella dei processi.