7.4 Verteilungsabstraktion in heterogener Umgebung Szenario: reiner Maschinencode (native code) bei unterschiedlichen Rechnerarchitekturen, unterschiedlichen Betriebssystemen, unterschiedlichen Übersetzern, aber nach wie einheitlicher Programmiersprache erfordert - Übersetzung von Code-Fragmenten auf jedem System - nur Daten-, keine Code-Übertragung - Umcodierung, z.B. mit kanonischer Darstellung im Netz 7.4.1 Höhere Programmiersprachen Fernaufrufsysteme wurden für viele Sprachen entwickelt, . . . Modula, . . . , Ada, . . . , Smalltalk, . . . , Eiffel, . . . , mit mehr oder weniger guter Verteilungsabstraktion. Beispiel: Eiffel (Projekt HERON, FU Berlin, Löhr/Wolff/... 1990-96) externe Datenrepräsentation: reguläres Ein/Ausgabeformat Ortsabstraktion durch separate Konfigurationssprache Konfigurator steuert gemäß Konfigurationsbeschreibung automatisch Übersetzung, Vertretererzeugung und Binden 7.4.2 SUN Remote Procedure Call = modulorientierte Fernaufrufe für C-Programme bzw. Maschinencode ! C-Programmodule haben zwar Schnittstellen, aber C kennt kein Sprachkonzept „Schnittstelle“ Schnittstellenbeschreibung („protocol description“) mit „RPC language“ XDR (external data representation) Terminologie: Service = Bündel von „Programmen“, bestehend aus jeweils mehreren „Prozeduren“, eventuell in jeweils mehreren Versionen Server Prozeß, der als Träger eines Service fungiert = 7.4.2.1 Generierung von Stub Code Beispiel für Schnittstellenbeschreibung: /* file rusers.x /* protocol description for /* remote users program */ */ */ /* interface of version 1 */ program RUSERSPROG { version RUSERSVERSOLD { /* void NULL() = 0; /* automatically generated int RNUSERS() = 1; /* number of users string RUSERS() = 2; /* info about users } = 1; } = 100002; */ */ */ */ Vertreter-Erzeuger rpcgen generiert daraus neben den Stubs /* file rusers.h */ #define RUSERSPROG ((u_long) 100002) #define RUSERSVERSOLD ((u_long) 1) #define RNUSERS ((u_long) 1) extern int *rnusers_1(); #define RUSERS ((u_long) 2) extern char **rusers_1(); Prozedur und Vertreter tragen den gleichen Namen, haben aber unterschiedliche Signaturen (s.u. 7.4.2.2). ! Parameter/Ergebnisse müssen grundsätzlich Verweise sein ! 7.4.2.2 RPC-Programmierung So sieht der Anbieter aus: /* file rusers.c /* remote users server #include "rusers.h" int *rnusers_1() { static int result; ..... return(&result); } char **rusers_1() { ..... ..... } */ */ ... und so sieht der Klient aus: #include <rpc/rpc.h> #include "rusers.h" int rnusers(host) char *host; int *result; CLIENT *s; s = clnt_create(host, RUSERSPROG, RUSERSVERSOLD, "tcp"); if (s!=NULL) { result = rnusers_1(s); if (result!=NULL) return(*result); else ..... } else ..... } /* "client handle" /* remote linking */ */ /* remote call */ /* */ ... failed /* server not found */ 7.4.2.3 Fernbinden und Anbieter-Installation clnt_create(host,...) realisiert Fernbinden, d.h. stellt Verbindung mit einem Anbieter her: 1. Auf host existiert (hoffentlich) ein Namensdienst: Portmapper, stets über Port 111 ansprechbar. 2. Fernaufruf (!) an Portmapper übermittelt den „Namen“ (program, version, protocol) und liefert als Antwort die Portnummer des entsprechenden Anbieters. 3. Internetadresse von host sowie gelieferte Portnummer werden im Client Handle eingetragen (und dieses wird beim Fernaufruf als zusätzliches Argument (!) dem Vertreter übergeben) Installation des Anbieters: Wenn ein Anbieter hochgefahren wird, beinhaltet die vom Server Stub (!) vorgenommene Initialisierung die Erzeugung geeigneter Ports sowie deren Registrierung beim lokalen Portmapper (durch „lokalen Fernaufruf“). Alternative: Ad-hoc-Installation eines Anbieters (on demand): Initialisierung des Internet Daemon (3.2.1) beinhaltet Erzeugung und Registrierung der Ports (gemäß Konfigurationsdatei). Anfrage bei einem Port bewirkt Installation des Anbieters. Eventuell Deaktivierung nach Timeout – mit Rettung und späterer Wiederherstellung des Zustands (sofern vorhanden). 7.4.2.4 RPC-Protokoll verwendet entweder TCP oder UDP, je nach Dienst Fehlersemantik: at-most-once für TCP, at-least-once für UDP Externe Datendarstellung: Codierung der XDR-Typen Zugriffsschutz: entweder keiner oder ... (Varianten) (Information über Standarddienste: ypcat rpc.bynumber)