Università degli Studi di Bergamo Laboratorio di Sistemi Operativi

Università degli Studi di Bergamo
Laboratorio di Sistemi Operativi a.a. 2015/16
Esercitazione finale
ESERCIZI BARRIERE
Fermo restando che ciascuno studente può scegliere gli strumenti di sincronizzazione (tra quelli visti a
lezione) che ritiene più opportuni nel realizzare i seguenti esercizi, le barriere (CyclicBarrier di
java.util.concurrent) risultano particolarmente indicate.
1) Distributed Grep
Implementare un programma Java che, dato un file di testo, restituisca in output le righe del file che
contengono una determinata parola. La ricerca deve avvenire in modo parallelo suddividendo il carico
computazionale su N thread Worker. Ogni Worker riceve in input un insieme di righe del file che vengono
emesse in output se la parola data è stata trovata.
2) URL Access Frequency
Implementare un programma Java che, dato in input un file di log che contiene un insieme di richieste per
pagine web, restituisca su stdout un insieme di coppie
<URL, total_count>
ovvero per ogni URL, determinare il numero totale di richieste effettuate (total_count).
Il conteggio deve avvenire in modo parallelo suddividendo il carico computazionale su N thread Worker.
Ogni Worker produce in output i risultati parziali relativi al conteggio delle URL presenti in una porzione
dell’input totale. Dopodiché una procedura di Merge dei risultati parziali si occupa di sommare il valore
total_count per medesimi URL.
3) Reverse Web-Link Graph
Dato in input un insieme di file di testo che rappresentano i link contenuti in una pagina web, dove il
nome del file è il nome (source) della pagina web e il contenuto è un insieme di URL (una per ogni riga),
implementare un programma Java che restituisca su stdout un insieme di coppie
<URL, list(source)>
ovvero per ogni URL associare una lista di pagine da cui l’URL è raggiungibile.
La computazione deve avvenire in modo parallelo suddividendo il carico computazionale su N thread
Worker. Ogni Worker produce in output i risultati parziali, ovvero un insieme di coppie
<URL, source>
per ogni URL presente nei file in input al Worker (un sottoinsieme dell’input totale). Dopodiché una
procedura di Merge dei risultati parziali si occupa di raggruppare i campi source per URL.
4) Inverted Index
Implementare un programma Java che, dato in input un insieme di file che contengono un insieme di
parole (word) restituisca su stdout un insieme di coppie del tipo
<word, list(document - count)>
ovvero per ogni word associare una lista di documenti in cui la parola è contenuta ed un contatore
(count) che indica la molteplicità di word all’interno di document.
La computazione deve avvenire in modo parallelo suddividendo il carico computazionale su N thread
Worker. Ogni Worker riceve in input un sottoinsieme dell’input totale e produce in output i risultati parziali,
ovvero un insieme di coppie
<word, document - 1>
per ogni word presente nei file in input al Worker. Dopodiché una procedura di Merge dei risultati parziali
si occupa di raggruppare per word e sommare gli “1” per ogni document in modo da ottenere il conteggio
totale.
ESERCIZI SCHEDULING
Fermo restando che ciascuno studente può scegliere gli strumenti di sincronizzazione (tra quelli visti a
lezione) che ritiene più opportuni nel realizzare il seguente esercizio, i Lock, le Condition Variable e l’uso
opportuno degli Interrupt risultano particolarmente indicati.
1) Non preemptive SJF
Implementare uno scheduler a livello applicativo in Java che adotti una politica Shortest Job First (non
preemptive). Creare una classe SJFSchedurel che, dato un insieme di thread, inizializzati con la durata
del picco, gestisca la coda di esecuzione e registri per ogni thread eseguito alcune statistiche:
- waiting time
- turnaround time
Infine quando tutti i thread sono terminati emettere su stdout:
- average waiting time
- average turnaround time
2) Preemptive SJF
Implementare uno scheduler a livello applicativo in Java che adotti una politica Shortest Job First
(preemptive). Creare una classe SJFSchedurel che, dato un insieme di thread, inizializzati con la durata
del picco, gestisca la coda di esecuzione e registri per ogni thread eseguito alcune statistiche:
- waiting time
- turnaround time
Infine quando tutti i thread sono terminati emettere su stdout:
- average waiting time
- average turnaround time