Im AspectIX-Projekt wird eine objektbasierte Middleware entwickelt, die auf dem
fragmentierten Objektmodell beruht; in dieser Middleware wird Fehlertoleranz
durch aktive Replikation unterstützt. Hierbei werden zwei Eigenschaften von
AspectIX besonders genutzt: ersten die Möglichkeit, transparent objektspezifischen
Code ("Fragmente") verteilt bei Diensterbringern und -nutzern zu laden; zweitens
die Möglichkeit, diesen Fragmentcode durch Codetransformationsprozesse (teilweise)
automatisch zu erzeugen.
Im einfachsten Fall wird bei aktiver Replikation die Konsistenz der Replikate dadurch
erreicht, dass alle Replikate alle Operationen strikt sequentiell in gleicher
Reihenfolge ausführen; in der Regel wird diese Ordnung durch Zustellen der Aufrufe
an alle Replikate durch ein total geordnetes Gruppenkommunikationssystem erreicht.
Dies ist aber oft unnötig Ineffizient und kann auch zu Verklemmungen führen.
Die beschriebene Situation lässt sich verbessern, wenn Multithreading bei Methodenaufrufen
an der Replikatgruppe unterstützt werden. Hierzu sind geeignete Strategien
notwendig, um zu verhindern, dass sich durch unterschiedliche zeitliche Ausführung
der Threads Inkonsistenzen zwischen Repliaten ergeben. Verfahren, die
hierzu die Laufzeitumgebung (Betriebssystem, JVM) modifizieren, werden im Rahmen
dieser Arbeit nicht betrachtet.
Zwei verschiedene Strategien können hier eingesetzt werden: Zum einen kann ein
(nichtpreemtives) Thread-Scheduling so implementiert werden, dass immer maximal
ein Thread aktiv. Wenn dieser aktive Thread anhält (Ende, Blockierung an einem
Lock, an einer Condition Variable, an einem langdauerndem Systemaufruf oder
Aufruf an einem anderen entfernten Objekt), wird bei allen Replikaten identisch auf
deterministische Weise der nächste Thread ausgewählt. In dieser Variante ist der
Zugriff auf gemeinsame Daten (über Semaphore) ohne Kommunikation möglich, dafür
müssen alle Thread-anhaltenden und -startenden Operationen von der Infrastruktur
koordiniert werden. Diese erste Variante ist (teilweise) bereits in AspectIX
implementiert. Zum anderen können Threads beliebig (auch preemtiv) ausgeführt
werden, und eine Synchronisierung über das Netzwerk erfolgt nur, wenn Locks angefordert
werden, bzw. Zugriffe auf Condition Variables erfolgen. Es ist sicherzustellen,
dass Locks bei allen Replikaten in gleicher Reihenfolge zugeteilt werden. Dies
erlaubt echte Parallelität (was insbesondere auf Mehr-CPU-Rechnern Vorteile
bringt), kostet dafür an anderet Stelle interaktiven Koordinierungsaufwand zwischen
den Replikaten)