Unterstützung von Programmiersprachen von Tobias Schlösser Überblick Ubiquitous Supercomputing z Anforderungen an Programmiersprachen z Grid Computing in Java z Higher-level Kommunikationsmöglichkeiten z Ubiquitous Supercomputing z Verbindet Aspekte des Ubiquitous (=allgegenwärtig) Computings und des Supercomputings z Ziel: Lokale Applikationen nutzen Ressourcen entfernter Supercomputer Smart Instruments Wissenschaftliche Instrumente z Nutzen kann durch Supercomputer erhöht werden z High-speed Netzwerke ermöglichen Supercomputern viele Instrumente zu versorgen z Ö „Computational Power“ der Instrumente steigt Beispiel Wettersatellit Erstellt Bilder in verschiedenen Wellenlängen z Daten: Wettersatellit → Bodenstation → Supercomputer (Verarbeitung zu 3D-Bild) → Displaygerät z Wissenschaftler verfolgen 3D Bilder in Realzeit z Smart Applications Desktop Applikationen z Hoch entwickelte User Interfaces, aber nur einfache Berechnungen z Anspruchsvollere Berechnungen durch Supercomputer z Beispiel NEOS z z z z Network Enable Optimization System Berechnet Optimierungsprobleme Optimierungsprobleme erreichen schnell hohe Komplexität Ö Supercomputer zur Berechnung Desktop Applikation zur Datenübertragung Collaborative Environments Computersysteme zur Unterstützung der Zusammenarbeit an verschiedenen Orten z Große Vielfalt solcher Systeme z z Möglichkeit, gemeinsame Dokumente zu nutzen (z.B. Lotus Notes) z Freie elektronische Diskussion in geteilten virtuellen Räumen (z.B. MUD) Beispiel Mirror Worlds Verhalten einer gesamten Institution z Computermodelle interessanter Aspekte der Realität z Kommunikation zwischen Erkundenden der Mirror World möglich z Durch Internet nicht mehr nur Modell, sondern auch System selbst z Anforderungen an Kommunikationsmöglichkeiten einer Programmiersprache z Asynchronie: Ubiquitous Supercomputing Applikationen benötigen Mechanismen, die Synchronisation nicht erzwingen z Symmetrie: „Clients“ und „Server“ gleichberechtigte Partner Gegenseitiger Prozeduraufruf möglich Anforderungen an Kommunikationsmöglichkeiten einer Programmiersprache z Globale Namen: Referenz auf Objekt Ermöglichen komplexe verteilte Datenstrukturen Globaler Namensraum ≠ Globaler Adressraum z High Performance: Keine Engpässe Anpassung an komplexe heterogene Systeme Anforderungen aus universellem Einsatz Einfache Verbreitung z Kostengeringes Interface z Zugriff auf entfernte Datenquellen z Vorbild: Web-Browser Grundsätzliche Vorteile von Java z Objektorientierte Programmiersprache Ö wieder verwendbare Softwarekomponenten Ö Unterstützung in der Softwareentwicklung Vordefinierte APIs, Bibliotheken, Komponenten z Hochentwickeltes GUI Framework z Java Interpreter in vielen Browsern integriert z Universeller Einsatz durch Java Plattformunabhängiger Bytecode z Tragbare kompakte Repräsentation z Prozess kann Java Bytecode mit Interpreter oder just-in-time Compiler ausführen z Prinzip: write-once-run-anywhere Ö Attraktive Basis für portable Grid Computing Was kann Java denn nicht? Nur grundlegender Support für Kommunikation (durch TCP und UDP) z Keine higher-level Kommunikationsmechanismen z Ö Implementation von Ubiquitous Supercomputing Applikationen schwierig Was ist Nexus? Kommunikationsbibliothek z Unterstützt: z z Multithreading z Adressraum Management z Asynchrone Kommunikation z Synchronisation z Relativ low-level Interface, auf das higherlevel Kommunikationsmöglichkeiten aufgebaut werden können Das Nexus Interface Nodes z Threads z Context z z Global Pointer z Remote Service Request Das Nexus Interface Thread Thread Context Thread Thread Context Context int j; int i; GP NODE Thread GP GP int i; NODE Thread Java Binding für Nexus Erlaubt Java Programmen z Global Pointer zu erstellen und auszutauschen z RSR auf entfernten Objekten auszuführen Besteht aus vier Klassen: z Nexus z GlobalPointer z PutBuffer z GetBuffer Beispiel Implementation -Clientpublic class ExampleClient{ private Nexus nexus; public static void main(String args[]){ ExampleClient n= new ExampleClient(); n.start(args);} public void start(String args[]){ GlobalPointer gp; nexus = new Nexus() args = nexus.init(args,"nx“,null); try { gp = nexus.atach(“x-nexus://cosmo.mcsanl.gov:1234/"); call_server_handler(gp,10); gp.destroy(); } catch(Exception e) e.printStackTrace(); nexus.destroy_curent_context(false) } public void call_server_handler(GlobalPointer gp,int i){ putBuffer buffer; try{ buffer=gp.init_remote_service_request("server_handler",42); buffer.set_buffer_size(buffer.size_of_int(1),1); buffer.put_int(i); buffer.send_remote_service_request(); } catch(Exception e) e.printStackTrace(); }} Beispiel Implementation -Clientpublic class ExampleClient{ private Nexus nexus; public static void main(String args[]){ ExampleClient n= new ExampleClient(); n.start(args);} public void start(String args[]){ GlobalPointer gp; nexus = new Nexus() args = nexus.init(args,"nx“,null); try { gp = nexus.atach(“x-nexus://cosmo.mcsanl.gov:1234/"); call_server_handler(gp,10); gp.destroy(); } catch(Exception e) e.printStackTrace(); nexus.destroy_curent_context(false) } public void call_server_handler(GlobalPointer gp,int i){ putBuffer buffer; try{ buffer=gp.init_remote_service_request("server_handler",42); buffer.set_buffer_size(buffer.size_of_int(1),1); buffer.put_int(i); buffer.send_remote_service_request(); } catch(Exception e) e.printStackTrace(); }} Beispiel Implementation -Clientpublic class ExampleClient{ private Nexus nexus; public static void main(String args[]){ ExampleClient n= new ExampleClient(); n.start(args);} public void start(String args[]){ GlobalPointer gp; nexus = new Nexus() args = nexus.init(args,"nx“,null); try { gp = nexus.atach(“x-nexus://cosmo.mcsanl.gov:1234/"); call_server_handler(gp,10); gp.destroy(); } catch(Exception e) e.printStackTrace(); nexus.destroy_curent_context(false) } public void call_server_handler(GlobalPointer gp,int i){ putBuffer buffer; try{ buffer=gp.init_remote_service_request("server_handler",42); buffer.set_buffer_size(buffer.size_of_int(1),1); buffer.put_int(i); buffer.send_remote_service_request(); } catch(Exception e) e.printStackTrace(); }} Beispiel Implementation -Clientpublic class ExampleClient{ private Nexus nexus; public static void main(String args[]){ ExampleClient n= new ExampleClient(); n.start(args);} public void start(String args[]){ GlobalPointer gp; nexus = new Nexus() args = nexus.init(args,"nx“,null); try { gp = nexus.atach(“x-nexus://cosmo.mcsanl.gov:1234/"); call_server_handler(gp,10); gp.destroy(); } catch(Exception e) e.printStackTrace(); nexus.destroy_curent_context(false) } public void call_server_handler(GlobalPointer gp,int i){ putBuffer buffer; try{ buffer=gp.init_remote_service_request("server_handler",42); buffer.set_buffer_size(buffer.size_of_int(1),1); buffer.put_int(i); buffer.send_remote_service_request(); } catch(Exception e) e.printStackTrace(); }} Beispiel Implementation -Serverpublic class ExampleServer implements HandlerInterface, AttachApprovalInterface{ private GlobalPointer this_gp; … public void start(String args[]){ nexus = new Nexus(); args = nexus.init(args,"nx“,null); register_my_handlers(); this_gp = nexus.global_pointer(this); nexus.allow_attach(1234, this); wait_for_client(); nexus.disallow_attach(1234); this_gp.destroy(); nexus.destroy_current_context(false); } public void register_my_handlers() { Handler h[] = new Handler[2]; h[0] = new Handler(„server_handler“, 42, Handler.NEXUS_HANDLER_TYPE_THREADED, this, 0); h[1]=new Handler(„other_handler“, 53, Handler.NEXUS_HANDLER_TYPE_NONTHREADED, this, 1); nexus.register_handlers(h);} … Beispiel Implementation -Serverpublic class ExampleServer implements HandlerInterface, AttachApprovalInterface{ private GlobalPointer this_gp; … public void start(String args[]){ nexus = new Nexus() args = nexus.init(args,"nx“,null); register_my_handlers(); this_gp = nexus.global_pointer(this); nexus.allow_attach(1234, this); wait_for_client(); nexus.disallow_attach(1234); this_gp.destroy(); nexus.destroy_current_context(false); } public void register_my_handlers() { Handler h[] = new Handler[2]; h[0] = new Handler(„server_handler“, 42, Handler.NEXUS_HANDLER_TYPE_THREADED, this, 0); h[1]=new Handler(„other_handler“, 53, Handler.NEXUS_HANDLER_TYPE_NONTHREADED, this, 1); nexus.register_handlers(h);} … Beispiel Implementation -Serverpublic class ExampleServer implements HandlerInterface, AttachApprovalInterface{ private GlobalPointer this_gp; … public void start(String args[]){ nexus = new Nexus() args = nexus.init(args,"nx“,null); register_my_handlers(); this_gp = nexus.global_pointer(this); nexus.allow_attach(1234, this); wait_for_client(); nexus.disallow_attach(1234); this_gp.destroy(); nexus.destroy_current_context(false); } public void register_my_handlers() { Handler h[] = new Handler[2]; h[0] = new Handler(„server_handler“, 42, Handler.NEXUS_HANDLER_TYPE_THREADED, this, 0); h[1]=new Handler(„other_handler“, 53, Handler.NEXUS_HANDLER_TYPE_NONTHREADED, this, 1); nexus.register_handlers(h);} … Beispiel Implementation -Serverpublic class ExampleServer implements HandlerInterface, AttachApprovalInterface{ private GlobalPointer this_gp; … public void start(String args[]){ nexus = new Nexus() args = nexus.init(args,"nx“,null); register_my_handlers(); this_gp = nexus.global_pointer(this); nexus.allow_attach(1234, this); wait_for_client(); nexus.disallow_attach(1234); this_gp.destroy(); nexus.destroy_current_context(false); } public void register_my_handlers() { Handler h[] = new Handler[2]; h[0] = new Handler(„server_handler“, 42, Handler.NEXUS_HANDLER_TYPE_THREADED, this, 0); h[1]=new Handler(„other_handler“, 53, Handler.NEXUS_HANDLER_TYPE_NONTHREADED, this, 1); nexus.register_handlers(h);} … Beispiel Implementation -Serverpublic class ExampleServer implements HandlerInterface, AttachApprovalInterface{ private GlobalPointer this_gp; … public void start(String args[]){ nexus = new Nexus() args = nexus.init(args,"nx“,null); register_my_handlers(); this_gp = nexus.global_pointer(this); nexus.allow_attach(1234, this); wait_for_client(); nexus.disallow_attach(1234); this_gp.destroy(); nexus.destroy_current_context(false); } public void register_my_handlers() { Handler h[] = new Handler[2]; h[0] = new Handler(„server_handler“, 42, Handler.NEXUS_HANDLER_TYPE_THREADED, this, 0); h[1]=new Handler(„other_handler“, 53, Handler.NEXUS_HANDLER_TYPE_NONTHREADED, this, 1); nexus.register_handlers(h);} … Beispiel Implementation -Server... public void invoke_handler(String name,int id,int local,Object Addr,GetBuffer buf){ switch(local){ case 0: try { int i = buf.get_int(); server_handler(i); } catch(Exception e) e.printStackTrace(); break; case 1: … }} public GlobalPointer attach_approval(String url) { return(this_gp); } private synchronized void wait_for_client() { try { wait(); } chat(Exception e) e.printStackTrace(); } Beispiel Implementation -Server... public void invoke_handler(String name,int id,int local,Object Addr,GetBuffer buf){ switch(local){ case 0: try { int i = buf.get_int(); server_handler(i); } catch(Exception e) e.printStackTrace(); break; case 1: … }} public GlobalPointer attach_approval(String url) { return(this_gp); } private synchronized void wait_for_client() { try { wait(); } chat(Exception e) e.printStackTrace(); } Beispiel Implementation -Server... public void invoke_handler(String name,int id,int local,Object Addr,GetBuffer buf){ switch(local){ case 0: try { int i = buf.get_int(); server_handler(i); } catch(Exception e) e.printStackTrace(); break; case 1: … }} public GlobalPointer attach_approval(String url) { return(this_gp); } private synchronized void wait_for_client() { try { wait(); } chat(Exception e) e.printStackTrace(); } Beispiel Implementation -Server... public void invoke_handler(String name,int id,int local,Object Addr,GetBuffer buf){ switch(local){ case 0: try { int i = buf.get_int(); server_handler(i); } catch(Exception e) e.printStackTrace(); break; case 1: … }} public GlobalPointer attach_approval(String url) { return(this_gp); } private synchronized void wait_for_client() { try { wait(); } chat(Exception e) e.printStackTrace(); } Nexus im Überblick Kann auf einer großen Breite von Netzwerkcomputersystemen implementiert werden z Mechanismen zur Konfiguration und Auswahl von Kommunikationsmethoden z Erfüllt Forderungen an Kommunikationsmöglichkeiten z Higher-level Interfaces auf Nexus z Ziel: automatische Generierung des Quellcodes: z Handler Registrierung z Marshalling der Daten z IDL: z Beschreibt entfernt aufrufbare Methoden z IDL-Compiler konvertiert in Java Code CORBA Common Object Request Broker Architecture z Objekt Export Interface in IDL z Internet Inter-ORB Protokol (IIOP) z Object Request Broker als zentraler Bus z z Läuft auf allen Plattformen mit implementiertem ORB RMI JavaSoft Remote Method Invocation z Java Interface Definition anstatt IDL z Java Remote Method Protocol z Nutzt Javas Objekt Serialisierung z Namensmechanismus im Server z RMI Nexus vs. CORBA vs. RMI NEXUS CORBA RMI Asynchronie 9 8 8 Symmetrie 9 9 9 ORB Remote Object 9 ∅ Integriert Integriert Globale Global Namen Pointer High 9 Performance Leicht Universeller integrierbar Einsatz Vielen Dank für Eure Aufmerksamkeit