ESERCIZI per il LABORATORIO di SISTEMI OPERATIVI

La valutazione del profitto per ogni studente che segue il Laboratorio concorre all'assegnazione del voto finale del Corso di Sistemi Operativi ed è articolata in due fasi. Nella prima ciascuno studente dovrà fornire la soluzione di almeno tre degli esercizi riportati di seguito e dovranno coprire entrambi gli argomenti indicati. Il loro numero totale sarà aggiornato nel corso dell'anno accademico.

Alla termine del corso, durante l'ultima lezione, verrà assegnato un approfondimento, da realizzare in forma di breve relazione, riguardante uno dei protocolli di RETE a partire dagli argomenti discussi nelle ultime lezioni.

Programmazione della Shell

Gli esercizi proposti nel seguito devono essere realizzati utilizzando la bash shell di Linux, eventualmente nella forma ridotta di Bourne shell sh, il cui manuale è disponibile in formato PDF oppure in modalità ipertestuale

La soluzione degli esercizi deve essere accompagnata ciascuna da una breve relazione che ne spieghi le caratteristiche rilevanti dell'implementazione e da una traccia della loro esecuzione con un input di prova.

  1. Qualità di una connessione WiFi

    Si realizzi lo script wlanq che fornisce in uscita le informazioni di qualità della connessione, livello del segnale e rumore di una connessione WiFi, secondo quanto monitorato dal comando iwconfig che controlla la scheda wireless del PC. Si tenga presente che, in modalità non privilegiata, il suddetto comando permette di ottenere tutte le informazioni relative alle possibili connessioni wireless per cui è necessario estrarre specificatamente le informazioni indicate e fornirle ad intervalli regolari mediante rilettura ciclica, intervallata con un congruo tempo d'attesa (dell'odine dei secondi) realizzabile col comando sleep.

    Si tratta, in effetti, di realizzare il comando richiamabile dalla shell in accordo alla seguente sintassi
    wlanq   wlan-device   time
    dove wlan-device è il dispositivo wireless che si intende monitorare mentre time è un intero che rappresenta il numero di volte che si effetta la lettura della scheda wireless.

  2. Memo mediante PostIT

    Si supponga di utilizzare un webserver per tenere traccia di memo analogamente ai dei PostIT permettendone l'accesso ad un certo numero di utenti autorizzati. Allo scopo si deve prevedere la realizzazione di un meccanismo di autenticazione mediante login e passwd. Per essere autenticati il sistema si basa sul file postit.db che, in modo del tutto simile al file di autenticazione di sistema /etc/passwd, utilizza dei campo, uno per il login e l'altro per la passwd. Superata la fase di autenticazione, il sistema permette di registrare un breve messaggio utilizzando un campo textarea della form nella quale si deve poter accedere, con uno specifico campo select, alla lista dei messaggi già introdotti in precedenza. Quando un messaggio della lista viene selezionato, questo verrà riprodotto nello stesso campo textarea, di una nuova form, generata dinamicamente, a partire dalla quale si possa accedere ad un altro messaggio oppure introdurne uno nuovo. Si preveda anche la possibilità di cancellare vecchi messaggi.

    Si realizzi sia la pagina html postit.html che lo script CGI postit.cgi in modo che, ogni qualvolta l'utente autorizzato voglia leggere un messaggio, selezionato da una lista aggiornata dinamicamente, questo venga automaticamente copiato nell'apposita textarea oppure, pulendone il contenuto, possa accettare un nuovo messaggio opportunamente indicizzato per data di creazione. Tutte le operazioni devono avvenire in modo autenticato.

  3. Accesso alle Directory di Lavoro

    Si voglia gestire le directory di lavoro di un utente mediante la variabile d'ambiente DPATH in cui compare una lista di directory separate fra loro col carattere : analogamente a quanto visto per la variabile PATH. Si realizzi il comando cdpath che permette di mantenere e utilizzare tale lista secondo la sintassi generale che appare di seguito
    cdpath   l|c|a|i|d   [path | index]

    dove il primo parametro, scelto fra l, c, a, i o d rappresenta una delle azioni list, change, add, insert oppure delete. Il parametro successivo è parzialmente opzionale in quanto dipende dalla scelta dell'azione da eseguire. In questo senso non ci sono ulteriori parametri se il primo è scelto fra l, a o i per listare tutte le directory di lavoro oppure aggiungere in coda o inserire in testa la directory di lavoro corrente. Per cancellare una directory è necessario fornire il suo path, relativo alla home directory dell'utente mentre per cambiare directory è sufficiente fornire l'indice con cui compare nella lista delle directory.

    Tutte le directory in DPATH devono essere rappresentate come path relativi rispetto alla home directory. La variabile DPATH deve essere presente in uno degli script iniziali con cui viene lanciata la shell durante la fase di login. Si consiglia, a questo proposito, di modificare .bashrc oppure, se presente, .bash_profile o .profile.

Programmazione di Sistema in C

Gli esercizi proposti nel seguito devono essere realizzati nel linguaggio C impiegando, laddove è necessario, le chiamate di sistema e le funzioni di libreria del caso. A tal fine vanno aggiunte le opportune righe di include, contenenti i riferimenti ai file di intestazione (estensione .h) con le relative dichiarazioni di tipo e di funzione, ed inoltre compilare i sorgenti con le opzioni per il linker in modo ad ottenere la risoluzione dei nomi con le funzioni di libreria richieste.

  1. Gioco della Dama mediante threads

    Si realizzi il programma C draughts, che simula lo spostamento, su una scacchiera quadrata di lato N, di due o più pedine analogamente a quanto avviene per il gioco della dama. Allo scopo si ottenga tale comportamento mediante l'attivazione di 2*M + 1 thread, essendo M il numero di pedine per giocatore da muovere automaticamente in modo pseudocasuale. Il restante thread agisce come server scacchiera dei thread client associati alle pedine; esso riceve l'informazione dello spostamento richiesto dalla pedina e provvede ad eseguirlo cambiando la sua posizione sulla scacchiera, eventualmente, modificando il numero delle pedine in accordo alle regole del gioco.

    Si implementi il server in modo da mostrare su terminale il movimento delle pedine tramite il display grafico di una matrice N x N e si identifichi ciascuna pedina con un numero. Le pedine comunicano con un canale di comunicazione privato per ognuna di esse e il server ascolta ciclicamente in polling le richieste delle pedine client. Ad ogni aggiornamento ricevuto il server provvede a renderlo visibile su display.

    Ogni pedina, mediante generatore pseudocasuale, fornisce l'informazione della casella successiva, adiacente a quella in cui si trova, dove intende posizionarsi. Considerando che le caselle adiacenti sono complessivamente 4, perchè vanno considerate solo quelle connesse mediante un angolo, è sufficiente far si che il generatore pseudocasuale produca 4 valori distinti e univocamente interpretabili da spedire al server. Inoltre, si cerchi di implementare la regola del gioco della dama quando due pedine di colore diverso sono in contatto. Il valore di N (≥ 8) è arbitrario e lo stesso dicasi per M (≥ 2).

  2. Ordinamento di Interi

    Si realizzi, in forma di programma C, il comando di shell nsort la cui lista di interi da ordinare, in numero arbitrario, è passata come parametro obbligatorio e le cui modalità di funzionamento sono definite da due opzioni che possono comparire prima della lista stessa. Pertanto la sintassi del comando di shell da implementare è la seguente

    nsort  [-r] [-lN]  P1 P2 ... Pm

    dove P1, P2, ...,Pm è la lista da ordinare in ordine ascendente a meno che non sia presente il flag -r per cui l'ordinamento deve essere fatto in modo discendente. Se è presente il flag -l, allora l'intero N deve essere interpretato come limite superiore, oppure inferiore se è stato attivato il flag -r, dell'azione di ordinamento.

  3. Gioco della Tombola in connessione connessa

    Si realizzi il programma C tombola che fornisce il servizio del gioco della tombola in connessione connessa (socket stream), accettando richieste di connessione sulla porta 36990, oppure un'altra porta passata come parametro durante la fase di attivazione.

    Il numero dei giocatori client può essere qualunque purchè ciascuno si qualifichi prima dell'inizio della partita, cosicchè il server può rispondere assegnando il numero pos di identificazione. Il client risponde con il comando ready dopodicchè il server fornisce al client laa cartella, con codice pos e contenente 15 numeri, per mezzo dell comando card. Il server dà inizio alla partita estraendo un numero fra i 90 possibili con il comando start. Per estrarre il numero successivo, generato casualmente, è necessario attendere che tutti i giocatori abbiano risposto ready. Si consideri la possibilità di introdurre un timeout per evitare che la partita si blocchi in mancanza di risposta da uno dei client. Il comando serve con il numero di cartella, verrà utilizzato dal giocatore per notificare al server che ha realizzato una cinquina o una tombola. Il server lo notificherà a tutti i giocatori mediante il comando win

    Si supponga che ciascun giocatore acceda al servizio tombola mediante l'utilizzo di un client TELNET. Si definisca esattamente il protocollo di gioco a partire dai comandi appena illustrati, aggiungendone degli altri se necessario, e si implementino le azioni del server sulla falsa riga dello schema discusso a lezione.

    Si mostri, mediante una simulazione di gioco la lista dei comandi passati fra client e server e si realizzi all'interno del server la generazione delle cartelle e la gestione della sequenza di estrazioni dei numeri, in modo pseudocasuale, ma senza ripetizioni. Stessa cosa dicasi per il contenuto delle cartelle, i cui numeri devono apparire non ripetuti.

RIP: Routing Information Protocol

Partendo dalla documentazione ufficiale RFC della rete Internet, si considerino le specifiche RFC1058, RFC2453 e RFC2080 per il protocollo RIP (Routing Information Protocol) largamente utilizzato come protocollo di routing nelle reti locali. Anche se tende ad essere sostituito da protocolli Link State (OSPF) oppure distance-vector (EIGRP), la sua diffusione è data dalla sua capacità di adattarsi dinamicamente ai cambiamenti dei collegamenti di rete, favorendo lo scambio di informazioni relative alle reti che ogni router può raggiungere e quanto siano lontane.

Specialmente considerando il contenuto del primo dei tre documenti citati, si analizzino le caratteristiche del protocollo producendo una breve discussione in cui devono essere riportati e sinteticamente spiegati gli elementi essenziali per una possibile implementazione. A questo proposito è sufficiente utilizzare schemi a blocchi adeguatamente commentati, anche in formato grafico. Si tenga presente che RIP è stato sviluppato nel 1969 come parte di ARPANET, impiegando l'algoritmo Bellman-Ford. Si tratta, cioè, di un protocollo di routing distance-vector che utilizza il conteggio dei numeri di salti (hop count) come metrica di routing. Il massimo numero di hop permessi è 15.

Ogni router RIP trasmette per default, ogni 30 secondi, la propria tabella completa di routing a tutti i vicini direttamente collegati, generando grandi quantità di traffico di rete su reti a bassa capacità trasmissiva. Lavora sopra il livello di rete della suite Internet Protocol, usando pacchetti UDP (User Datagram Protocol) sulla Porta 520 per trasportare i relativi dati. Opzionalmente può utilizzare un meccanismo di ottimizzazione denominato split horizon il cui scopo è quello di evitare che, in presenza di determinate topologie di rete, si creino dei routing-loop.


  1. usando il comando
    HELLO <player>
  2. dal server si riceve la stringa
    NEXT <pos>
  3. il client replica con
    READY <pos>
  4. il server fornisce una cartella con il comando
    CARD  <pos>   N1 ... N15
  5. il server dà inizio alle giocate con
    START <number>
  6. e attende dai client la risposta
    READY <pos>
  7. un giocatore notifica la vincita al server con
    SERVE <pos>
  8. il server informa tutti i giocatori con
    WIN <pos>