Cosa sono i processi di un sistema operativo

I processi sono il pane quotidiano di chi si occupa di programmazione di sistemi operativi. Tuttavia, anche chi lavora a livello più alto dovrebbe saper andare oltra la definizione. In quest’articolo cercheremo di schiarirci le idee.

Cosa rappresenta?

Supponiamo di aver scritto un semplice hello world in C. Compilandolo, otterremo un file binario, detto eseguibile, un’entità passiva che giace inanimata su disco. Quando lo mandiamo in esecuzione, attraverso un doppio click o da linea di comando, di fatto stiamo chiedendo al sistema operativo di allocare uno spazio di indirizzamento, ossia una porzione di memoria RAM di dimensione opportuna, e di caricarvi l’eseguibile. Ciò che gira in memoria è un’istanza del nostro programma e che possiamo immaginare come qualcosa di vivo: questo è un processo.

Dunque, un processo rappresenta un programma in esecuzione, quindi, se lanciamo due volte un eseguibile, ad esempio, allora i processi in memoria saranno due.

Struttura

Il processo occupa una certa porzione di memoria RAM, che può essere partizionata in varie sezioni logiche. L’eseguibile, che contiene le istruzioni in codice macchina, è caricato nella cosiddetta sezione Code (o Text). Nella sezione Data, invece, vengono allocate le variabili globali del programma. Infine abbiamo due porzioni di memoria: lo Stack, per l’allocazione statica, e lo Heap, per l’allocazione dinamica. Magari approfondiremo la differenza in un articolo apposito, per il momento basti sapere che lo stack è una memoria veloce, ma limitata, mentre lo heap ha dimensione teoricamente infinita, ma un pochino più lenta. Stack e heap crescono di dimensioni e lo fanno andando a riempire quella porzione di memoria inutilizzata che c’è nel mezzo.

Struttura di un processo
Struttura di un processo

Nei sistemi operativi

Qualsiasi macchina, che sia un cellulare, un PC o un server, possiede un numero limitato di core. E va be, fin qui ci siamo. I processi, però, possono essere decine, centinaia, migliaia, perciò non possono essere in esecuzione contemporaneamente, se non secondo la nostra percezione. Dunque, un elemento centrale dei sistemi operativi è lo scheduler, uno strumento che decide quale processo dovrà essere eseguito nei successivi istanti di tempo. Alla base c’è una coda di processi in attesa e una politica di funzionamento, che è determinante all’efficienza dell’intero sistema. Lo scheduler fa un lavoro complicato, perché deve stabilire quale processo mandare in esecuzione, quale mettere in pausa, quale deve avere la priorità, pur evitando attese infinite (starvation). Per questo e per altri motivi ad ogni processo è associata una struttura dati detta Process Control Block (PCB), inserita nell’apposita process table, unica nel sistema, contenente varie informazioni utili, come un identificatore univoco, un livello di priorità, lo stato e così via.

Stato del processo

Un processo è un’entità dinamica, quindi soggetta a cambiamenti, pertanto possiede uno stato, un numero intero, ma che possiamo vedere semplicemente come un’etichetta. Durante l’atto di creazione il processo ha stato New e, una volta aggiunto alla coda dello scheduler, diventa Ready, pronto all’esecuzione. Al via libera dello scheduler, passa in stato di Running e le istruzioni vengono eseguite. A questo punto possono succedere varie cose. Se il processo lancia un’interrupt, ad esempio per comunicare con una periferica o per fare una certa richiesta al sistema operativo, torna in stato di Ready. Oppure, quando è richiesto il verificarsi di un certo evento, ad esempio un’operazione di input, lo stato diventa Waiting. Quando questo accade, lo scheduler rimette il processo in coda di attesa, perché il processo sta occupando risorse (diciamo la CPU) senza realmente utilizzarle. Anche sta volta, quando l’evento si è verificato, il processo torna in stato Ready. Come prima, verrà rimandato in esecuzione dallo scheduler, passando in stato di Running. L’alternativa rimasta inesplorata è quando tutte le istruzioni sono state eseguite, il che manda il processo in stato Terminated. A questo punto la memoria può essere liberata. Attenzione, però! Il PCB continua a rimanere nella process table e proprio per questo stato di non-morte si parla di processo zombie!

Stati del processo

Dovrebbe essere abbastanza chiaro, ora, cosa sia un processo, ma abbiamo appena grattato sulla superficie del sistema operativo. Nel prossimo articolo vedremo come creare e manipolare processi Unix.