Esercitazione maggio 2011

Documenti analoghi
Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Esercizio sul Monitor in Java. 18 maggio 2011

Esercizi sul Monitor in Java. 22 Maggio 2015

Esercizio monitor. Sistemi Operativi T 1

Esercizi sul Monitor in Java

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Sistemi Operativi T. Esercizi

Esercitazione 3 Monitor. 22 Novembre 2012

Concorrenza e sincronizzazione

Esercitazione 15. Il problema dello Sleeping Barber

Esercizio sul Monitor. Ponte con utenti grassi e magri 11 Novembre 2013

Sincronizzazione con Java

Esercizio monitor con pthreads

Università degli Studi della Calabria Corso di Laurea in Ingegneria Informatica A.A. 2001/2002. Sistemi Operativi Corsi A e B. Esercitazioni 7 e 8

I Thread in Java. Sistemi Operativi L-A. I threads in Java

Esercitazione 2: Java Thread. Java Thread. Java Thread. Un thread:

Esercizio semafori Java

Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java

Compute engine generici in RMI

Esercitazione 11. Esercitazione di riepilogo

I Thread. un thread è uno stream di esecuzione del programma

Il costrutto monitor

Java thread, concorrenza

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Compute engine generici in RMI

Un esercizio d esame. Flavio De Paoli

Lab 4: Locks, Condition Variables in Java

SISTEMI OPERATIVI. Sincronizzazione in Java (Monitor e variabili condizione in Java)

ESERCITAZIONE 5!! 7 dicembre 2016!! Programmazione concorrente in ADA!!

THREAD IN JAVA. Thread. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

GESTIONE DEGLI ERRORI

Chat. Si ha un server in ascolto sulla porta Quando un client richiede la connessione, il server risponde con: Connessione accettata.

Multithreading in Java I parte. Lorenzo Gallucci

Esercizio sui Semafori

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Prova d Esame Compito A

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Java Threads. esempi

Lezione n.6 LPR A - INFORMATICA THREADS:, SINCRONIZZAZIONE ESPLICITA

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Esercitazione n.1 13 Ottobre Obiettivi:

Java RMI: Esempio Completo di un Applicazione Distribuita

Classi Wrapper. int Integer float Float char Char byte Byte double Double. classe "wrapper"

Soluzioni ai problemi di Mutua Esclusione Primitive di sincronizzazione. Soluzioni ai problemi di Mutua EsclusionePrimitive di sincronizzazione

Programmazione concorrente in Java

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Corso di Reti di Calcolatori L-A

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Java threads (2) Programmazione Concorrente

Ottava Esercitazione. introduzione ai thread java mutua esclusione

LinuxThreads. LinuxThreads: monitor & variabili condizione

Algoritmi di Ricerca. Esempi di programmi Java

Esercizio di Sincronizzazione tra Processi: Ponte a Senso Unico Alternato con Capacità Limitata e Senza Starvation

Server Sequenziale. Server Concorrente. Esercitazione: Socket Java con connessione

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Informatica 3 secondo recupero 13 Settembre 2002

Il costrutto monitor

Java, Oggetti e Strutture Dati di G. Callegarin - Edizioni CEDAM

Algoritmi di Ricerca. Esempi di programmi Java

Esercizi della lezione 5 di Java

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

Programmazione concorrente con il linguaggio Java

Sistemi Operativi e Laboratorio, Prova del 6/4/2017 versione A

Il costrutto monitor [Hoare 74]

Algoritmi di Ricerca. Esempi di programmi Java

Esercitazione. Docente Ing. Mariateresa Celardo

Le eccezioni in Java

Esercitazione 4 Programmazione Concorrente in Java

Corso: Fondamenti di Informatica (Canale 5) a.a Corsi di laurea: Ing. Settore Informazione

Multithreading. Multithreading/2

La concorrenza in Java package java.util.concurrent Antonio Furone

Ingegneria del Software

Esempio: Interfacce. Gioco Interfacce

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Esempio: la Toilette Unisex

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Multithreading in Java. Fondamenti di Sistemi Informativi

Esempio: Interfacce. Gioco Interfacce

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Insieme.java. Printed by Paolo. Feb 24, 04 16:44 Page 1/1 class Insieme { private int[] elementi; Tuesday February 24, /10

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Il costrutto monitor [Hoare 74]

19. Introduzione al multi-threading

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

Uguaglianza e copia di oggetti

Sincronizzazione. Problemi di sincronizzazione tipici Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

Laboratorio di Programmazione 1 [Java]

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Eccezioni Precisazioni e approfondimenti

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

Thread THREAD IN JAVA. Un thread (lightweight process) è un singolo flusso sequenziale di controllo all interno di un processo

Esempi in Java di program.ne O-O

Il monitor. Sistemi Operativi T AA

Chiamata di procedura remota

Transcript:

Esercitazione 11 23 maggio 2011 Monitor in Java Esercizio 1 In un sito di interesse geologico e` possibile visitare una grotta sotterranea, raggiungibile soltanto attraverso uno stretto cunicolo. Per motivi di sicurezza, la grotta non puo` ospitare piu` di MAX visitatori contemporaneamente. Il cunicolo e` cosi` stretto, da non consentire il passaggio contemporaneo di 2 persone in direzioni opposte: il cunicolo deve quindi essere percorso a senso unico alternato. Per evitare situazioni di deadlock, nell'accesso al cunicolo i processi in uscita dalla grotta devono essere favoriti rispetto a quelli in ingresso. Utilizzando il linguaggio Java, realizzare una politica di controllo degli accessi alla grotta che tenga conto delle specifiche indicate. 1

OUT IN Cunicolo Senso unico alternato Precedenza ai thread in uscita Grotta capacità MAX Impostazione Quali thread? n visitatori, ognuno con la medesima struttura: 1. <entrata tunnel in direzione IN> 2. <attraversamento tunnel in direzione IN> 3. <uscita tunnel in direzione IN - ingresso grotta> 4. <visita grotta> 5. <uscita grotta - entrata tunnel in direzione OUT> 6. <attraversamento tunnel in direzione OUT> 7. <uscita tunnel in direzione OUT> Quale risorsa comune? Grotta: associamo alla Grotta un "monitor", che controlla gli accessi in base alla politica data. La sincronizzazione viene realizzata mediante variabili condizione. Metodi public: entrata e uscita dal tunnel (1,3,5,7) 2

Struttura Thread public class visitatore extends Thread{ private final int IN=0; private final int OUT=1; monitor g; int id; public visitatore(monitor G, int ID){ g=g; id=id; public void run() { try { g.entratunnel(in, id); sleep((int)(math.random()*1000));// attrav. Tunnel ingresso g.escitunnel(in, id); sleep((int)(math.random()*5000)); g.entratunnel(out, id); sleep((int)(math.random()*1000)); // attrav. Tunnel uscita g.escitunnel(out, id); catch (Exception e) { Monitor grotta: variabili Stato del Tunnel: Numero visitatori nella grotta: private int dentro; Numero visitatori nel tunnel per ogni direzione: private int []tunnel=new int[2]; Sincronizzazione: lock: private Lock lock = new ReentrantLock(); Per la sospensione dei thread che vogliono accedere al tunnel, 1 condition per ogni direzione: private Condition []coda=new Condition[2]; Contatori dei thread sospesi per ogni direzione: private int []sosp=new int[2]; 3

Monitor public class monitor { private final int MAX=7; //capacita` della grotta //costanti di direzione: private final int IN=0; private final int OUT=1; private Lock lock = new ReentrantLock(); private Condition []coda=new Condition[2]; private int dentro; //persone nella grotta private int []tunnel=new int[2]; //persone nel tunnel per ogni direzione private int []sosp=new int[2]; //persone sospese per ogni direzione public monitor() { int i; for (i=0; i<2; i++) { tunnel[i]=0; sosp[i]=0; coda[i]=lock.newcondition(); dentro=0; Monitor public void EntraTunnel(int d, int id) throws InterruptedException { lock.lock(); try { if (d==in) { while ((tunnel[out]>0) (dentro+tunnel[in]==max) sosp[out]>0) { sosp[d]++; coda[d].await(); sosp[d]--; tunnel[d]++; else //uscita dalla grotta { while (tunnel[in]>0) { sosp[d]++; coda[d].await(); sosp[d]--; tunnel[d]++; dentro--; System.out.println("visitatore "+id+" entrato in dir."+d+"\n"); finally {lock.unlock(); 4

Monitor public void EsciTunnel(int d, int id) throws InterruptedException { lock.lock(); try { tunnel[d]--; if (d==in) dentro++; if (tunnel[d]==0) //corridoio vuoto coda[altra(d)].signalall(); System.out.println("vis. "+id+ " uscito in direzione"+d+"\n"); finally {lock.unlock(); Monitor public void EsciTunnel(int d, int id) throws InterruptedException { lock.lock(); try { tunnel[d]--; if (d==in) dentro++; if (tunnel[d]==0) //corridoio vuoto coda[altra(d)].signalall(); System.out.println("vis. "+id+ " uscito in direzione"+d+"\n"); finally {lock.unlock(); private int altra(int dir) { int ret; if (dir==in) ret=out; else ret=in; return ret; // fine monitor 5

Test import java.util.concurrent.*; public class Grotta { public static void main(string[] args) { int N=10; int i; int NV; visitatore [] V = new visitatore[n]; monitor g=new monitor(); for (i=0;i<n;i++) //creazione uomini e donne V[i] = new visitatore(g,i+1); for (i=0;i<n;i++) //attivazione V[i].start(); Esercizio 2 Si consideri un sito web dedicato ai collezionisti di figurine dell album Campionato di calcio 2010-2011. L album è composto da 100 diverse figurine, ognuna individuata univocamente da un intero; tra di esse, 30 sono classificate come figurine rare, e le rimanenti 70 come figurine normali. Il sito offre un servizio che permette ad ogni utente collezionista di effettuare scambi di figurine. A questo scopo il sistema gestisce un deposito di figurine, nel quale, per ogni diversa figurina vi può essere più di un esemplare. 6

Il meccanismo di scambio, è regolamentato come segue: Si può scambiare solo una figurina alla volta; Richiesta di scambio: ogni utente U che desidera una figurina A può ottenerla, se a sua volta offre un altra figurina B; in seguito a una richiesta di scambio, il sistema aggiunge la figurina B all insieme delle figurine disponibili e successivamente verifica se esiste almeno una istanza di A disponibile: se A è disponibile, essa viene assegnata all utente, che può così continuare la propria attività; se A non è disponibile, l utente U viene messo in attesa. Si progetti la politica di gestione del servizio di scambio che tenga conto delle specifiche date e che inoltre soddisfi il seguente vincolo: le richieste di utenti che offrono figurine rare abbiano la precedenza sulle richieste di utenti che offrono figurine normali; Si realizzi un applicazione nel linguaggio Java che, utilizzando il concetto di monitor, implementi la politica di gestione data. Spunti e suggerimenti (1) Quali thread? thread iniziale K utenti del servizio Thread iniziale Utente 1 Utente 2 Utente K Quale risorsa comune? Deposito delle Figurine associamo al Deposito un "monitor", che controlla gli accessi in base alla specifica politica di accesso. La sincronizzazione viene realizzata mediante variabili condizione 7

Spunti e suggerimenti (2) Struttura dei thread: public class collezionista extends Thread{ private monitor M; private int offerta, richiesta, max; public collezionista(monitor m, int NF){ this.m=m; this.max=nf; public void run(){ try { while (true) { <definizione di offerta e richiesta> M.scambio(offerta, richiesta); Thread.sleep(250); catch (InterruptedException e) { Monitor Deposito Figurine Stato del Deposito: Figurine disponibili: vettore di 100 interi (uno per figurina della collezione) private int[] FIGURINE; Dove: FIGURINE[i] è il numero di esemplari disponibili della figurina i. Convenzione adottata: Se i<30, si tratta di una figurina rara; Se i>= 30, si tratta di una figurina comune. 8

Monitor Deposito Figurine Sincronizzazione: Lock per la mutua esclusione: private Lock lock = new ReentrantLock(); Condition. Per la sospensione dei thread in attesa di una figurina, definiamo 2 condition (una per ogni livello di priorità): private Condition rare= ; //coda thread che hanno offerto figurine rare private Condition normali= ; //coda thread hanno offerto figurine normali Contatori dei thread sospesi in ogni coda: private int[] sosprare; private int[] sospnormali; Definizione Monitor public class monitor { //Dati: private final int N=100; //numero totale di figurine private final int maxrare=30; private int[] FIGURINE; //figurine disponibili private Lock lock= new ReentrantLock(); private Condition rare= lock.newcondition(); private Condition normali= lock.newcondition(); private int[] sosprare; private int[] sospnormali; //Costruttore: public monitor(int N ) { //metodi "entry": public void scambio(int off, int rich) throws InterruptedException { 9