Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Documenti analoghi
Esercitazione maggio 2011

Esercizio sul Monitor in Java. 18 maggio 2011

Esercizi sul Monitor in Java. 22 Maggio 2015

Esercizio monitor. Sistemi Operativi T 1

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Esercizi sul Monitor in Java

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

Esercitazione 15. Il problema dello Sleeping Barber

Esercitazione 3 Monitor. 22 Novembre 2012

Esercizio monitor con pthreads

Esercizio semafori Java

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

Concorrenza e sincronizzazione

Il costrutto monitor

Esercitazione 11. Esercitazione di riepilogo

Sistemi Operativi T. Esercizi

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

Algoritmi di Ricerca. Esempi di programmi Java

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

Sincronizzazione con Java

Java thread, concorrenza

Esercizio sui Semafori

Algoritmi di Ricerca. Esempi di programmi Java

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

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

Un esercizio d esame. Flavio De Paoli

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

Java Virtual Machine

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Il costrutto monitor [Hoare 74]

Java threads (2) Programmazione Concorrente

Informatica 3 secondo recupero 13 Settembre 2002

Lab 4: Locks, Condition Variables in Java

Laboratorio di Programmazione 1 [Java]

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

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Chiamata di procedura remota

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

Il costrutto monitor

Il costrutto monitor [Hoare 74]

Multithreading in Java I parte. Lorenzo Gallucci

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

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

Esercitazione. Docente Ing. Mariateresa Celardo

Multithreading. Multithreading/2

Esempio: Interfacce. Gioco Interfacce

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

Monitor [Hoare 74] Costrutto sintattico che associa un insieme di procedure/funzioni (entry) ad una struttura dati comune a più processi.

Monitor [Hoare 74] Uso del monitor

Esempio: Interfacce. Gioco Interfacce

Programmazione concorrente con il linguaggio Java

UNIVERSITÀ DEGLI STUDI DI BERGAMO

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

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

Algoritmi di Ricerca. Esempi di programmi Java

Le basi del linguaggio Java

Esercizi di utilizzo del semaforo semplice di competizione per l'uso di una risorsa comune

Prova d Esame Compito A

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

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

Il monitor. Sistemi Operativi T AA

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

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

Compute engine generici in RMI

Il monitor. Costrutti linguistici per la sincronizzazione

Programmazione II Compitino (Vers. B)

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

GESTIONE DEGLI ERRORI

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

SEMAFORI SEMAFORI. Sul semaforo sono ammesse solo due operazioni (primitive)

Corso di Laurea in Matematica Corso di Informatica Prova d Esame del 02/02/2010

Thread in Java. Thread = flusso di esecuzione indipendente nel codice del programma

Programmazione concorrente in Java

Introduzione alla Programmazione in Java attraverso un esempio commentato

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

Esempi in Java di program.ne O-O

Multithreading in Java. Fondamenti di Sistemi Informativi

Fondamenti di Informatica L-B Esercitazione n 5 Java: Interfaccia Comparable, Array

Monitor. Le procedure entry sono le sole operazioni che possono essere utilizzate dai processi per accedere alle variabili comuni.

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

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

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

Università degli Studi di Ferrara Facoltà di Ingegneria Corso di Ingegneria del Software (IIa parte) - Prova scritta

LinuxThreads. LinuxThreads: monitor & variabili condizione

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

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Ingegneria del Software

Algoritmi di ordinamento e ricerca. Classe SelSort.java

Corso di Linguaggi di Programmazione

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Java RMI: Esempio Completo di un Applicazione Distribuita

Laboratorio di Programmazione 1 [Java]

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

19. Introduzione al multi-threading

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Uguaglianza e copia di oggetti

Politecnico di Milano

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

Sistemi operativi - Concetti ed esempi -Settima edizione

Transcript:

Decima Esercitazione Accesso a risorse condivise tramite Monitor Java 1

Agenda Esempio 1 La banca: gestione di una risorsa condivisa da più thread, con politica prioritaria Esercizio 2 da svolgere Accesso a risorsa condivisa con sincronizzazioni complesse tramite Monitor

Esempio 1 la banca Si consideri una piccola filiale di banca che rende disponibili alcuni servizi ai propri clienti tramite uno sportello. I clienti della filiale possono essere intestatari di uno ed un solo conto corrente (CC). Ogni conto corrente, individuato univocamente da un codice intero, è caratterizzato da un saldo, che rappresenta l importo attualmente depositato nel conto.

Esempio 1 la banca Per la gestione dei conti correnti, la filiale offre 2 servizi: Prelievo dal proprio conto corrente: è l operazione mediante la quale un cliente estrae dal proprio CC un importo X dato; si noti che tale operazione: Può essere eseguita soltanto dall intestatario del CC Non può essere eseguita se il saldo del CC è minore di X; in tal caso il richiedente aspetta che nel conto vi sia un importo sufficiente. Versamento su un conto corrente: è l operazione mediante la quale un cliente aggiunge ad un certo CC (intestato a qualunque cliente) un importo dato. Si noti che tale operazione può essere eseguito da qualunque cliente della filiale (eventualmente diverso dall intestatario del CC). Si supponga che ogni operazione richieda un tempo non trascurabile: ogni cliente che trova lo sportello occupato si mette in attesa.

Esempio 1 la banca A tale scopo è previsto 1 solo sportello, mediante il quale i clienti possono richiedere sia operazioni di prelievo che di versamento. I Clienti vengono classificati in due categorie: Clienti Standard, il cui saldo attuale è minore di 50.000 ; Clienti Vip, il cui saldo attuale è maggiore o uguale di 50.000. Si noti che ogni cliente può cambiare categoria dinamicamente (in base, cioè, al saldo attuale). Si progetti una politica di gestione dello sportello della filiale che tenga conto delle specifiche date e che, inoltre, soddisfi i seguenti vincoli: Le operazioni di versamento abbiano la priorità su quelle di prelievo; Nell ambito della stessa operazione (prelievo o versamento), i clienti Vip abbiano la priorità sui clienti Standard.

Esempio 1 la banca Si realizzi un applicazione nel linguaggio Java che, utilizzando variabili condizione e monitor, implementi la politica di gestione e nella quale : i clienti siano rappresentati da thread concorrenti; si supponga che ogni cliente richieda periodicamente alla filiale un operazione (prelievo dal proprio CC o versamento in un CC casuale).

Quali thread? Impostazione! thread iniziale! k clienti della banca Thread iniziale Cliente 1 Cliente 2 Cliente K Quale risorsa comune?! Sportello della filiale! associamo allo Sportello un "monitor", che controlla gli accessi in base alla specifica politica di accesso. La sincronizzazione viene realizzata mediante variabili condizione

Struttura dei thread public class Cliente extends Thread{ private monitor M; private int conto, max; Random r = new Random(); public Cliente(int conto, monitor m, int ncc){ this.m=m; this.conto=conto; // numero di conto this.max=ncc; //massimo numero di cc

Struttura dei thread - versamento public void run(){ int op, cc, somma; try { while (true){ op=r.nextint(2); if (op==0) { //versamento cc= r.nextint(max); somma= r.nextint(10)*10000; M.versamento(cc, conto, somma); Thread.sleep(250); M.fine_operazione(); else{ //prelienvo continua

Struttura dei thread - prelievo // else{ //prelievo somma= r.nextint(10)*10000; M.prelievo(conto,somma); Thread.sleep(250); M.fine_operazione(); Thread.sleep(250); //fine while catch (InterruptedException e) { //fine run()

Monitor: sportello della filiale Variabili di stato: Conti correnti: vettore di N interi (uno per conto corrente) private int[] CC; Dove: CC[i] è il denaro disponibile nel conto del cliente i.

Politica di Sincronizzazione Un thread si sospende: se lo sportello è occupato se deve prelevare e non c è disponibilità sufficiente se ci sono thread più prioritari in attesa Vincoli di priorità: Le operazioni di versamento hanno priorità sui prelievi; Nell ambito della stessa operazione (prelievo o versamento), i clienti Vip abbiano la priorità sui clienti Standard. Ordine di priorità: Versamento vip Versamento standard Prelievo vip Prelievo standard Per la sospensione dei thread definiamo 4 condition (una per ogni livello di priorità)

Monitor Lock per la mutua esclusione: private Lock lock = new ReentrantLock(); Condition. Per la sospensione dei thread in attesa definiamo 4 condition (una per ogni livello di priorità): private Condition VV=lock.newCondition(); //coda dei Vip che vogliono versare private Condition VS= lock.newcondition(); //coda Standard che vogliono versare private Condition PV= lock.newcondition(); //coda Vip che vogliono prelevare private Condition PS= lock.newcondition(); //coda Standard che vogliono prelevare Contatori dei thread sospesi in ogni coda: private int sospvv, sospvs; private int sosppv, sospps;

Monitor public class Monitor{ private int N; //massimo numero di CC private final int VIP=0; //TIPO VIP private final int STA=1; //TIPO CLIENTE STANDARD private final int soglia=50000; private int[] CC; //CONTI CORRENTIi private Lock lock= new ReentrantLock(); private Condition VV= lock.newcondition() private Condition VS= lock.newcondition() private Condition PV= lock.newcondition() private Condition PS= lock.newcondition() private int sospvv, sospvs, sosppv, sospps; boolean occupato; //presenza di 1cliente allo sportello

//Costruttore: public Monitor( int NC) { int i; N=NC; CC=new int[n]; for(i=0; i<n; i++) CC[i]=0; occupato=false; sosppv=0; sospps=0; sospvv=0; sospvs=0; Monitor Inizialmente i conti sono tutti vuoti, lo sportello è libero e nessuno è sospeso in cosa

Monitor - prelievo public void prelievo(int conto, int somma) throws InterruptedException { lock.lock(); try { while( ){ mutua esclusione 1. Lo sportello è occupato. 2. non ci sono abbastanza soldi nel conto 3. questo conto è di tipo STA e qualche VIP attende di prelevare 4. qualcuno (VIP o STA) è sospeso in atteso di versare <attesa sulla condition opportuna> occupato=true; CC[conto]-=somma; finally { lock.unlock();

mutua esclusione Monitor - prelievo public void prelievo(int conto, int somma) throws InterruptedException { lock.lock(); try { while( occupato CC[conto]<somma ((sosppv > 0) && (tipo(conto)==sta)) sospvv>0 sospvs>0 ){ if (tipo(conto) == VIP){ sosppv++; PV.await(); sosppv--; else{ sospps++; PS.await(); sospps--; occupato=true; CC[conto]-=somma; finally { lock.unlock();

Monitor - versamento public void versamento(int conto,int mioconto,int somma) throws InterruptedException{ lock.lock(); try{ while( ){ mutua esclusione 1. Lo sportello è occupato 2. questo conto è di tipo STA e qualche VIP attende di versare <attesa sulla condition opportuna> occupato=true; CC[conto]+=somma; finally{ lock.unlock();

Monitor - versamento mutua esclusione public void versamento(int conto,int mioconto,int somma) throws InterruptedException{ lock.lock(); try{ while( occupato ((sospvv > 0) && (tipo(mioconto)==sta))){ if(tipo(mioconto) == VIP){ sospvv++; VV.await(); sospvv--; else { sospvs++; VS.await(); sospvs--; occupato=true; CC[conto]+=somma; finally{ lock.unlock();

public void fine_operazione(){ lock.lock(); try{ occupato=false; //signal in ordine di priorità: if (sospvv>0) VV.signalAll(); if (sospvs>0) VS.signalAll(); if (sosppv>0) PV.signalAll(); if (sospps>0) PS.signalAll(); finally{ lock.unlock(); private int tipo(int conto){//determina tipo di conto if (CC[conto] < soglia) return STA; else return VIP;

Programma di test public class banca { public static void main (String args[]) { final int NC=20; int i; cliente []Clienti= new cliente[nc]; monitor M = new monitor(nc); for (i = 0; i < NC; i++) { Clienti[i] = new cliente(i, M, NC); Clienti[i].start();

Esercizio 2 - La collezione di figurine Una nota casa editrice vuole realizzare un sito web dedicato ai collezionisti di figurine dell album Campionato di calcio 2012-2013. 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.

Esercizio 2 - regole 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 figurina A disponibile: se A è disponibile, essa viene assegnata all utente U, che può così continuare la propria attività; se A non è disponibile, l utente U viene messo in attesa.

Esercizio 2 - regole 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; ad esempio: CollezA chiede 7 offrendo 3[RARA] 7 non disponibile CollezB chiede 7 offrendo 50[NORM] 7 non disponibile 7 diventa disponibile => signalall() e la CPU schedula B B ha offerto una figurina NORM. C è qualcuno che ha offerto una RARA in attesa della stessa figurina?? Sì => B attende

Suggerimenti Quali thread?! thread iniziale! K utenti del servizio Thread iniziale Utente 1 Utente 2 Utente K Qual è la 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.

Suggerimenti 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( ); 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. (inizialmente 1 per ogni figurina) Convenzione adottata: Se i<30, si tratta di una figurina rara; Se i>= 30, si tratta di una figurina comune.

Monitor Deposito figurine 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; //devo sapere chi è sospeso in attesa di quella specifica figurina => array

Monitor Deposito figurine public class Monitor { 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; public Monitor(int N ) { //Costruttore public void scambio(int off,int rich)//metodo entry: throws InterruptedException { NB: è plausibile che prima o poi il deposito vada in deadlock. Quando accadrà?