Che cos'è un processo di zombi?
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 ad altri sistemi operativi simili a causa del modo in cui gestiscono i processi figlio. Al termine dell'esecuzione di un processo figlio, in genere il genitore è responsabile della sua rimozione dalla tabella dei processi. Di solito non è possibile rimuovere direttamente un processo zombi con il comando kill, anche se spesso il genitore può essere costretto a rimuoverlo se l'operatore utilizza la notifica SIGCHLD (Signal Child). In caso contrario, un processo di zombi può essere rimosso indirettamente uccidendo il genitore.
Il processo zombi è un termine metaforico descrittivo che fa riferimento ai morti viventi. Processi non funzionanti in Unix® e sistemi operativi simili possono essere considerati analoghi agli zombi in quanto mantengono una presenza nella tabella dei processi nonostante non eseguano più le funzioni previste. Quando un processo ha terminato l'esecuzione, a volte si dice che sia morto, mentre i mezzi con cui il sistema operativo recupera la sua allocazione della tabella dei processi può essere noto come mietitura. Il processo genitore di uno zombi dovrebbe tecnicamente raccogliere i suoi figli, sebbene ciò non sempre accada.
Ci sono alcuni casi in cui l'esistenza di un processo di zombi può essere intenzionale o addirittura desiderata. Al termine dell'esecuzione di un processo figlio, il genitore potrebbe dover eseguire in seguito un'altra istanza dello stesso programma. Se uno zombi non è stato rimosso dalla tabella dei processi, a un nuovo figlio non verrà assegnato lo stesso identificativo (ID) del bambino anziano. Alcuni programmi possono beneficiare o addirittura richiedere questo tipo di differenziazione.
Se un processo padre non ha eseguito il comando wait per raccogliere zombi di cui è responsabile, potrebbe essere possibile forzare il problema. Questo in genere viene eseguito tramite il comando kill e l'invio del segnale SIGCHLD al processo padre. Se tutto funziona correttamente, un processo genitore che riceve questo segnale dovrebbe raccogliere i suoi figli zombi 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, è possibile che il processo parent venga interrotto. Tutti gli zombi creati dal processo genitore 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 infine rimossi dalla tabella dei processi.