Esercizi sul Monitor in Java



Documenti analoghi
Esercizio sul Monitor in Java. 18 maggio 2011

Esercizi sul Monitor in Java. 22 Maggio 2015

I Thread in Java parte 2: Sincronizzazione. Sistemi Operativi T AA

Il costrutto monitor [Hoare 74]

I Thread in Java! parte 2:! Sincronizzazione!

Il costrutto monitor [Hoare 74]

Esercitazione maggio 2011

Java threads (2) Programmazione Concorrente

DTI / ISIN / Titolo principale della presentazione. La cena dei filosofi. Amos Brocco, Ricercatore, DTI / ISIN. 14 maggio 2012

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Esercizio monitor. Sistemi Operativi T 1

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Multithreading in Java. Fondamenti di Sistemi Informativi

Un esercizio d esame. Flavio De Paoli

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

Informatica 3. Informatica 3. LEZIONE 6: Il controllo dell esecuzione. Lezione 6 - Modulo 1. Errori durante l esecuzione. Il controllo dell esecuzione

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

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

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Programmazione concorrente in Java

Java Virtual Machine

Sistemi Operativi Esercizi Sincronizzazione

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

Problema del buffer limitato. Lorenzo Gallucci

Il costrutto monitor

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ-DYD 6RFNHWGLWLSRVWUHDP

Soluzione 1. Filosofo i

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Esercizi sugli Oggetti Monitor

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

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

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

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Esercizi della lezione 5 di Java

Corso sul linguaggio Java

GESTIONE DEI PROCESSI

Sincronizzazione con Java

Sistemi Operativi T. Esercizi

Gestione dei thread in Java LSO 2008

Sistemi Operativi L-A. Esercizi 14 Giugno Esercizio monitor

progam ponteasensounicoalaternato ; type dir = ( nord, sud );

Compute engine generici in RMI

Multithreading in Java II parte. Lorenzo Gallucci

Esercizio Sincronizzazione Thread

Concorrenza e sincronizzazione

19. Introduzione al multi-threading

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

Synchronized (ancora)

Corso di Reti di Calcolatori L-A

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

Sincronizzazione con Java

Sistemi Operativi. Lez. 13: primitive per la concorrenza monitor e messaggi

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori A.A. 2009/2010

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Gestione delle Eccezioni

Programmazione Concorrente in Java

Programmazione concorrente con il linguaggio Java

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Monitor pthreads. Esercizio

Main System Monitor Keyboard

Sistemi Operativi. Lezione 7 Comunicazione tra processi

Monitor. Introduzione. Struttura di un TDA Monitor

Esercizio sui Semafori

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

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

Java RMI: Esempio Completo di un Applicazione Distribuita

Esercitazione n 4. Obiettivi

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Architettura Client-Server

Esercitazione 15. Il problema dello Sleeping Barber

Definizione di classi con array di oggetti

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Esercizio 6 Realizzare una classe astratta per le Figure piane e due sottoclassi, la sottoclasse Quadrato e la sottoclasse Rettangolo.

13. Chain of Responsibility

Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

Lezione n.3 LPR A - Informatica. Threads: Race Conditions, Locks

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

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

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

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

SISTEMI OPERATIVI. Sincronizzazione in Java (Semafori e barriere) Patrizia Scandurra (MODULO DI INFORMATICA II) LABORATORIO

Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D

Esempi di esercizi d esame

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Telematica II 17. Esercitazione/Laboratorio 6

I thread nel sistema operativo LINUX: Linuxthreads

MagiCum S.r.l. Progetto Inno-School

LA SINCRONIZZAZIONE TRA PROCESSI

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

Controllo degli accessi

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Esercitazione 4 Programmazione Concorrente in Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Corso sul linguaggio Java

Transcript:

Esercizi sul Monitor in Java 1

I filosofi a cena (E. Dijkstra, 1965) 5 filosofi sono seduti attorno a un tavolo circolare; ogni filosofo ha un piatto di spaghetti tanto scivolosi che necessitano di 2 forchette per poter essere mangiati; sul tavolo vi sono in totale 5 forchette. Ogni filosofo ha un comportamento ripetitivo, che alterna due fasi: una fase in cui pensa, una fase in cui mangia. Rappresentando ogni filosofo con un thread, realizzare una politica di sincronizzazione che eviti situazioni di deadlock. 2

3

Osservazioni i filosofi non possono mangiare tutti insieme: ci sono solo 5 forchette, mentre ne servirebbero 10; 2 filosofi vicini non possono mangiare contemporaneamente perche` condividono una forchetta e pertanto quando uno mangia, l'altro e` costretto ad attendere 4

Soluzione n.1 Quando un filosofo ha fame: 1. prende la forchetta a sinistra del piatto 2. poi prende quella che a destra del suo piatto 3. mangia per un po 4. poi mette sul tavolo le due forchette. Possibilita` di deadlock: se tutti i filosofi afferrassero contemporaneamente la forchetta di sinistra, tutti rimarrebbero in attesa di un evento che non si potra` mai verificare. 5

Soluzione n.2 Ogni filosofo verifica se entrambe le forchette sono disponibili: in caso affermativo, acquisisce le due forchette (in modo atomico); in caso negativo, aspetta. in questo modo non si puo` verificare deadlock (non c'e` possesso e attesa) 6

Realizzazione soluzione 2 Quali thread? filosofo Risorsa condivisa? la tavola apparecchiata -> definiamo la classe tavola, che rappresenta il monitor allocatore delle forchette 7

Struttura Filosofo i public class filosofo extends Thread { tavola m; int i; public filosofo(tavola M, int id){this.m =M;this.i=id; public void run() { try{ while(true) { System.out.print("Filosofo "+ i+" pensa...\n"); m.prendiforchette(i); System.out.print("Filosofo "+ i+" mangia...\n"); sleep(8); m.rilasciaforchette(i); sleep(100); catch(interruptedexception e){ 8

public class tavola { //Costanti: private final int NF=5; //Dati: Monitor // costante: num forchette/filosofi private int []forchette=new int[nf]; //num forchette disponibili per ogni filosofo i private Lock lock= new ReentrantLock(); private Condition []codaf= new Condition[NF];//1 coda per ogni filosofo i //Costruttore: public tavola( ) { int i; for(i=0; i<nf; i++) codaf[i]=lock.newcondition(); for(i=0; i<nf; i++) forchette[i]=2; // metodi public e metodi privati:... 9

Metodi public public void prendiforchette(int i)throws InterruptedException { lock.lock(); try { while (forchette[i]!=2) codaf[i].await(); forchette[sinistra(i)]--; forchette[destra(i)]--; finally{ lock.unlock(); return; 10

public void rilasciaforchette(int i)throws InterruptedException { lock.lock(); { try forchette[sinistra(i)]++; forchette[destra(i)]++; if (forchette[sinistra(i)]==2) codaf[sinistra(i)].signal(); if (forchette[destra(i)]==2) codaf[destra(i)].signal(); finally{ lock.unlock(); return; 11

Metodi privati int destra(int i) { int ret; ret=(i==0? NF-1:(i-1)); return ret; int sinistra(int i) { int ret; ret=(i+1)%nf; return ret; 12

Programma di test import java.util.concurrent.*; public class Filosofi { public static void main(string[] args) { int i; tavola M=new tavola(); filosofo []F=new filosofo[5]; for(i=0;i<5;i++) F[i]=new filosofo(m, i); for(i=0;i<5;i++) F[i].start(); 13

Il Bar dello Stadio In uno stadio e` presente un unico bar a disposizione di tutti i tifosi che assistono alle partite di calcio. I tifosi sono suddivisi in due categorie: tifosi della squadra locale, e tifosi della squadra ospite. Il bar ha una capacita` massima NMAX, che esprime il numero massimo di persone (tifosi) che il bar puo` accogliere contemporanemente. Per motivi di sicurezza, nel bar non e` consentita la presenza contemporanea di tifosi di squadre opposte. Il bar e` gestito da un barista che puo` decidere di chiudere il bar in qualunque momento per effettuare la pulizia del locale. Al termine dell attivita` di pulizia, il bar verra` riaperto. Durante il periodo di chiusura non e` consentito l accesso al bar a nessun cliente. Nella fase di chiusura, potrebbero essere presenti alcune persone nel bar: in questo caso il barista attendera` l uscita delle persone presenti nel bar, prima di procedere alla pulizia. Ultilizzando il linguaggio Java, si modellino i clienti e il barista mediante thread concorrenti e si realizzi una politica di sincronizzazione tra i thread basata sul concetto di monitor che tenga conto dei vincoli dati, e che inoltre, nell accesso al bar dia la precedenza ai tifosi della squadra ospite. 14

Impostazione Quali thread? barista cliente ospite cliente locale Risorsa condivisa? il bar -> definiamo la classe Bar, che rappresenta il monitor allocatore della risorsa 15

Struttura dei threads: ospite public class ClienteOspite extends Thread { Bar m; public ClienteOspite(Bar M){this.m = M; public void run() { try{ m.entrao(); System.out.print( "Ospite: sto consumando...\n"); sleep(2); m.escio(); catch(interruptedexception e){ 16

Struttura dei threads: locale public class ClienteLocale extends Thread { Bar m; public ClienteLocale(Bar M){this.m =M; public void run() { try{ m.entral(); System.out.print( "Locale: sto consumando...\n"); sleep(2); m.escil(); catch(interruptedexception e){ 17

Struttura dei threads: barista public class Barista extends Thread { Bar m; public Barista(Bar M){this.m =M; public void run() { try{ while(1) { m.inizio_chiusura(); System.out.print( "Barista: sto pulendo...\n"); sleep(8); m.fine_chiusura(); sleep(10); catch(interruptedexception e){ 18

Progetto del monitor bar: import java.util.concurrent.locks.*; public class Bar { //Dati: private final int N=20; //costante che esprime la capacita` bar private final int Loc=0; //indice clienti locali private final int Osp=1; //indice clienti ospiti private int[] clienti; //clienti[0]: locali; clienti[1]: ospiti private boolean uscita;// indica se il bar è chiuso, o sta per chiudere private Lock lock= new ReentrantLock(); private Condition clientil= lock.newcondition(); private Condition clientio= lock.newcondition(); private Condition codabar= lock.newcondition(); //coda barista private int[] sospesi; //Costruttore: public Bar() { clienti=new int[2]; clienti[loc]=0; clienti[osp]=0; sospesi=new int[2]; sospesi[loc]=0; sospesi[osp]=0; uscita=false; 19

//metodi public: public void entral()throws InterruptedException { lock.lock(); try { while ((clienti[osp]!=0) (clienti[loc]==n) uscita (sospesi[osp]>0) ) { sospesi[loc]++; clientil.await(); sospesi[loc]--; clienti[loc]++; if (sospesi[loc]) clientil.signal( ); finally{ lock.unlock(); return; 20

public void entrao()throws InterruptedException { lock.lock(); try { while ((clienti[loc]!=0) (clienti[osp]==n) uscita ) {sospesi[osp]++; clientio.await(); sospesi[osp]--; clienti[osp]++; if (sospesi[osp]) clientio.signal ( ); finally{ lock.unlock(); return; 21

public void escio()throws InterruptedException { lock.lock(); try { clienti[osp]--; if (uscita && (clienti[osp]==0)) codabar.signal(); else if (sospesi[osp]>0) clientio.signal(); else clientil.signal(); finally{ lock.unlock(); public void escil ()throws InterruptedException { lock.lock(); try { clienti[loc]--; if (uscita && (clienti[loc]==0)) codabar.signal(); else if (sospesi[osp]>0) clientio.signal(); else clientil.signal(); finally{ lock.unlock(); 22

public void inizio_chiusura()throws InterruptedException { lock.lock(); try { uscita=true; while ((clienti[loc]>0) (clienti[osp]>0)) codabar.await(); finally{ lock.unlock(); public void fine_chiusura()throws InterruptedException { lock.lock(); try { uscita=false; if (sospesi[osp]>0) clientio.signal(); else clientil.signal(); finally{ lock.unlock(); // fine classe Bar 23

import java.util.concurrent.*; Programma di test public class Bar_stadio { public static void main(string[] args) { System.out.println("HELLO!!!!"); int i; Bar M=new Bar(); ClienteOspite []CO= new ClienteOspite[50] ; ClienteLocale []CL= new ClienteLocale[50] ; Barista B=new Barista(M); for(i=0;i<50;i++) { CO[i]=new ClienteOspite(M); CL[i]=new ClienteLocale(M); for(i=0;i<50;i++) { CO[i].start(); CL[i].start(); B.start(); 24