Unterstützung tzung von Programmiersprachen von Tobias Schlösser
Überblick Ubiquitous Supercomputing Anforderungen an Programmiersprachen Grid Computing in Java Higher-level Kommunikationsmöglichkeiten
Ubiquitous Supercomputing Verbindet Aspekte des Ubiquitous (=allgegenwärtig) Computings und des Supercomputings Ziel: Lokale Applikationen nutzen Ressourcen entfernter Supercomputer
Smart Instruments Wissenschaftliche Instrumente Nutzen kann durch Supercomputer erhöht ht werden High-speed Netzwerke ermöglichen Supercomputern viele Instrumente zu versorgen Computational Power der Instrumente steigt
Beispiel Wettersatellit Erstellt Bilder in verschiedenen Wellenlängen ngen Daten: Wettersatellit Bodenstation Supercomputer (Verarbeitung( zu 3D Displaygerät Wissenschaftler verfolgen 3D Bilder in Realzeit Verarbeitung zu 3D-Bild)
Smart Applications Desktop Applikationen Hoch entwickelte User Interfaces, aber nur einfache Berechnungen Anspruchsvollere Berechnungen durch Supercomputer
Beispiel NEOS 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 tzung der Zusammenarbeit an verschiedenen Orten Große e Vielfalt solcher Systeme Möglichkeit, gemeinsame Dokumente zu nutzen (z.b. Lotus Notes) Freie elektronische Diskussion in geteilten virtuellen Räumen R (z.b. MUD)
Beispiel Mirror Worlds Verhalten einer gesamten Institution Computermodelle interessanter Aspekte der Realität Kommunikation zwischen Erkundenden der Mirror World möglichm Durch Internet nicht mehr nur Modell, sondern auch System selbst
Anforderungen an Kommunikationsmöglichkeiten einer Programmiersprache Asynchronie: Ubiquitous Supercomputing Applikationen benötigen Mechanismen, die Synchronisation nicht erzwingen Symmetrie: Clients und Server gleichberechtigte Partner Gegenseitiger Prozeduraufruf möglichm
Anforderungen an Kommunikationsmöglichkeiten einer Programmiersprache Globale Namen: Referenz auf Objekt Ermöglichen komplexe verteilte Datenstrukturen Globaler Namensraum Globaler Adressraum High Performance: Keine Engpässe Anpassung an komplexe heterogene Systeme
Anforderungen aus universellem Einsatz Einfache Verbreitung Kostengeringes Interface Zugriff auf entfernte Datenquellen Vorbild: Web-Browser
Grundsätzliche Vorteile von Java Objektorientierte Programmiersprache wieder verwendbare Softwarekomponenten Unterstützung tzung in der Softwareentwicklung Vordefinierte APIs,, Bibliotheken, Komponenten Hochentwickeltes GUI Framework Java Interpreter in vielen Browsern integriert
Universeller Einsatz durch Java Plattformunabhängiger ngiger Bytecode Tragbare kompakte Repräsentation Prozess kann Java Bytecode mit Interpreter oder just-in in-time Compiler ausführen Prinzip: write-once once-run-anywhere Attraktive Basis für f r portable Grid Computing
Was kann Java denn nicht? Nur grundlegender Support für f Kommunikation (durch TCP und UDP) Keine higher-level Kommunikationsmechanismen Implementation von Ubiquitous Supercomputing Applikationen schwierig
Was ist Nexus? Kommunikationsbibliothek Unterstützt: tzt: Multithreading Adressraum Management Asynchrone Kommunikation Synchronisation Relativ low-level level Interface, auf das higher- level Kommunikationsmöglichkeiten aufgebaut werden könnenk
Das Nexus Interface Nodes Threads Context Global Pointer Remote Service Request
Das Nexus Interface Thread Thread Thread Thread Thread Thread Context Context Context int j; GP int i; GP GP int i; NODE NODE
Java Binding für f r Nexus Erlaubt Java Programmen Global Pointer zu erstellen und auszutauschen RSR auf entfernten Objekten auszuführen Besteht aus vier Klassen: Nexus GlobalPointer PutBuffer GetBuffer
Beispiel Implementation -Client- public 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 -Client- public 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 -Client- public 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 -Client- public 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 -Server- public 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 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 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 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 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: case 1: try { int i = buf.get_int(); server_handler(i); } catch(exception e) e.printstacktrace(); break; }} 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: case 1: try { int i = buf.get_int(); server_handler(i); } catch(exception e) e.printstacktrace(); break; }} 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: case 1: try { int i = buf.get_int(); server_handler(i); } catch(exception e) e.printstacktrace(); break; }} 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: case 1: try { int i = buf.get_int(); server_handler(i); } catch(exception e) e.printstacktrace(); break; }} 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 Mechanismen zur Konfiguration und Auswahl von Kommunikationsmethoden Erfüllt Forderungen an Kommunikationsmöglichkeiten
Higher-level Interfaces auf Nexus Ziel: automatische Generierung des Quellcodes: Handler Registrierung Marshalling der Daten IDL: Beschreibt entfernt aufrufbare Methoden IDL-Compiler konvertiert in Java Code
CORBA Common Object Request Broker Architecture Objekt Export Interface in IDL Internet Inter-ORB Protokol (IIOP) Object Request Broker als zentraler Bus Läuft auf allen Plattformen mit implementiertem ORB
RMI JavaSoft Remote Method Invocation Java Interface Definition anstatt IDL Java Remote Method Protocol Nutzt Javas Objekt Serialisierung Namensmechanismus im Server
RMI
Nexus vs. CORBA vs. RMI NEXUS CORBA RMI Asynchronie Symmetrie Globale Namen High Performance Universeller Einsatz Global Pointer Leicht integrierbar ORB Integriert Remote Object Integriert
Vielen Dank für f r Eure Aufmerksamkeit