Unterstützung von Programmiersprachen

Werbung
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
Herunterladen