Programmazione concorrente in Java. Dr. Paolo Casoto, Ph.D. - 2012 1

Похожие документы
Multithreading in Java. Fondamenti di Sistemi Informativi

Java Virtual Machine

GESTIONE DEI PROCESSI

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Java threads (2) Programmazione Concorrente

1 Processo, risorsa, richiesta, assegnazione 2 Concorrenza 3 Grafo di Holt 4 Thread 5 Sincronizzazione tra processi

Un sistema operativo è un insieme di programmi che consentono ad un utente di

Sistemi Operativi. Processi GESTIONE DEI PROCESSI. Concetto di Processo. Scheduling di Processi. Operazioni su Processi. Processi Cooperanti

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

La Gestione delle risorse Renato Agati

Gestione della memoria centrale

Telematica II 17. Esercitazione/Laboratorio 6

Scheduling. Sistemi Operativi e Distribuiti A.A Bellettini - Maggiorini. Concetti di base

Scheduling della CPU Simulazione in linguaggio Java

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:

Pronto Esecuzione Attesa Terminazione

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

Esercizio 1: trading on-line

Corso di Sistemi di Elaborazione delle informazioni

Il costrutto monitor [Hoare 74]

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

STRUTTURE DEI SISTEMI DI CALCOLO

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Sistemi Operativi (modulo di Informatica II) I processi

Modello dei processi. Riedizione delle slide della Prof. Di Stefano

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

I THREAD O PROCESSI LEGGERI Generalità

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Introduzione alla Virtualizzazione

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Il problema del produttore e del consumatore. Cooperazione tra processi

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

Esercizi sugli Oggetti Monitor

Il Sistema Operativo

T E O R I A D I P R O G E T T A Z I O N E D E L S O F T W A R E

Esecuzione concorrente di transazioni

ESERCIZIO 1 (b) Dove è memorizzato il numero del primo blocco del file? Insieme agli altri attributi del file, nella cartella che contiene il file.

Il costrutto monitor [Hoare 74]

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

LA SINCRONIZZAZIONE TRA PROCESSI

Sistemi Operativi Esercizi Sincronizzazione

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Architettura di un sistema di calcolo

Il Sistema Operativo (1)

ASPETTI GENERALI DI LINUX. Parte 2 Struttura interna del sistema LINUX

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Protezione. Protezione. Protezione. Obiettivi della protezione

Capitolo 7: Sincronizzazione

Capitolo 13. Interrogare una base di dati

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Sistemi Operativi mod. B. Sistemi Operativi mod. B A B C A B C P P P P P P < P 1, >

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

Il Concetto di Processo

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

Introduzione ai Metodi Formali

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Algoritmi di scheduling

Calcolatori Elettronici. La memoria gerarchica La memoria virtuale

SysAround S.r.l. L'efficacia delle vendite è l elemento centrale per favorire la crescita complessiva dell azienda.

Il CRM per la Gestione del Servizio Clienti

Capitolo 5: I thread

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

Il software di base comprende l insieme dei programmi predisposti per un uso efficace ed efficiente del computer.

Progettaz. e sviluppo Data Base

Approccio stratificato

Il descrittore di processo (PCB)

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Artifact Centric Business Processes (I)

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Automazione Industriale (scheduling+mms) scheduling+mms.

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

Sistema operativo: Gestione dei processi

Dispensa di Informatica I.1

Deadlock (stallo) Parte III. Deadlock

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

La macchina di Von Neumann. Archite(ura di un calcolatore. L unità di elaborazione (CPU) Sequenza di le(ura. Il bus di sistema

Architettura di un calcolatore

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Soluzione dell esercizio del 2 Febbraio 2004

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Транскрипт:

+ Programmazione concorrente in Java 1

+ Introduzione al multithreading 2 La scomposizione in oggetti consente di separare un programma in sottosezioni indipendenti. Oggetto = metodi + attributi finalizzati alla rappresentazione di una specifica entità Spesso non è sufficiente, è necessario ripartire il programma in sotto-attività da eseguire in parallelo. Ciascuna sotto-attività può essere definita come thread Componente software in esecuzione come filo indipendente all interno della JVM Non associati necessariamente a thread reali della macchina fisica.

+ Processi e Thread 3 Un processo è un programma software in esecuzione con accesso ad uno specifico spazio di indirizzamento in memoria. Un S.O. è in grado di gestire più processi allocando in maniera variabile il tempo di CPU a ciascun processo. Un thread è un flusso di esecuzione all interno di un processo. Ciascun processo può avere a sua disposizione più thread in esecuzione parallela. Perché i thread? Eseguire task ed utilizzare risorse senza bloccare l esecuzione del programma principale. E.g.: interfaccia grafica reattiva.

+ Thread in Java 4 In Java ciascun thread ha il proprio stack di esecuzione ed il proprio program counter Condividono gli uni con gli altri il medesimo spazio di memoria per l accesso agli oggetti. Quando programmiamo utilizzando più thread in esecuzione contemporaneamente parliamo di programmazione concorrente. La JVM utilizza alcuni thread per le proprie attività sotto il cofano Garbage Collector Event Dispatcher

+ Thread in Java Stati di un thread in Java 5 Da Deitel & Deitel Java How To Program

+ Thread in Java: gli stati 6 New: il thread è stato creato ma non è ancora in esecuzione; Runnable: il thread è in esecuzione; Waiting: l esecuzione del thread A è stata sospesa in attesa dell esecuzione di un altro thread B. A può essere nuovamente in esecuzione solo al termine di B Timed Waiting: similare allo stato waiting, ma non con la possibilità per il thread di rientrare in esecuzione al termine dell intervallo del timer. E possibile ad esempio forzare tutti i thread che per loro natura operano in polling sullo stato di una risorsa.

+ Thread in Java: gli stati 7 Blocked: il thread è bloccato ed escluso dall esecuzione in attesa della disponibilità di una risorsa. e.g.: IO da filesystem; Terminated: il thread è escluso dall esecuzione e non può rientrarvi in nessun modo. Conclusione naturale del flusso di esecuzione Conclusione forzata Ciascun thread in Java ha un priorità di esecuzione, che ne regola il periodo di accesso alla CPU Ereditato dal thread padre Non è una garanzia dell ordine di esecuzione dei thread stessi.

+ Thread in Java 8 In Java è possibile definire una attività ad esecuzione parallela mediante l implementazione dell interfaccia java.lang.runnable. Definisce un unico metodo, run, che definisce la semantica del task da eseguire. Per eseguire un oggetto Runnable è necessario disporre di un oggetto Executor. Crea e gestisce un gruppo di thread. Per ciascun oggetto Runnable il metodo run è invocato in un nuovo thread. Il metodo execute(runnable) aggiunge un oggetto Runnable al gruppo di thread e, ove vi siano thread disponibili, ne avvia l esecuzione invocando il metodo run.

+ Executor 9 E sempre preferibile utilizzare un oggetto della classe Executor per l avvio di oggetti Runnable ad esecuzione concorrente. La gestione di un pool di thread consente di ottimizzare l esecuzione grazie al riuso di thread esistenti. Riduzione significativa dell overhead legato alla creazione di un nuovo thread. E tuttavia possibile (in particolare nelle precedenti versioni di Java) utilizzare metodologie alternative per l avvio dei Thread. Ad oggi sono del tutto sconsigliabili e deprecate. L interfaccia ExecutorService estende Executor ed aggiunge alcune particolari funzionalità per la gestione del ciclo di vita dell esecutore.

+ Esempio 10 Metodo run Pone il thread in stato timed waiting

+ Esempio 11 Creazione con metodo statico dell esecutore Blocca l accettazione di nuovi task pur continuando l esecuzione dei task esistenti fino al completamento Il metodo main è eseguito nel MAIN THREAD della JVM!!!

+ Sincronizzazione 12 E spesso necessario sincronizzare più thread rispetto ad una risorsa. E.g.: più thread che aggiornano la medesima risorsa condivisa. Solo uno dei thread deve poter accedere, in modo esclusivo, ai metodi per l aggiornamento della risorsa. Gli altri thread passano in stato waiting fino al rilascio della risorsa da parte del thread in esecuzione. Uno dei thread in attesa (la selezione del thread non è prevedibile) è avviato. Mutua esclusione dei thread in modalità di esecuzione. Vediamo come realizzare uno dei meccanismi di sincronizzazione più utilizzati nella programmazione concorrente: i monitor.

+ I monitor 13 Tutti gli oggetti in Java sono caratterizzati dalla presenza di un monitor interno e di un instrinsic lock (o monitor lock). Un solo thread alla volta può acquisire il monitor lock di un oggetto. Quando un thread deve eseguire una operazione potenzialmente critica per la concorrenza deve acquisire un monitor lock. Nel caso in cui il monitor lock sia già stato acquisito da un altro thread, il thread chiamante passa in modalità blocked. La definizione di parti di codice soggette al monitoraggio da parte del monitor si realizza mediante l utilizzo dell aparola riservata synchronized.

+ I monitor 14 synchronized(oggetto){ codice da eseguire Oggetto rispetto al quale il thread deve acquisire il monitor lock } Un solo thread alla volta eseguirà questa porzione di codice Al termine della esecuzione il thread rilascia il monitor lock ed uno dei thread in stato blocked rispetto al monitor lock può essere eseguito Anche i metodi di istanza possono essere caratterizzati dalla presenza del modificatore synchronized L esecuzione dell intero metodo è soggetta all acquisizione del monitor lock.

+ Sincronizzazione 15 Definire le aree del codice il cui accesso debba essere soggetto all attività di sincronizzazione Definire le operazioni critiche, soprattutto su dati condivisi, come synchronized, cercando di renderle il più possibile atomiche. Riuscire a definire operazioni atomiche la cui esecuzione non può essere svolta contemporaneamente da più thread. E preferibile mantenere il più ridotte possibili le aree di codice soggette al modificatore synchronized per mantenerne elevata l efficienza. Soprattutto su potenziali chiamate bloccanti, quali accesso a DB o IO, per le quali il thread può mantenere il monitor lock per lunghi intervalli di tempo.

+ Struttura dati condivisa non 16 sincronizzata

+ Produttore 17 Aggiunge un valore casuale ad una struttura dati condivisa e me tiene copia localmente. Al fine di garantire la sincronizzazione utilizzeremo una struttura dati di tipo Queue ad accesso sincronizzato, la ArrayBlockingQueue Metodi put e take per la scrittura e la lettura dalla coda.

+ Produttore 18 Sospendo il thread per un periodo di tempo casuale inferiore ai 3 secondi

+ Consumatore 19 Legge un valore da una struttura dati condivisa. Mantiene copia del valore localmente Sospendo il thread per un periodo di tempo casuale inferiore ai 3 secondi

+ Esecuzione 20 Nel nostro sistema manca del tutto la sincronizzazione! Infatti eseguendolo scopriamo che Il thread produttore ha generato un totale di elementi la cui somma è 29 Ma il thread consumatore ne ha letti solo 27 Questi valori cambiano AD OGNI ESECUZIONE

+ Introduciamo una struttura dati 21 sincronizzata Rivediamo l esempio precedente modificando l implementazione interna della classe Valore. In particolare adottiamo come strumento per la memorizzazione del dato condiviso un oggetto della classe ArrayBlockingQueue Coda (tipata) di oggetti di dimensione prefissata ad accesso sincronizzato. Quando un thread cerca di scrivere su una coda piena, rimane bloccato in attesa della lettura di almeno un valore da parte del thread consumatore Viceversa per il thread consumatore, che legge i valori dalla coda. La lettura dei valori consuma il valore presente all interno della coda.

+ Struttura dati condivisa 22 sincronizzata Chiamata sincronizzata in lettura Lasciamo inalterato il resto del programma Chiamata sincronizzata in scrittura

+ Esecuzione 23 I due thread risultano sincronizzati Poiché la coda ha lunghezza 1 le due operazioni, scrittura e lettura, sono necessariamente alternate fra loro Tuttavia è vero che lettura e scrittura sulla coda non sono atomiche rispetto alle attività di lettura e scrittura dei due thread Intervallo fra esecuzione di take e di println

+ Ma come funziona 24 ArrayBlockingQueue? Impostare i metodi set e get come metodi sincronizzati, il cui accesso sia a tutti gli effetti atomico. Utilizzare un monitor lock per definire quale thread possa effettuare le attività (in lettura o scrittura) sui dati condivisi. Se un oggetto non può eseguire una attività su un oggetto rispetto al quale si sincronizza (e.g.: la coda è piena ed il thread di scrittura non può pubblicare) dopo aver acquisito il monitor lock passa in waiting e rilascia il monitor lock. Quando un thread in esecuzione completa una attività che può modificare una condizione bloccante per un altro thread in waiting, lo notifica.

+ Metodi wait e notify 25 Metodi della classe Object per la gestione della sincronizzazione: wait: notifica al thread che sta eseguendo il codice che deve spostarsi in stato waiting. notify: notifica ad uno dei thread in attesa che è possibile passare allo stato runnable. notifyall: notifica a tutti i thread in in attesa che è possibile passare allo stato runnable. In questo caso uno dei thread è posto in esecuzione, con un processo di selezione casuale. E possibile invocare uno dei tre metodi solo se il thread chiamante ha acquisito il monitor lock sull oggetto rispetto alla quale si sincronizza.

+ Modifichiamo la classe Valore 26 Metodi sincronizzati Blocca il thread rispetto all oggetto Attiva tutti gli altri thread

+ Esecuzione 27 I due thread risultano sincronizzati Siamo riusciti a simulare il comportamento della struttura dati ad accesso concorrente. Importantissimo: acquisite il monitor lock sull oggetto prima di invocare wait

+ E se tolgo i metodi synchronized? 28 E siamo pure fortunati avremo potuto avere una eccezione!!!

+ Ma con più di due thread? 29 Il nostro programmino non funzionerebbe a dovere. Perché? Semplice, quando esco dal wait non verifico nuovamente la condizione di waiting Ma se nel frattempo una terza entità l avesse modificata di nuovo? Modifichiamo la classe Valore affinché il metodo wait sia contenuto all interno di un ciclo di verifica della condizione. Come? while(condizione){ } wait();

+ Ulteriori considerazioni 30 Fin qui tutto bene se i nostri thread operano alla stessa velocità. Ma se operassero a velocità differenti avremo una perdita di performance, poiché la nostra applicazione sarebbe vincolata alla velocità del thread più lento Per questo motivo possiamo pensare di introdurre un buffer che consenta al thread più veloce di continuare a lavorare ad alta velocità Teoricamente buffer di lunghezza 1 se il consumatore è molto più veloce del produttore Buffer di lunghezza infinita nel caso contrario. Cercare il giusto thread off fra spazio del buffer e tempo medio di waiting dei thread

+ Modifichiamo ancora la classe 31 Valore

+ Esempio 32 Produttore più veloce del consumatore Buffer di dimensione 10

+ Interfaccia Lock 33 Tutti gli oggetti in Java hanno al loro interno il riferimento al monitor lock, oggetto che implementa l interfaccia java.util.concurrent.locks.lock Il monitor lock può essere acquisito mediante accesso ad una sezione synchronized o mediante l invocazione del metodo lock. Il metodo unlock consente di rilasciare il monitor lock, consentendo l acquisizione ad eventuali thread bloccati rispetto al monitor lock La classe ReentrantLock implementa l interfaccia Lock lasciando accedere al monitor lock il thread in attesa da più tempo. Fairness policy Nessun thread può rimanere bloccato all infinito (starvation)

+ Condition 34 Se un thread in possesso di un monitor lock determina che non può eseguire il proprio compito, si dice che sta attendendo una condizione su un oggetto. L oggetto Lock consente di definire le condizioni di attesa di un thread Insieme delle condizioni che devono essere verificate per consentire al thread l esecuzione delle proprie attività. Acquisito il Lock, un thread può creare una nuova condizione sul lock grazie al metodo newcondition Restituisce un oggetto che implementa l interfaccia java.util.concurrent.locks.condition

+ Condition 35 Per attendere rispetto ad un oggetto Condition, il thread invoca il metodo await dell oggetto stesso. Quando un thread ha completato la sua attività e ritiene di poter risvegliare un insieme di thread associati ad una condition, può invocare il metodo signalall della condition stessa. Posso teoricamente avere più condizioni sullo stesso monitor lock!!! Molto più potenti rispetto al synchronize Interruzione e timeout di attesa dei thread; Condizioni multiple di attesa per un thread; Nessuna necessità di acquisire e rilasciare il lock nel medesimo blocco di codice.

+ Modifichiamo ancora la classe 36 Valore

+ Esempio 37