Sistemi Operativi L-A

Compito di martedì 26 Giugno 2007

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:

  1. l'ordine della stampa dei report non deve necessariamente rispecchiare l'ordinamento di accettazione alla stampa.