14.01.2015 Aufrufe

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

5.4 E<strong>in</strong>e JVM als Baukasten<br />

lassen sich durch den Abhängigkeitsgraphen der Basisschicht feststellen. Wie auch schon bei der<br />

Threaderzeugung kann die Threadsteuerung nachträglich notwendig werden, wenn Code nachgeladen<br />

wird.<br />

Wie bereits <strong>in</strong> Abschnitt 5.2.2 geschildert, können die Verwaltungsstrukturen auf die Anzahl der<br />

vorhandenen Aktivitätsträger angepasst werden. Um dabei die Flexibilität zu erhalten, muss der<br />

Verwalter über die Erzeugung neuer Threads <strong>in</strong>formiert werden, um gegebenenfalls die Threadsteuerung<br />

austauschen zu können.<br />

5.4.4.3 Scheduler<br />

S<strong>in</strong>d mehrere lauffähige Aktivitätsträger im System vorhanden, muss vor jeder Threadumschaltung<br />

ausgewählt werden, welcher der möglichen Kandidaten nun tatsächlich als nächstes die CPU verwenden<br />

darf. Diese E<strong>in</strong>planung der Aktivitätsträger wird vom Scheduler vorgenommen, der somit die Strategie<br />

zur Auswahl des nächsten Threads darstellt.<br />

Abbildung 5.10: Abhängigkeiten des Schedulers<br />

Der Scheduler wird vor jeder Threadaktivierung beziehungsweise -umschaltung aktiviert. Dies ist<br />

notwendig, wenn der aktuelle Aktivitätsträger zum Beispiel blockiert, durch e<strong>in</strong> Zeitscheibenereignis<br />

verdrängt wird oder den Prozessor freiwillig abgibt (Thread.yield()). Der Scheduler wird somit<br />

nie direkt durch die Anwendung aktiviert, sondern immer nur <strong>in</strong>direkt über die Threadsteuerung.<br />

Je nachdem, wie viele Aktivitätsträger im System s<strong>in</strong>d, lassen sich optimierte Varianten des Schedulers<br />

erstellen. Ist nur e<strong>in</strong> Thread vorhanden, wird gar ke<strong>in</strong>e E<strong>in</strong>planungsstrategie benötigt, da es ke<strong>in</strong>e<br />

Wahlmöglichkeit gibt. Die Komplexität der E<strong>in</strong>planungsstrategie nimmt mit zunehmender Threadanzahl<br />

zu. Bei nur zwei Aktivitätsträgern kann immer der jeweils andere ausgewählt werden, bei deutlich<br />

mehr Threads kann e<strong>in</strong>e komplexe Strategie oder sogar e<strong>in</strong> generischer Scheduler mit austauschbarer<br />

Strategie e<strong>in</strong>gesetzt werden. Ist die Anzahl der vorhandenen Threads konstant oder die maximale<br />

Anzahl bekannt, so kann man e<strong>in</strong>e optimierte Implementierung verwenden, die im Gegensatz zu<br />

e<strong>in</strong>er generischen Implementierung, weniger Overhead mit sich br<strong>in</strong>gt, dafür aber nicht beliebig viele<br />

Threads verwalten kann.<br />

Um automatisch e<strong>in</strong>e Optimierung auswählen zu können, muss die Anzahl der vorhandenen Threads<br />

festgestellt werden. E<strong>in</strong>ige spezielle Fälle können zur Kompilierzeit festgestellt werden. Beispielsweise<br />

kann e<strong>in</strong>e Codeanalyse feststellen, dass <strong>in</strong> der Anwendung ke<strong>in</strong> Thread-Objekt erstellt wird. Somit ist<br />

nur e<strong>in</strong> Aktivitätsträger vorhanden. Wird jedoch Code zur Erstellung e<strong>in</strong>es Thread-Objekts gefunden,<br />

so ist es nicht immer möglich zu sagen, wie oft er durchlaufen wird.<br />

Erfolgversprechender ist, zur Laufzeit festzustellen, wie viele Threads aktuell existieren und anhand<br />

dieser Information die optimale Threadverwaltung auszuwählen. Dazu meldet der verwaltete Knoten<br />

dem Verwalter, sobald sich die Anzahl der existierenden Threads verändert. Dieser kann dann e<strong>in</strong>en<br />

Scheduler <strong>in</strong>stallieren, der optimal auf die entsprechende Threadanzahl abgestimmt ist.<br />

Die Auslagerung des Schedulers als externer Dienst ist nur s<strong>in</strong>nvoll, wenn die Bestimmung des<br />

nächsten Threads sehr aufwendig ist. Oft ist die e<strong>in</strong>gesetzte Strategie jedoch relativ e<strong>in</strong>fach.<br />

115

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!