
Universit`adegli Studi di Pisa FACOLTA` DI SCIENZE MATEMATICHE, FISICHE E NATURALI Corso di Laurea Specialistica in Tecnologie Informatiche Tesi di Laurea Specialistica Programmazione parallela strutturata in Java8: Muskel2 Candidato: Relatore: Christian Simonelli Prof. Marco Danelutto Anno Accademico 2014/2015 2 Indice 1 Introduzione7 2 Stato dell'Arte e Strumenti Utilizzati 11 2.1 Programmazione Parallela Basata su Skeleton......... 12 2.2 Programmazione Funzionale in Java............... 14 2.3 Reactive Programming...................... 16 2.3.1 Functional Reactive Programming............ 17 2.4 Programmazione Parallela in Java 8............... 18 2.4.1 Java Stream........................ 18 2.4.2 CompletableFuture.................... 19 2.4.3 RxJava........................... 20 2.5 Reactive Streams......................... 20 2.6 Fluent Interface.......................... 21 2.7 Pattern Utilizzati......................... 22 2.7.1 Creational Patterns.................... 22 2.7.2 Structural patterns.................... 25 2.7.3 Behavioral Patterns.................... 26 2.7.4 Dependency Injection Pattern.............. 28 2.8 Supporto Esecuzione Distribuita................. 31 2.8.1 Hazelcast......................... 31 2.8.2 Spring Boot........................ 32 2.9 Apache Maven........................... 32 3 Progetto Logico 35 3.1 Schema Logico.......................... 35 3.2 Esempi di Parallelismo...................... 36 3.2.1 Pipeline.......................... 37 3.2.2 Farm............................ 40 3.2.3 Generatore di Stream................... 41 3.3 Schema Logico Implementazione................. 43 1 2 INDICE 4 MuSkel2: Implementazione 47 4.1 API................................ 47 4.1.1 MuskelProcessor..................... 48 4.1.2 MuskelContext...................... 52 4.2 Skeleton.............................. 55 4.2.1 Aggregazione....................... 55 4.2.2 Controllo di Flusso.................... 57 4.2.3 Condizionali........................ 58 4.2.4 Combinazioni....................... 59 4.2.5 Filtraggio......................... 59 4.2.6 Trasformazione...................... 63 4.2.7 Calcolo Parallelo..................... 65 4.3 Supporto Run-Time....................... 70 4.3.1 Protocollo di Comunicazione Remoto.......... 70 4.3.2 MuskelContext...................... 72 4.3.3 Serializzazione....................... 74 4.3.4 Service Injection..................... 75 4.3.5 ClassLoading....................... 77 5 Risultati Sperimentali 81 5.1 Ambiente di Lavoro........................ 81 5.2 Tempo di Completamento, Scalabilit`aed Efficienza...... 82 5.3 Benchmark Sintetici Ambiente Locale.............. 83 5.3.1 Test1: Calcolo Numeri Primi con FlatMap....... 83 5.3.2 Test2: Calcolo Numeri Primi Con Map......... 86 5.3.3 Conclusioni........................ 89 5.4 Benchmark Sintetici Ambiente Distribuito........... 89 6 Conclusioni 93 A Manuale 101 A.1 Hello Word............................ 101 A.2 Service Injection......................... 104 B Codice Sorgente Modulo Core MuSkel2 107 C Codice Sorgente Modulo Server MuSkel2 245 Elenco delle figure 2.1 Diagramma funzionamento Stream............... 19 2.2 Vista Concettuale Builder Pattern................ 23 2.3 Vista Concettuale Factory Method Pattern........... 24 2.4 Diagramma Pattern Composite................. 26 2.5 Diagramma Pattern Adapter................... 27 2.6 Diagramma Classi Pattern Observer............... 28 2.7 La dipendenza tra classi..................... 29 2.8 Vista Concettuale Dependency Injection Pattern........ 30 3.1 Programma Muskel2 e Stream di Input - Output........ 35 3.2 MuSkel2 Tipi di Risorse Target................. 36 3.3 Esempio di Pipeline........................ 37 3.4 Schema Logico Pipeline Locale.................. 37 3.5 Schema Logico Pipeline Remoto................. 38 3.6 Generico Farm e stream di input - output........... 40 3.7 Esempio di Farm Remoto in MuSkel2.............. 41 3.8 Generica FlatMap e Stream di Input - Output......... 42 3.9 Esempio di FlatMap....................... 43 3.10 MuSkel2: Fasi elaborazione.................... 44 4.1 Registrazione Subscriber nei confronti del Publisher...... 49 4.2 Sottoscrizione Publisher nei confronti del Subscriber...... 50 4.3 MuSkel2 richiesta di elementi dello stream da parte del Sub- scriber............................... 51 4.4 MuSkel2 processazione di un elemento............. 51 4.5 MuSkel2 gestione errori nel processo di elaborazione...... 52 4.6 Diagramma di sequenza skeleton defaultIfEmpty........ 58 4.7 Diagramma di sequenza skeleton filter.............. 60 4.8 Diagramma di sequenza skeleton take.............. 61 4.9 Diagramma di sequenza skeleton map sequenziale....... 64 4.10 Diagramma di sequenza skeleton map parallelo......... 66 3 4 ELENCO DELLE FIGURE 4.11 Diagramma di sequenza skeleton executeOn.......... 68 4.12 Diagramma di sequenza skeleton executeOn remoto...... 69 4.13 Diagramma di sequenza skeleton toLocal............ 71 4.14 Diagramma di deployment Discovery Nodi Server....... 72 4.15 Diagramma Classi MuskelContext................ 75 4.16 Diagramma Sequenza Componenti Classloading........ 78 5.1 Test1: Tempo di Completamento................ 84 5.3 Test1: Efficienza......................... 85 5.2 Test1: Scalabilit`a......................... 85 5.4 Test2: Tempo di Completamento................ 87 5.5 Test2: Scalabilit`a......................... 88 5.6 Test2: Efficienza......................... 88 5.7 Test2 Ambiente Distribuito: Tempo di Completamento.... 90 5.8 Test2 Ambiente Distribuito: Scalabilit`a............. 90 5.9 Test2 Ambiente Distribuito: Efficienza............. 91 Elenco delle tabelle 3.1 Lista Operatori raggruppati per categoria............ 36 4.1 Parametri aggiuntivi configurazione di MuskelContext Client. 55 4.2 Parametri discovery nodi server................. 73 4.3 Altri parametri Avvio Server................... 74 5 6 ELENCO DELLE TABELLE Capitolo 1 Introduzione Negli ultimi anni i progressi tecnologici hanno modificato profondamente la modalit`adi comunicazione e la condivisione di informazioni tra gli esseri umani. Attraverso i dispositivi mobili `eoggi possibile accedere a servizi e contenuti in modo pressoch´eistantaneo, monitorare le proprie attivit`a,con- dividere interessi personali e lavorativi. La necessit`adi poter disporre dei propri documenti ed informazioni da qualunque dispositivo e in qualunque luogo, ha determinato la creazione di piattaforme server in grado di permet- tere l'accesso contemporaneo a migliaia di utenti e la memorizzazione di dati nell'ordine dei petabyte. Piattaforme di questo tipo sono composte da centinaia di nodi server, dislocate in differenti aree geografiche ed ospitate su \server farm", che met- tono a disposizione ambienti virtuali che introducono un livello di astrazione dell'ambiente software dal relativo hardware. I server, in quanto virtuali, possono essere spostati da un componente hardware ad un altro, duplicati a piacimento e possono essere utilizzati per la creazione di architetture scalabili e flessibili. Il cloud computing ha sfruttato il livello di efficienza e flessibilit`atipico della virtualizzazione potenziandolo ulteriormente. Grazie alla diversificazio- ne geografica e alla connettivit`auniversale, il cloud computing ha facilitato la distribuzione di software e la creazione di architetture a microservizi in modalit`aSaaS (Software-as-a-Service) e PaaS (Platform-as-a-Service). La spinta del cloud, come supporto standard per il deployment di applicativi, porta necessariamente a ripensare il modo con cui essi vengono progettati e sviluppati. I microservizi sono il modo nuovo ed ideale per affrontare lo sviluppo di applicativi orientati nativamente al cloud computing. I software devono quindi essere in grado di interagire con decine di ser- vizi sempre pi`uspesso messi a disposizione da altri, con tempi di risposta e modalit`adi accesso diverse. 7 8 CAPITOLO 1. INTRODUZIONE In questo scenario anche il mondo della programmazione deve cambiare: non solo `enecessario passare dal paradigma di programmazione sequenziale a quello parallelo, in grado di sfruttare efficientemente le moderne architet- ture multi-core, ma `enecessario anche introdurre modelli di programmazione asincroni, che ottimizzino l'uso delle risorse in presenza di frequenti interazio- ni. L’effetto collaterale dell'utilizzo di modelli di programmazione asincroni `e quello di avere una maggiore complessit`ain termini di manutenibilit`ae leggi- bilit`adel codice. Fortunatamente, per quasi tutti i linguaggi di programma- zione sono nate diverse librerie che mascherano tale complessit`a,consentendo l'esecuzione di attivit`ain background, che non interferiscano con il flusso di elaborazione principale. I due principali elementi che consentono di sfruttare il modello di pro- grammazione asincrono sono gli eventi [30] e le callback/promise [24]. I primi offrono un modello ormai consolidato nella maggior parte dei linguaggi di programmazione e risultano abbastanza intuitivi soprattutto nella gestio- ne dell'interazione con l'utente. Le callback/promise rappresentano un ap- proccio comodo e molto utilizzato soprattutto nelle interazioni con sistemi esterni (vedi Sezione 2.4.2). Un altro aspetto che ha facilitato l'adozione di framework che fanno uso di modelli asincroni `estata l'introduzione, da parte dei principali linguaggi di programmazione ad oggetti, del \functional-style programming" (vedi Sezione 2.2), ovvero di una serie di tecniche, tipiche del- la programmazione funzionale, che hanno come obiettivo quello di snellire il codice. Questo
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages258 Page
-
File Size-