CdS in Ingegneria Informatica - Prof. Paolo Bellavista
Compito A - 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:
reviewer progetto rapporto
dove progetto è un nome assoluto di file già esistente nel file system e rapporto un nome assoluto di file da crearsi come risultato dell'esecuzione del programma concorrente. progetto è un file che contiene la descrizione di un progetto di ricerca (file di testo organizzato in righe) che deve essere valutato concorrentemente da due processi in parallelo. Dopo aver effettuato gli opportuni controlli sugli argomenti, il processo iniziale P0 (moderatore) deve generare i due processi valutatori P1 (figlio) e P2 (nipote).
Per valutare il progetto, P1 e P2 devono leggere in maniera concorrente il contenuto del file progetto, giungere in maniera indipendente l'uno dall'altro ad una opinione sul progetto stesso, e scrivere tale opinione sul file rapporto. In particolare, P1 valuta progetto andando a contare le occorrenze della parola "wireless" nelle righe di posizione pari; la sua valutazione è semplicemente tale numero di occorrenze. Analogamente, P2 valuta progetto andando a contare le occorrenze della parola "mobile" nelle righe di posizione pari. Una volta calcolata la valutazione, in modo indipendente, ciascuno dei due processi deve scrivere sul file rapporto "Sono il figlio/nipote e la mia valutazione è:\n xxx\n"; inoltre la valutazione deve essere comunicata al padre tramite pipe.
Il padre moderatore deve ricevere le due comunicazioni e convincere (tramite invio di segnale) il processo valutatore con la valutazione più bassa ad accettare il giudizio maggiormente benevolo dell'altro valutatore. Il valutatore "cattivo" è costretto a scrivere in fondo al file rapporto "Sono il figlio/nipote e accetto la decisione unanime\n".
In caso di pressione di <CTRL-C> da parte dell'utente PRIMA che il moderatore abbia letto le valutazioni, il progetto deve essere considerato valutato positivamente e ogni processo deve scrivere "Accettazione unanime\n" sul file rapporto, che al termine dell'esecuzione deve contenere solo ed esclusivamente le suddette tre righe di testo.
Si facciano le scelte di sincronizzazione dei processi ritenute più opportune, cercando di sequenzializzare il meno possibile le varie operazioni richieste.
PS: per la ricerca di una stringa all'interno di un'altra stringa, si consideri la possibilità di utilizzare la funzione di libreria
char* strstr(char* where, char* s)
che cerca la stringa s, correttamente terminata, all'interno della stringa where, sempre correttamente terminata. strstr() restituisce NULL nel caso in cui s non sia contenuta in where, altrimenti il puntatore al primo carattere di where da cui parte la stringa s.
Compito C - Parte di Programmazione File Comandi UNIX (8 punti)
Si scriva un file comandi in bash Shell di Linux che abbia l'interfaccia:
oddeven absdir pari dispari
dove
absdir
è il nome assoluto di un direttorio esistente nel filesystem,
pari
e dispari
sono nomi assoluti di file non
esistenti nel filesystem. Si svolgano gli opportuni controlli sugli
argomenti di invocazione del file comandi.
Il compito del file
comandi è quello di esplorare la gerarchia individuata dal
direttorio absdir,
ossia il direttorio stesso e i suoi sottoalberi. Per ogni direttorio
esplorato, il file comandi deve contare il numero di sottodirettori
contenuti; nel caso tale numero sia pari e contemporaneamente sia
presente all'interno del direttorio stesso un file regolare (ossia né
direttorio né link) con un nome di lunghezza pari a 5
caratteri, il file comandi deve scrivere sul file pari
il nome assoluto del direttorio corrente e il numero di
sottodirettori contati. Nel caso duale in cui il numero di
sottodirettori sia dispari e contemporaneamente sia presente
all'interno del direttorio un file regolare con un nome di lunghezza
pari a 5 caratteri, il file comandi deve scrivere sul file dispari
il nome assoluto del direttorio corrente e il numero di
sottodirettori contati.
Qualora nessun direttorio sia presente
all'interno del direttorio esplorato, il nome del direttorio non deve
essere riportato nei file di output.
Si noti che i file pari
e dispari
devono essere creati solamente nel caso in cui almeno un direttorio
debba essere memorizzato al loro interno.
Al termine
dell'esplorazione, se il file pari
non è stato creato, il file comandi deve stampare il messaggio
di avvertimento "File pari non creato"; se il file dispari
non è stato creato, il file comandi deve stampare il messaggio
di avvertimento "File dispari non creato". Se invece tali
file sono stati creati, essi devono essere ordinati (in maniera
decrescente) secondo il valore del numero di sottodirettori contenuti
nei direttori inclusi.
Compito B - Parte di Programmazione Java Thread (8 punti)
Si scriva un programma Java che utilizzi lo strumento dei Thread per realizzare un sistema di stampa di documenti.
Prima di poter essere accettati per la stampa, i documenti devono attendere in coda il proprio turno.
Inoltre, prima dell'accettazione per la stampa, il sistema attribuisce a ogni documento un istante di stampa previsto, calcolato sommando semplicemente i tempi di stampa dei documenti precedentemente accettati. Si considerino due tipologie di documenti: testi e immagini. La prima ha un tempo di stampa pari a 7 unità di tempo, la seconda pari a 15.
I testi hanno priorità maggiore rispetto alle immagini: una immagine viene accettata per la stampa solamente nel caso in cui non ci siano testi in coda. Ciascuna coda deve essere gestita secondo una politica FIFO.
Il buffer della stampante ha capienza massima limitata, pari a N_MAX documenti. Solo dopo che N_MAX documenti sono stati accettati per la stampa, la stampante procede a stamparli. Per poter essere accettati per la stampa, i documenti rimanenti devono attendere che termini la stampa di tutti gli N_MAX documenti precedenti. Per semplicità, si supponga che ogni stampa di N_MAX documenti duri sempre un intervallo di tempo T=100, indipendentemente dal tipo di documenti stampati. Al termine della stampa di ogni documento, il sistema di stampa deve stampare a video un report contenente l'identificativo del documento e il valore dell'istante di stampa previsto che gli era stato attribuito all'ingresso nel sistema.
I file allegati Launcher.txt e Documento.txt contengono le implementazioni, rispettiùvamente, del programma principale e della classe Documento. Inoltre, il file Stampante.txt contiene uno scheletro della corrispondente classe. I candidati implementino i metodi mancanti acquire_img(), acquire_txt() e report () che servono a regolamentare l'accesso alla risorsa Stampante secondo le specifiche di sincronizzazione sopra illustrate.
Nota:
l'ordine della stampa dei report non deve necessariamente rispecchiare l'ordinamento di accettazione alla stampa.