CdS in Ingegneria Informatica - Prof. Paolo Bellavista
Parte di Programmazione di Sistema (16 punti)
Si scriva un programma C che, utilizzando le system call del sistema operativo UNIX, abbia un'interfaccia del tipo
compito120906A fileOut
dove fileOut è un nome assoluto di file che deve essere creato dall'esecuzione del programma concorrente.
Dopo aver effettuato gli opportuni controlli sull'unico argomento, il processo iniziale P0 (arbitro) deve generare un processo figlio P1 (calciatore) e un processo nipote P2 (portiere). Dopo il fischio dell'arbitro (segnalazione), il processo calciatore deve decidere a caso se tirare a sinistra o a destra, scrivere "Tiro a sin/des" sul file fileOut e comunicare tale decisione all'arbitro; contemporaneamente, il processo portiere deve decidere a caso se parare a sinistra o a destra, scrivere "Mi tuffo a sin/des" su fileOut e comunicare tale decisione all'arbitro. Ricevuta tale coppia di comunicazioni, P0 deve scrivere su fileOut "Rigore num. i parato/segnato"; solo dopo tale scrittura si può passare a tirare un altro calcio di rigore, sempre usando il fischio dell'arbitro per coordinare la partenza degli altri processi.
Il programma concorrente deve terminare o dopo
dieci rigori o alla pressione di <CTRL-C> da parte dell'utente. Nel caso
di terminazione forzata dall'utente, l'arbitro non deve far tirare più
nuovi rigori, ma occuparsi di elaborare tutte le comunicazioni già ricevute
e scrivere su fileOut "Partita interrotta dopo x rigori". Dunque,
alla fine dell'esecuzione del programma concorrente, fileOut conterrà
o 30 righe di testo (di cui la terza, sesta, nona, ... sono sempre uguali a
"Rigore num. i parato/segnato") oppure alcune terne di righe scritte
dai tre processi e terminate dalla stringa "Partita interrotta dopo x rigori".
Come sempre, si facciano le scelte di sincronizzazione dei processi ritenute
più opportune, cercando di sequenzializzare il meno possibile le varie
operazioni richieste.
P.S.: Si ricorda l'esistenza della funzione
di libreria (in stdlib.h)
long rand(void);
per la scelta casuale di un numero intero lungo positivo. Per scegliere fra
sinistra e destra si potrebbe semplicemente estrarre un numero a caso e valutare
se risulta pari (destra) o dispari (sinistra).
Parte Thread (8 punti)
Si scriva un programma che utilizzi i Java Thread per la gestione di code di persone in attesa di fare un giro panoramico su un trenino.
Prima di avere la possibilità di salire
in carrozza le persone devono attendere in coda il proprio turno. Si considerino
due tipi di persone: adulti e bambini.
I bambini hanno priorità maggiore rispetto
agli adulti: un adulto viene fatto salire solamente nel caso in cui non vi siano bambini in coda. Ciascuna coda deve essere gestita secondo una politica FIFO.
Il trenino ha capienza massima limitata pari a PMAX.
Una volta che PMAX persone sono salite (e solo in questo caso) il trenino parte. Per poter salire, le persone in coda devono attendere che il trenino torni indietro e che tutti i PMAX occupanti lascino la vettura.
I file allegati Launcher.java e Persona.java contengono le implementazioni, rispettivamente, del programma principale e della classe Persona. Inoltre, il file Trenino.java contiene lo scheletro della classe Trenino. I candidati implementino i metodi mancanti acquire_adult() e acquire_child() della classe Trenino che servono a regolare l'accesso alla risorsa trenino secondo le specifiche di sincronizzazione sopra illustrate.