4 Verteilte Algorithmen Prozesse als Systemkomponenten: Spezifikation eines Prozesses ? (Vgl. Spezifikation eines ADT) syntaktisch: z.B. Ports oder Parameter vom Typ „Prozeß“ semantisch: Ein/Ausgabeverhalten Unterschiedliche Arten von Beziehungen zwischen Prozessen – „Interaktionsparadigmen“, „Architekturstile“ (Prozesse spielen Rollen in diesen Beziehungen) Datenfluß-Architektur Client/Server-Architektur Verteilter Algorithmus
Datenfluß-Architektur (dataflow architecture, „pipes and filters“) keine ausgezeichneten Rollen z.B. Unix Pipeline: grep pat sort lpr oder Datenflußmaschine: + - *
Client/Server-Architektur Rollen: Auftraggeber (Klient) und Auftragnehmer (Server) lpr file grep pat file print server file server mail server
Verteilter Algorithmus Prozesse kooperieren zwecks Erreichung eines gemeinsamen Ziels - in verschiedenen oder gleichen Rollen, - mit bestimmten, vereinbarten Interaktionsmustern (Protokollen) z.B. zuverlässige unidirektionale Nachrichtenübertragung über unzuverlässigen bidirektionalen Kanal: Kommunikationsprotokoll Daten Sender Empfänger Quittungen oder Einigung auf „Anführer“: Auswahlprotokoll
Def.: Verteilter Algorithmus Prozesse kooperieren zwecks Erreichung eines gemeinsamen Ziels Häufig Fehlertoleranz bei unzuverlässigen Prozessen oder unzuverlässiger Interprozeßkommunikation Formulierung in Pseudocode, mit prozeßbezogener Adressierung
4.1 Zeit und Kausalität Nochmals: Charakteristika eines verteilten Systems: es gibt keinen gemeinsamen Speicher es gibt keine globale Zeit absolute Zeit interessiert wenig aber: relative Zeitpunkte einzelner Ereignisse können wichtig sein (z.B. „push vor pop - oder pop vor push?“ )
4.1.1 Kausale Ordnung von Ereignissen Ereignisse: - prozeßintern (z.B. „Zuweisung an Variable x“) - send (Ausführung von send) - recv (Ausführung von recv) (Prozesse sind als sequentiell vorausgesetzt) (Kommunikationssemantik: zunächst keine Festlegung) Ereignismenge, nicht näher spezifiziert: E
Def.: Kausale Abhängigkeit: Zwei Ereignisse a,b E stehen in der Beziehung a b („a vor b“, „a happened before b“, „b ist kausal abhängig von a“) zueinander, wenn gilt: entweder 1) a und b gehören zum selben Prozeß und werden in dieser Reihenfolge ausgeführt oder 2) a ist das Senden einer Nachricht, b ist das Empfangen dieser Nachricht oder 3) es gibt ein Ereignis c mit a c und c b (Transitivität von )
Bemerkung: Die Relation „gleich oder vor“ ist partielle Ordnung auf E: Kausalordnung Def.: Zwei Ereignisse a,b sind zueinander nebenläufig (unabhängig, concurrent, causally unrelated), wenn weder a b noch b a
Veranschaulichung der partiellen Ordnung durch Zeitdiagramm (ähnlich dem Hasse-Diagramm) Zeit z.B. a c e b d e c h ! nicht a d , g j ! x a b c d e y f g Aus x b , d y folgt, daß die beiden Nachrichten nicht FIFO übertragen wurden! h i j
Nochmals zur Semantik von Senden/Empfangen: Reihenfolgetreue (FCFS, FIFO) bei Sender/Empfänger-Paar: 1 gegebenenfalls erzwingen mit Durchnumerieren der Nachrichten 2 Kausalitätstreue bei mehreren Beteiligten: „a vor c“ ! a b a c c wie erzwingen ? a
in Anlehnung an die Kausalitätsbeziehung 4.1.2 Logische Uhren in Anlehnung an die Kausalitätsbeziehung Ziel: Jedem Ereignis e E wird eine „Zeit“ C(e) zugeordnet. Die Zeiten sind partiell geordnet, und die Ordnung sollte isomorph zur Kausalordnung sein: (E, ) (C(E), <) Die Abbildung C: E T heißt logische Uhr.
1. Versuch: Skalare Zeit (Lamport 1978) T = natürliche Zahlen (totale Ordnung - daher zum Scheitern verurteilt) Jeder Prozeß führt in einer lokalen Uhr eine lokale Zeit c und versieht jede versendete Nachricht mit Zeitstempel (timestamp) t = c. Vor jedem Ereignis wird c um 1 erhöht. Nach recv mit Zeitstempel t wird c auf max(c,t+1) gesetzt.
Für beliebige Ereignisse a,b E gilt a b C(a) < C(b) , aber nicht die Umkehrung! Auch gilt zwar C(a) = C(b) (a b b a) , aber nicht C(a) = C(b) a = b Bemerkung: Hängt man an die Skalarzeit die Prozeßnummer an, so kann man die Ereignisse gemäß dieser Kennung linear anordnen – verträglich mit ihrer Kausalordnung.
2. Versuch: Vektorzeit (Fidge, Mattern 1988) T = n-Tupel natürlicher Zahlen (bei n Prozessen 1,..,n) t s : ti si für alle i=1,..,n Halbordnung! Jeder Prozeß p führt in einer lokalen Uhr eine lokale Vektorzeit c und versieht jede versendete Nachricht mit c als Zeitstempel. Vor jedem Ereignis wird cp um 1 erhöht. Nach recv mit Zeitstempel t werden für alle i=1,..,n die ci auf max(ci,ti) gesetzt.
Mit der Vektorzeit C erreichen wir die gewünschte Isomorphie: (E, ) (C(E), <)