Concorrenza nel server (ad esempio, progetto di un file system distribuito con allocazione fisica dei file su nodi remoti e trasparenza all'utente: le operazioni del file system su un file remoto necessitano di un supporto di comunicazione RPC):
assumiamo l’esistenza un programma RPC con questi servizi, che serva richieste contemporanee da clienti del file system.
Eventi per servire una richiesta:
La concorrenza dei servizi viene realizzata in quanto il dispatching può passare immediatamente alla attesa di nuovi messaggi, lasciando un processo concorrente per l'esecuzione del servizio, ma poiché la creazione di un processo concorrente per ogni richiesta è molto costosa, vi è la possibilità di creare un certo numero di processi pronti per l'esecuzione del servizio
Generazione dei processi concorrenti ad ogni richiesta:
uso della fork()
il processo figlio esegue il servizio.
il processo padre esce dalla procedura di dispatching e rientra ad aspettare le RPC.
Il processo padre non attende la terminazione del figlio (al fine di deallocarne l'area dati e registrarne la terminazione), quindi ad ogni terminazione di una procedura di servizio il processo figlio diventa zombie. Il padre per accorgersi della terminazione del figlio usa la primitiva wait3().
wait3() è una primitiva con comportamento asincrono non bloccante: per tutti i processi generati, legge lo stato di terminazione e dealloca. Se un figlio è già uscito (zombie) la primitiva ritorna immediatamente
pid_t wait3 (stat_loc, options, reserved)
int *stat_loc; /* stato di ritorno del figlio */
int options; /* opzioni di funzionamento */
int *reserved; /* in genere non usato: mettere a NULL */
con l’opzione WNOHANG la primitiva è non bloccante, cioè ritorna immediatamente se non ci sono figli da aspettare.

Condivisione del gestore di trasporto:
la fork() è invocata dopo la creazione del gestore di trasporto. Ne consegue quindi la condivisione dei file descriptor fra padre e figlio e del gestore di trasporto fra padre e figlio.
Problema: la condivisione fra figli dipende dal protocollo di trasporto
UDP: una sola socket
TCP : ad ogni messaggio una socket connessa al client, cioè nessuna condivisione fra figli diversi
Il gestore:
con UDP, conoscendo la socket del chiamante, reinvia alla socket relativa. È importante che arrivi un solo messaggio
con TCP utilizza la connessione del processo. È importante che si crei una connessione per ogni attività del server