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