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
Presenters
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