11.07.2015 Views

Amministrare GNU/Linux - Cia

Amministrare GNU/Linux - Cia

Amministrare GNU/Linux - Cia

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1.3. L’ARCHITETTURA DEI PROCESSI 29l’esecuzione in qualunque momento) fintanto che non lo si fa ripartire (anche per questo è previstoun altro segnale).Infine c’è lo stato di zombie, il cui significato può essere compreso solo ritornando con maggioridettagli sulla relazione fra processo padre e gli eventuali figli. La relazione padre/figlio infattiè ben definita finché entrambi i processi sono attivi nel sistema, ma se uno dei due terminacosa accade? Alla terminazione di un processo il kernel provvede ad una serie di compiti dipulizia; tutti i file aperti dal processo vengono chiusi, la memoria utilizzata viene liberata econ essa tutte le risorse occupate dal processo. Resta il problema di come notificare l’avvenutaconclusione del processo, ad esempio se questa è stata regolare o è stata dovuta ad un qualcheerrore, ma soprattutto il problema è a chi fare questa notifica.Dato che in un sistema Unix tutto viene fatto con i processi, la scelta è stata quella per cui ècompito del padre ricevere lo stato di uscita del figlio e controllare se tutto è andato bene o c’èstato qualche errore; quando un processo termina al padre viene inviato uno speciale segnale chelo avvisa del fatto, e lui deve invocare una apposita system call per ricevere lo stato di uscita.Questo ad esempio è il meccanismo con cui la shell riceve lo stato di uscita dei comandi che sisono eseguiti.Se questo non viene fatto comunque il processo figlio si conclude regolarmente e tutte lerisorse che occupava nel sistema vengono rilasciate, resta allocata soltanto una voce nella tabelladei processi che contiene le informazioni per riportare lo stato di uscita. Questo è quello chein gergo viene chiamato uno zombie, cioè un processo che non esiste più, perché è terminato,ma che mostra una voce con lo stato Z nella lista fornita da ps e che di nuovo non può essereterminato, per il semplice fatto che lo è già. È pertanto compito di chi scrive programmi checreano processi figli curarsi della ricezione del loro stato di uscita, ed infatti i programmi benscritti non presentano mai questo problema.Di per sé la presenza di uno zombie non è un grave problema, in quanto esso non occupa(a differenza di un processo bloccato in stato D) nessuna risorsa nel sistema, tranne la vocemantenuta nell’output di ps. Però uno zombie occupa comunque una voce nella tabella deiprocessi e pertanto se il numero degli zombie cresce si può rischiare di saturare quest’ultima,rendendo inutilizzabile il sistema. Vedremo fra poco però che, a differenza dei processi in statoD, per gli zombie è possibile risolvere il problema e far si che essi siano terminati regolarmentesenza dover riavviare il sistema.Per capire come comportarsi con gli zombie si deve considerare un altro caso della gestionedel funzionamento dei processi: quello in cui è il padre che termina per primo. Se accade questochi è che riceverà lo stato di terminazione dei figli? Dato che i processi sono eseguiti in manieradel tutto indipendente un caso come questo è assolutamente naturale, e si dice che il figlio diventaorfano. Per questo il sistema controlla, durante le operazioni di terminazione di un processo, sequesto ha dei figli, e nel caso assegna a questi ultimi init come nuovo padre. 38 Si dice allora cheinit adotta i figli dei processi che terminano, e sarà lui che gestirà, alla terminazione di questiultimi, la ricezione del loro stato di uscita.Perciò, dato che init è scritto bene e sa gestire la ricezione dello stato di uscita, tutto quelloche serve fare per eliminare gli zombie dal sistema è renderli orfani terminando il processo cheli ha generati. 39 In questo modo essi saranno adottati da init che si curerà immediatamente diriceverne lo stato di uscita liberando la voce che occupavano nella tabella dei processi.Si noti nella lista precedente la presenza di alcuni processi con una lettera aggiuntiva W nellacolonna STAT, con un nome del comando fra parentesi quadre e con un PID molto basso; questinon sono processi effettivamente lanciati da init quanto dei processi interni al kernel (e da38 si vedrà cioè, ad una successiva esecuzione di ps con opzioni che permettano di visualizzare il PID del padre,che questo è diventato 1.39 per poterlo fare però occorre avere un processo in grado di eseguire il comando, cosa non facile da ottenerese si è già esaurita la tabella dei processi.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!