Cristiano Longo accessibilità e informatica

EtnaWeb Realizzazione siti Web

Programmazione multi-processo : il comando fork

Nonostante la semantica della fork sia abbastanza elementare, l'uso del comando fork stessa risulta spesso complesso. Questo perchè la programmazione multiprocesso ci impone di impostare il flusso di programma in maniera non lineare, come gli sviluppatori sono abituati a fare.

Introduzione alla programmazione multi-processo

I moderni sistemi operativi implementano la nozione di processo(task), in contrapposizione al modello batch. Nel modello batch i programmi venivano eseguiti uno per volta in successione. Il modello multiprocesso permette invece l'esecuzione in contemporanea di più programmi. In realtà nelle architetture con un singolo processore l'esecuzione non è realmente contemporanea, ma i programmi in esecuzione vengono schedulati. Questo significa che i programmi vengono eseguiti un pezzo per volta a rotazione.

Un programma in esecuzione viene definito processo. Un processo è costituito dal programma stesso, da uno stack e da uno heap dove vengono conservate le variabili, oltre che dalle informazioni riguardanti l'esecuzione del programma(Program Counter).

Il comando fork()

In realtà lo stesso programma può generare più di un processo. Questo è possibile grazie alla chiamata pid_t fork(void); Il comando fork è una chiamata di sistema disponibile sui sistemi unix-like. All'invocazione di fork il processo viene generato un processo figlio, del tutto identico al padre in ogni sua parte, ma totalmente separato.

Questo implica i seguenti fatti :

Valori di ritorno della fork

E' possibile creare differenti flussi di esecuzione nello stesso programma basandosi sui valori ritornati dalla fork. Il risultato della chiamata cambia infatti a seconda che a recepirlo siano il padre o il figlio. Al nuovo processo generato verrà ritornato il valore 0, mentre al processo padre verrà ritornato il process id del figlio appena generato. Il process_id è un numero asseganto dal sistema che identifica univocamente i processi.


	...
	if (fork==0){
		...
		istruzioni processo figlio
		...
		exit(0);
	} else {
		...
		istruzioni processo padre
		...
	}