Sistemi Operativi L-A

Compito A del 22 Settembre 2006

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:

chatModerata vietate nomeFileOut

dove vietate è un nome assoluto di file già esistente nel file system, mentre nomeFileOut deve essere aperto in append in scrittura se esistente oppure creato ex-novo se non presente nel file system. Dopo aver effettuato gli opportuni controlli sui parametri di invocazione, il processo iniziale P0 deve generare un processo P1 il quale, a sua volta, deve generare un processo P2 (nipote di P0). P2 svolgerà il ruolo di moderatore della chat, P0 il ruolo di cliente master della chat, e infine P1 il ruolo di cliente normale.

P0 sarà il primo a cominciare il dialogo con P1: per far questo invierà un messaggio "Apertura comunicazione" a P2 che lo trasferirà a P1. P1 risponderà con un messaggio di risposta "ACK", sempre comunicato a P0 attraverso P2. Solo dopo aver ricevuto il messaggio, P0 potrà inviarne uno ulteriore, di lunghezza qualsiasi (comunque minore di 255 caratteri), a P1; in seguito P1 potrà inviare un simile messaggio di risposta a P0, e così via, sempre con una interazione domanda-risposta.

La chat è moderata per evitare che i processi si insultino utilizzando improperi incivili. L'elenco dei messaggi vietati è contenuto nel file di testo vietate; ogni riga di tale file contiene un singolo messaggio vietato. Durante il funzionamento della chat, il cliente master P0 si può considerare "civile": esso chiederà all'utente di digitare un messaggio e si auto-modererà comunicando il messaggio a P2 solo se tale messaggio non è contenuto in vietate. P1 invece comunica ogni messaggio digitato dall'utente; per questo, in tal caso il moderatore P2 si deve incaricare di trasferire i soli messaggi non vietati di P1. Inoltre, il moderatore deve salvare tutti i messaggi a lui comunicati, sia accettabili che vietati, sul file di archivio nomeFileOut.

Se durante l'esecuzione della chat, P2 rileva che P1 ha inviato messaggi vietati per 3 volte, allora P2 deve immediatamente ripulire nomeFileOut dai messaggi vietati e forzare la terminazione del programma concorrente. Prima di terminare il programma concorrente, in ogni caso, P2 deve leggere tutti i messaggi eventualmente già inviatigli da P0 e P1; tali messaggi devono comunque essere salvati sull'archivio nomeFileOut.

 

Nota:

Si rammenta l'esistenza della funzione standard C/UNIX di utilità:

int strcmp(char* str1, char* str2)

inclusa nella libreria <string.h>

 

 

Parte Thread (8 punti)

Si scriva un programma che utilizzi i Java Thread per la gestione di code di persone in attesa di vedere un cortometraggio in una sala proiezioni.

Prima di avere la possibilità di entrare nella sala, 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. Ciascuna coda deve essere gestita secondo una politica FIFO.
La sala ha capienza massima limitata pari a PMAX unità. Gli adulti occupano due unità mentre i bambini ne occupano una.
Per evitare che le code diventino troppo lunghe, quando quella degli adulti supera la lunghezza MAXQUEUE, gli occupanti in eccesso hanno diritto di precedenza sui bambini in attesa, a meno che anche la coda dei bambini non superi anch'essa la lunghezza MAXQUEUE.
Solo dopo che PMAX persone sono entrate nella sala, la proiezione ha inizio; per poter entrare nella sala, le persone in coda devono attendere che la proiezione abbia termine e che tutti i vecchi PMAX occupanti lascino la sala.

I file allegati Launcher.java e Persona.java contengono le implementazioni, rispettivamente, del programma principale e della classe Persona. Inoltre, il file Proiezione.java contiene lo scheletro della classe Proiezione. I candidati implementino i metodi mancanti acquire_adult() e acquire_child() della classe Proiezione che servono a regolare l'accesso alla risorsa sala di proiezione secondo le specifiche di sincronizzazione sopra illustrate.

Per semplicità non ci si preoccupi di gestire la situazione in cui, avendo la sala raggiunto occupazione pari a PMAX-1, il programma concorrente rischia di rimane bloccato (gli adulti occupano due unità di spazio).