Compute engine generici in RMI

Documenti analoghi
Compute engine generici in RMI

Corso di Reti di Calcolatori L-A

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

Oggetti Distribuiti e Java RMI

RMI. Java RMI RMI. G. Prencipe

RMI: metodi equals e hashcode

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Programmazione distribuita

Lezione n.10. RMI CallBacks 9/12/2009 Andrea Corradini

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

GESTIONE DEGLI ERRORI

Esercizio monitor. Sistemi Operativi T 1

Concorrenza e sincronizzazione

Java RMI: Esempio Completo di un Applicazione Distribuita

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

Polimorfismo parametrico vs polimorfismo per inclusione

Sistemi Distribuiti Multiagente A.A Informatica Magistrale Università di Bari

RMI e Firewall. Una soluzione è offerta dal transport layer di RMI stesso

Lezione n.9. RMI: Remote Method Invocation 1/12/2009 Andrea Corradini

Remote Method Invocation (RMI)

Agenti Mobili in Java RMI

Lezione n.2b. Threads: Callable & Future. 6/10/2008 Vincenzo Gervasi

LA PROGRAMMAZIONE RMI

Laboratorio di Sistemi Distribuiti Leonardo Mariani

RMI. Remote Method Invocation. Enrico Tassi, 3/4/2009. Slides originali di Nicola Gessa

Esercitazione maggio 2011

Laboratorio di Programmazione di Rete Corso A

Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

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

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

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

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Gli EJB offrono vari vantaggi allo sviluppatore di una applicazione

Il linguaggio Java: aggiunte in Java 1.5

Introduzione Generics Iteratori. Collezioni in Java. Dr. Giulio Pellitta. 13 aprile 2011

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Programmazione di sistemi distribuiti

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

Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L

GESTIONE DEI PROCESSI

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

Esempi in Java di program.ne O-O

TFA 42 Sistemi e Reti di Calcolatori per la Didattica

Firewall. RMI e Firewall

Il problema nasce dalla caratteristica di Java di essere distribuito

Esercitazione 15. Il problema dello Sleeping Barber

Comunicazione fra oggetti distribuiti

Programmazione di rete in Java

Generics & Collections

MinMax a Java Distributed Application SISTEMI DISTRIBUITI Fabrizio G. Ventola

Esercizio sul Monitor in Java. 18 maggio 2011

Programmazione concorrente in Java

Esempio: Interfacce. Gioco Interfacce

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

appunti delle lezioni Architetture client/server: applicazioni server

Università degli Studi di Roma La Sapienza, Facoltà di Ingegneria. Corso di INGEGNERIA DEL SOFTWARE (Ing. Informatica, Nuovo Ordinamento)

Prova d Esame Compito A

Main System Monitor Keyboard

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

Esempio: Interfacce. Gioco Interfacce

Programmazione orientata agli oggetti Classi astratte e interfacce

24 - Possibili approfondimenti

Introduzione a Java Remote Method Invocation (RMI)

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Esempio su strutture dati dinamiche: ArrayList

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

Multithreading in Java. Fondamenti di Sistemi Informativi

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

Il Linguaggio Java. Le interfacce

Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5

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

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

OOP: L13: Eccezioni e loro trattamento in Java

Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.

Introduzione al linguaggio Java. Applicazioni ed Applets: come scriverli e farli girare. Caratteristiche originali e differenze con C / C++.

Uguaglianza e copia di oggetti

Java RMI. Alcune premesse Interfaccia e Implementazione RMI. Architettura. Esempi interfaccia e implementazione

Decima Esercitazione. Accesso a risorse condivise tramite Monitor Java

Casi di implementazione di grafi di precedenze

Esercitazione sui Design Pattern

Politecnico di Milano

Datagrammi. NOTA: MulticastSocket estende DatagramSocket

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

Implementazione Java di un ADT

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Albero Binario GT 7.3. interfacce di Positio<E>, Tree<E>, e BinaryTree<E>; il file TestLinkedBinaryTree.java

Astrazioni sul controllo. Iteratori

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

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

RMI Remote Method Invocation. da materiale di Carlo Ghezzi e Alfredo Motta

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

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

La classe java.lang.object

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

RMI Remote Method Invocation

Transcript:

Compute engine generici in RMI

Esempio: Calcolo del prodotto scalare Un unico server offre il servizio di calcolo del prodotto scalare tra vettori di interi Un client richiede al server il calcolo del prodotto scalare

Esempio: Calcolo del prodotto scalare Interfaccia del servizio import java.rmi.*; public interface ScalarProductService extends Remote { public int scalarproduct(int[] v1, int[] v2) throws RemoteException;

Esempio: Calcolo del prodotto scalare Implementazione del servizio import java.rmi.*; import java.rmi.server.*; public class ScalarProductServiceImpl extends UnicastRemoteObject implements ScalarProductService { public ScalarProductServiceImpl() throws RemoteException { super(); public int scalarproduct(int[] v1, int[] v2) throws RemoteException { int ret=0; for(int i=0;i<v1.length;i++) ret+=v1[i]*v2[i]; return ret;

Esempio: Calcolo del prodotto scalare Server import java.rmi.*; public class ScalarProductServer { public static void main(string args[]) { try { ScalarProductServiceImpl spsi = new ScalarProductServiceImpl(); Naming.rebind("scalarProductService", spsi); System.out.println( "ScalarProductServer ready."); catch (Exception e) { System.out.println(e);

Esempio: Calcolo del prodotto scalare Client import java.rmi.*; import java.util.*; public class SimpleScalarProductClient { public static void main(string args[]) { int[] v1=new int[100]; int[] v2=new int[100]; for(int i=0;i<=99;i++) { v1[i]=i+1; v2[i]=1; int result=0; [continua ]

Esempio: Calcolo del prodotto scalare Client try { ScalarProductService spe = (ScalarProductService)Naming.lookup( "rmi://localhost:1099/ scalarproductservice"); result=spe.scalarproduct(v1,v2); catch (Exception e) { System.out.println(e); System.out.println(result);

Compute engine generico Ogni server che offre il servizio di calcolo generico implementa l interfaccia ComputeEngine ComputeEngine contiene un metodo execute per l esecuzione, con un certo set di parametri, di metodi specificati mediante un interfaccia Job Le classi che implementano l interfaccia Job ne particolarizzano il metodo run I client passano ai server istanze della classe Job e set di parametri (come java.lang.object) Il metodo Job.run è eseguito sui server

Compute Engine Job import java.io.*; public interface Job extends Serializable { public Object run(object parameters);

Compute Engine Interfaccia import java.rmi.*; public interface ComputeEngine extends Remote { public Object execute(job j, Object parameters) throws RemoteException;

import java.rmi.*; import java.rmi.server.*; Compute Engine Implementazione public class ComputeEngineImpl extends UnicastRemoteObject implements ComputeEngine { public ComputeEngineImpl() throws RemoteException { super(); public Object execute(job j, Object parameters) throws RemoteException { return j.run(parameters);

Compute Engine Server import java.rmi.*; public class ComputeEngineServer { public static void main(string args[]) { try { ComputeEngineImpl cei = new ComputeEngineImpl(); Naming.rebind("computeEngine", cei); System.out.println( "ComputeEngineServer ready."); catch (Exception e) { System.out.println(e);

Compute engine generico I metodi remoti sono multithreaded per default Le loro invocazioni sono invece sincrone per i client Un client che suddivide il calcolo su più server deve perciò lanciare un thread per ogni invocazione di ComputeEngine.execute Anche la struttura di tali thread può essere resa generica

import java.rmi.*; Compute Engine Client thread class ComputeThread extends Thread { private Job job; private Object parameters; private String host; private Object result; public ComputeThread(Job job,object parameters, String host) { this.job=job; this.parameters=parameters; this.host=host; result=null; [continua ]

Compute Engine Client thread public void run() { try { ComputeEngine ce = (ComputeEngine)Naming.lookup( "rmi://"+host+":1099/ computeengine"); result=ce.execute(job,parameters); System.out.println("ComputeThread result="+ result); catch (Exception e) { System.out.println(e); public Object getresult() { return result;

Esempio: Calcolo del prodotto scalare /2 Un unico client utilizza un unico server generico Il client implementa Job creando ScalarProductJob, il cui metodo run effettua il prodotto scalare

Esempio: Calcolo del prodotto scalare /2 Job di calcolo import java.util.*; public class ScalarProductJob implements Job { public Object run(object parameters) { Vector v=(vector)parameters; Vector v1=(vector)v.get(0); Vector v2=(vector)v.get(1); int ret=0; for(int i=0;i<v1.size();i++) ret+=((integer)v1.get(i)).intvalue()* ((Integer)v2.get(i)).intValue(); return new Integer(ret);

Esempio: Calcolo del prodotto scalare /2 Client di un unico engine import java.rmi.*; import java.util.*; public class SimpleScalarProductCEClient { public static void main(string args[]) { Vector v1=new Vector(); Vector v2=new Vector(); for(int i=1;i<=100;i++) { v1.add(new Integer(i)); v2.add(new Integer(1)); int result=0; [continua ]

Esempio: Calcolo del prodotto scalare /2 Client di un unico engine try { ComputeEngine ce = (ComputeEngine)Naming.lookup( "rmi://localhost:1099/computeengine"); Vector vpar=new Vector(); vpar.add(v1); vpar.add(v2); Integer res=(integer)ce.execute( new ScalarProductJob(),vpar); result=res.intvalue(); catch (Exception e) { System.out.println(e); System.out.println(result);

Esempio: Calcolo del prodotto scalare /3 Un unico client utilizza 3 server generici Il client utilizza ScalarProductJob e suddivide i vettori in 3 sottovettori, assegnandone uno ad ogni server Il client lancia inoltre 3 thread per seguire il calcolo sui 3 sottovettori

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli import java.rmi.*; import java.util.*; public class ScalarProductCEClient { public static void main(string args[]) { Vector v1=new Vector(); Vector v2=new Vector(); for(int i=1;i<=100;i++) { v1.add(new Integer(i)); v2.add(new Integer(1)); Vector vpar1=new Vector(); vpar1.add(extract(v1,0,32)); vpar1.add(extract(v2,0,32)); ComputeThread ct1=new ComputeThread( new ScalarProductJob(),vpar1,"localhost"); [continua ]

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli Vector vpar2=new Vector(); vpar2.add(extract(v1,33,66)); vpar2.add(extract(v2,33,66)); ComputeThread ct2=new ComputeThread( new ScalarProductJob(),vpar2,"localhost"); Vector vpar3=new Vector(); vpar3.add(extract(v1,67,99)); vpar3.add(extract(v2,67,99)); ComputeThread ct3=new ComputeThread( new ScalarProductJob(),vpar3,"localhost"); ct1.start(); ct2.start(); ct3.start(); [continua ]

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli try { ct1.join(); ct2.join(); ct3.join(); catch (InterruptedException e) { System.out.println(e); System.out.println( ((Integer)ct1.getResult()).intValue()+ ((Integer)ct2.getResult()).intValue()+ ((Integer)ct3.getResult()).intValue()); [continua ]

Esempio: Calcolo del prodotto scalare /3 Client di engine multipli private static Vector extract(vector v, int from,int to) { Vector ret=new Vector(); for(int i=from;i<=to;i++) ret.add(v.get(i)); return ret;

Esempio: Calcolo del prodotto tra matrici Si vuole calcolare il prodotto tra matrici di dimensioni m n ed n r (nell esempio, 2 3 e 3 2) Un unico client utilizza m r server generici Il client utilizza sempre ScalarProductJob e assegna una coppia riga/colonna ad ogni server Il client lancia inoltre m r thread per seguire il calcolo di ognuno degli elementi della matrice risultato

Esempio: Calcolo del prodotto tra matrici import java.rmi.*; import java.util.*; public class MatrixProductCEClient { public static void main(string args[]) { int[][] mat1=new int[2][3]; int[][] mat2=new int[3][2]; int v=0; for(int i=0;i<mat1.length;i++) for(int j=0;j<mat1[0].length;j++) mat1[i][j]=++v; for(int i=0;i<mat2.length;i++) for(int j=0;j<mat2[0].length;j++) mat2[i][j]=(i==j?1:0); [continua ]

Esempio: Calcolo del prodotto tra matrici Vector threads=new Vector(); for(int c=0;c<mat2[0].length;c++) for(int r=0;r<mat1.length;r++) { Vector vpar=new Vector(); vpar.add(extractcolumn(mat2,c)); vpar.add(extractrow(mat1,r)); ComputeThread ct=new ComputeThread( new ScalarProductJob(),vpar,"localhost"); threads.add(ct); for(int i=0;i<threads.size();i++) ((Thread)threads.get(i)).start(); [continua ]

Esempio: Calcolo del prodotto tra matrici try { for(int i=0;i<threads.size();i++) ((Thread)threads.get(i)).join(); catch (InterruptedException e) { System.out.println(e); int[][] result= new int[mat1.length][mat2[0].length]; for(int i=0;i<threads.size();i++) { int r=((integer)((computethread)threads.get(i)).getresult()).intvalue(); result[i%mat1.length][i/mat1.length]=r; [continua ]

Esempio: Calcolo del prodotto tra matrici for(int i=0;i<result.length;i++) { System.out.println(); for(int j=0;j<result[0].length;j++) System.out.print(result[i][j]+" "); [continua ]

Esempio: Calcolo del prodotto tra matrici private static Vector extractrow(int[][] mat, int rowindex) { Vector ret=new Vector(); for(int c=0;c<mat[0].length;c++) ret.add(new Integer(mat[rowIndex][c])); return ret; private static Vector extractcolumn(int[][] mat, int columnindex) { Vector ret=new Vector(); for(int r=0;r<mat.length;r++) ret.add(new Integer(mat[r][columnIndex])); return ret;