Verteilte Rechenkapazität durch »Remote Procedure Calls« RPC-Middleware für Embedded Systeme

Im Internet der Dinge mit vielen kleinen Recheneinheiten gilt es, die Rechenkapazität zu verteilen. Mit spezieller Middleware lassen sich sogenannte »Remote Procedure Calls« in Embedded-Anwendungen realisieren und die hierfür nötige Kommunikation abwickeln.

Die aktuelle Entwicklung hin zum »Internet of Things« (IoT) bringt viele Herausforderungen mit sich. So werden viele kleine Recheneinheiten mit jeweils nur verhältnismäßig geringer Leistungsfähigkeit auf die gemeinsame Lösung komplexer Aufgaben angesetzt. Ein zentraler Baustein hierfür ist die Kommunikation dieser Teilnehmer über die entsprechende Vernetzung. Es ist also eine Lösung zu schaffen, welche die Kommunikation ermöglicht und die Rechenkapazität verteilt. Bereits heute wird die Nutzung verteilter Rechenkapazitäten häufig benötigt und eingesetzt. Auf Plattformen mit Mehrkernprozessoren müssen die Aufgaben verteilt werden – vergleichbar mit den Anforderungen für das IoT. Auf diesen Plattformen arbeitet meist ein Betriebssystem, und der Entwickler bereitet seine Programme so vor, dass das Betriebssystem diese optimal auf die einzelnen Kerne verteilen kann. In diesem Zusammenhang wird eine Interprozesskommunikation notwendig, damit sich die einzelnen Teiloperationen abstimmen können.

Remote Procedure Calls (RPC)

In typischen Embedded Systemen ist ein Betriebssystem, das die Aufgabe der Ressourcenverteilung übernehmen kann, jedoch selten vorhanden. Um diesen Mangel auszugleichen wurden bereits diverse Konzepte entwickelt. Eines davon ist »Remote Procedure Call« (RPC). Die Grundidee: Eine Einheit kann eine Funktion aufrufen, die auf einem entfernten System ausgeführt wird. Dabei ist für den Aufrufenden nicht ersichtlich, wo die Funktion ausgeführt wird − der Aufruf geschieht also transparent.

Es gibt eine Vielzahl von RPC-Bibliotheken für verschiedene Sprachen. Ein Beispiel ist »Java Remote Method Invocation« (RMI). Java RMI ist speziell auf das Java-Umfeld abgestimmt und erlaubt es dem Entwickler, Objekte (in Bild 1 mit »Objekt A« dargestellt) für einen Zugriff von außen bereitzustellen. Der Aufrufer kann sich Informationen über das Objekt A holen und die zur Verfügung gestellte Funktion aufrufen. Dabei wird im Programm des Aufrufers ein »Proxy A« erzeugt. Er bildet die Funktionsdeklaration ab, verpackt bei einem Aufruf die Daten (Marshalling) und versendet sie zum Server. Dort entpackt der »Dispatcher A« die Nachricht und interpretiert sie. Daraufhin wird die angeforderte Funktion aufgerufen und das Ergebnis zum Client zurückgeschickt (Bild 1).