2. ¨Ubung zur Vorlesung - Verteilte Systeme

Werbung
2. Übung zur Vorlesung Verteilte Betriebssysteme“
”
Universität Ulm · Fakultät für Informatik · Verteilte Systeme
Prof. Dr.-Ing. Franz J. Hauck · Andreas I. Schmied
{hauck,schmied}@informatik.uni-ulm.de
Abgabetermin: bis spätestens Freitag 14.11.2003 10:00
Bitte unterstützen Sie die Korrektur Ihrer Lösung:
•
•
•
•
•
Beachten Sie die allgemeinen Hinweise zur ersten Übung.
Achten Sie darauf, dass die Breite Ihres Quelltextes 110 Zeichen pro Zeile nicht überragt.
Java-Quelldateien sollten in einen Unterverzeichnisbaum analog zur package-Hierarchie eingeordnet werden.
Benennen Sie das Abgabearchiv nach Ihrem Login-Namen (bzw. mehrere Namen durch -“ getrennt).
”
Beispielhafter Inhalt eines Team-Tarballs xy12-yz34.tar:
xy12-yz34/
+ README (optional)
+ Makefile, build.xml, build.sh (optional)
‘ vbs/
‘ u2/
‘ xy12_yz34/
+ FirstClass.java
‘ SecondClass.java
Aufgabe 1
Zeit in verteilten Systemen (10 Punkte)
Beziehen Sie den vorbereiteten Programmcode von der Internetseite der Vorlesung und ändern/erweitern Sie ihn wo nötig.
Experimentieren Sie vor allem mit den voreingestellten Konstanten bis sich ein vernünftiges Laufzeitverhalten zeigt.
Simulieren Sie einen Rechnerverbund, dessen 10 Teilnehmer sich mittels Christians Verfahren selbständig gegeneinander
synchronisieren. Sie greifen also nicht auf einen zentralen Zeitserver zu, sondern streben eine Konvergenz ihrer lokalen
Uhren auf eine gemeinsame Zeit an. Der Algorithmus eines Knotens terminiert, wenn seine Zeit von zwei Dritteln der
übrigen Knoten nur noch um ein vorgegebenes Maß (Node.TIMER SYNC DEVIATION) abweicht.
• Simulieren Sie die einzelnen Rechnerknoten inkl. ihrer Systemuhren jeweils durch mehrere Threads. Ein Beispielszenario könnte folgendermaßen aussehen:
– Ein Timer-Thread erhöht nach jedem Tick einen internen long-Zähler, der die lokale Uhr darstellt. Realisieren Sie die Taktung mittels Object.wait(long) oder java.util.Timer/TimerTask. Beim Erzeugen des KnotenObjekts wird eine Anfangsfrequenz festgesetzt; die einzelnen Uhren weichen also in ihrer Ganggenauigkeit
voneinander ab.
– Die Frequenz der Taktung soll mittels Node.addTickFreq(long) dynamisch erhöht oder erniedrigt werden
können, um die lokale Uhrzeit stetig durch Verlangsamung oder Beschleunigung anzupassen.
– Ein Haupt-Thread initiiert Nachrichten (Message-Objekte) und schickt sie asynchron an alle übrigen Knoten,
um die Synchronisierung der lokalen Uhr vorzubereiten. Sind alle Nachrichten geschickt, wartet dieser Thread
(Object.wait()), bis vom Empfangs-Thread alle Antworten geliefert wurden. Danach wird die lokale Uhr
angepasst und ggf. die nächste Sende-Warte-Phase eingeleitet bzw. der Thread beendet. Node.isActive() sollte
dann false zurückliefern.
– Der Empfangs-Thread bedient zwei Arten von Nachrichten: Ist Message.origin gleich dem lokalen“ Kno”
tenobjekt, so handelt es sich um eine Antwort auf eine ursprünglich hier erzeugte Nachricht, und sie muss
an den Haupt-Thread weitergeleitet werden (Empfangs-Warteschlange, Object.notify()). Kennzeichnet Message.origin einen anderen Knoten, so handelt es sich wohl um eine Synchronisierungsnachricht eines dieser
übrigen, und sie muss mit den lokalen Zeitstempeln versehen und zurückgeschickt werden.
(bitte wenden)
• Zur Kommunikation verwenden Sie die statische send(...)-Methode der Network-Klasse. Sie simuliert ein Kommunikationsnetzwerk mit unterschiedlichen Übertragungsverzögerungen.
– Ein Knoten (oder einer seiner Threads) kann sich mit Network.addMessageListener() am Kommunikationssystem anmelden, um Nachrichten, die für ihn bestimmt sind, asynchron zu empfangen.
– Beachten Sie, dass MessageListener.received(Message) möglicherweise in einem Thread der Network-Klasse
ausgeführt wird und Sie deshalb möglichst schnell aus dieser Methode zurückkehren sollten.
• Der Knoten 4 soll mit einer stark abweichenden Uhrzeit beginnen und während des Algorithmus davon überzeugt
werden, seine Zeit an die übrigen anzupassen. Die übrigen Knoten sollen natürlich nicht von den Zeitdaten dieses
Knoten verstellt werden.
• Der Knoten 7 soll ein bösartiger False-Ticker“ sein, der durch variierende Zeitkorrekturen in die Vergangenheit
”
oder Zukunft störend auf die übrigen einwirken will. Diese sollen sein Fehlverhalten erkennen und ihn jeweils lokal
von der eigenen Synchronisierung ausschließen. Die schwankenden Zeitdaten des Knoten sollen hier jedoch nicht
derart gravierend abweichen, dass er analog zum Knoten 4 ausgeschlossen würde.
Aufgabe 2
Konsistente Schnitte (0 Punkte, bitte vorbereiten!)
• Die Terminierung des Algorithmus aus Aufgabe 1 ist relativ leicht festzustellen. Wie würden Sie diese Aussage
begründen bzw. widerlegen?
• Wie könnte man die Aufgabe abändern oder sogar optimieren, damit die Terminierung (nicht mehr) ohne ein
spezielles Verfahren erkannt werden kann.
Aufgabe 3
Kausalität in verteilten Systemen (0 Punkte, bitte vorbereiten!)
• In welchen zentralen Aussagen unterscheiden sich die logischen Uhren nach Lamport von der Vektorzeit?
• Konstruieren Sie ein Beispiel, anhand dessen man diese Unterschiede gut darstellen kann.
Herunterladen