3 - Aufgabe 6: Verteilte Synchronisation [ID:34372]
50 von 117 angezeigt

Hallo zusammen. Nachdem es in den letzten Videos um Zeit und die Synchronisation in verteilten

Systemen ging, gibt es in diesem Video noch einen Überblick zur Aufgabe und eine gewichtige

Tipps und Hinweise. In der Aufgabe geht es darum, eine verteilte Synchronisation mittels

des LampadLog-Protokolls zu implementieren. Als Anwendungsinstellung gibt es dabei die

Klasse VSLampadLog, die die Methoden Log und UnLog zur Verfügung stellt, um so kritische

Abschnitte in verteilten Systemen zu schützen. Intern wird dabei das LampadLog-Protokoll

verwendet, das in der Klasse VSLampadProtokoll implementiert werden soll, und neben einer

Initialisierungsmethode in einer Methode Event auf einkommende Request-, Ag- und Release-Nachrichten

reagiert. Im 7-Mann-HiBZTS-Teil der Aufgabe sollte zusätzlich zeitbeschränkte Sperrversuche

implementieren, also dass nicht wie beim Log unendlich lange blockiert wird, sondern dass

ihr eine weitere Methode TryLog mit einem TimeOut anbietet, nachdem die Log-Anfrage

dann abgebrochen wird. Es gibt dabei vier Klassen, die miteinander interagieren. Zwei

davon sind bereits implementiert, zwei müsst ihr im Rahmen der Aufgabe selbst implementieren.

Zum Testen eurer Log-Protokoll-Implementierung ist die Klasse VSLampadTest schon bereitgestellt.

Dieses bietet euch Testanwendungen sowohl für den regulären Aufgabenteil als auch für

den 7-Mann-HiBZTS-Zusatz an. Die Testanwendung verwendet dabei die vom Sperrobjekt VSLampadLog

angebotenen Methoden Log bzw. TryLog und UnLog. Das Sperrobjekt VSLampadLog muss,

bis auf die Methodensignaturen, dabei von euch selbst implementiert werden. Zur Umsetzung

des Logs verwendet das Sperrobjekt das Log-Protokoll, dessen Verhalten in der Klasse VSLampadProtokoll

zu implementieren ist. Die Kommunikation mit dem Protokoll ist dabei ereignisbasiert. Es

enthält also vom Sperrobjekt und von anderen Prozessen Ereignisse und reagiert dementsprechend.

Zur Kommunikation der Prozesse untereinander wird euch mit der Klasse VSCluster ein zuverlässiges

Kommunikationssystem zur Verfügung gestellt. Im Rahmen der Aufgabe könnt ihr hier die beiden

Methoden Unicast zum Senden einer Nachricht an einen speziellen Prozess bzw. Multicast

für einen Broadcast an alle Prozesse im Cluster verwenden. Euer Log besteht eigentlich aus

zwei Komponenten. Einerseits die Benutzerschnittstelle, die in VSLampadLog implementiert wird und

andererseits die Protokollschicht, die von diesem Log verwendet wird. Von der Schnittstelle

wird der Anwendung grundlegend zwei Methoden zur Verfügung gestellt. Log und Unlog, die

zum Sperren bzw. Entsperren eines kritischen Abschnitts verwendet werden können. Log blockiert

dabei solange, bis der Abschnitt frei ist. Diese Blockierung soll mit Hilfe einer lokalen

Semaphore implementiert werden. Die Interaktion des Logs mit der Protokollschicht erfolgt

mittels einer Instanz, die dem Log im Konstrukt übergeben wird. Zum Blockieren des Logs

verwendet man am einfachsten, wie gesagt, eine Semaphore. Die Semaphore in Java bietet

dabei folgende Schnittstelle an. Initialisiert wird eine Semaphore mit einem Konstruktor,

dem der Startwert übergeben wird. Dieser Startwert definiert, wie viele gleichzeitig

Zugriffe die Semaphore erlaubt. Zum Zugriff auf diese Semaphore bietet sich im Rahmen

der Aufgabe die beiden Methoden AcquireUninterruptedly und TryAcquire an. Beide Methoden blockieren

dabei, wenn gerade kein Zugriff auf die Ressource möglich ist, also wenn der Zähler der Semaphore

null ist. AcquireUninterruptedly blockiert dabei unendlich und ist auch nicht unterbrechbar.

TryAcquire dagegen kann einerseits unterbrochen werden und blockiert zudem nur eine bestimmte

Zeit, bevor es mit einem Timeout abbricht. Im Erfolgsfall zählen beide Methoden den Zähler

der Semaphore um 1 herunter. Zum Freigeben der Semaphore gibt es zudem Release, das den

Zähler, der mit Semaphore wieder um 1 erhöht und dadurch einen weiteren Zugriff ermöglicht.

Hier seht ihr ein kurzes Beispiel, wie man eine Semaphore mit Startwert 1 verwendet, um

einen exklusiven Zugriff auf einen Abschnitt zu sichern.

Aber zurück zu unserem Log. Um zu entscheiden, wann euer Log den Abschnitt tatsächlich freigeben

darf, wird die Protokollschicht verwendet. Diese trifft Entscheidungen aufgrund von Ereignissen,

die sie sowohl vom Log selbst als auch von den anderen Prozessen erhält. Um die konsistent

zu sichern, werden diese Ereignisse streng und sequenziell verarbeitet. Ein Ereignis

wird dabei von der Klasse VSLampetEvent dargestellt und hat zwei Attribute, ein Typ und ein im

Teil einer Videoserie :
Teil eines Kapitels:
Verteilte Synchronisation

Zugänglich über

Offener Zugang

Dauer

00:09:39 Min

Aufnahmedatum

2021-06-15

Hochgeladen am

2021-06-15 13:57:17

Sprache

de-DE

Aufgabenbeschreibung, Tipps und Hinweise

Einbetten
Wordpress FAU Plugin
iFrame
Teilen