init - Awerbuch Synchronisierer in Doku aufgenommen

This commit is contained in:
qvalentin 2022-04-12 18:21:31 +02:00
parent 1ff5e452bb
commit 7aa83376b1
Signed by: qvalentin
GPG Key ID: C979FA1EAFCABF1C
1 changed files with 21 additions and 6 deletions

View File

@ -38,11 +38,12 @@ Als dritter Teilnehmer
python -m Code.Main 0.0.0.0 8082 0.0.0.0 8080 LEFT python -m Code.Main 0.0.0.0 8082 0.0.0.0 8080 LEFT
``` ```
### Mit zwei Teilnehmern auf dem lokalen Rechner ## Steuerung
```shell Es gibt zwei Zustände, pausiert und nicht pausiert.
python -m Code.Main 0.0.0.0 8080 & sleep 2 && python -m Code.Main 0.0.0.0 8081 0.0.0.0 8080 RIGHT Zwischen diesen kann mit 'Leertaste' gewechselt werden.
``` Im pausierten Zustand können mit der linken Maustaste eigene Strukturen gezeichnet werden.
Mit der unteren Reihe der Tastatur (y,x,v,b,n,m) können vorgefertigte Strukturen (Glider und Spaceships) gespawnt werden.
## Einstieg ## Einstieg
@ -79,15 +80,29 @@ schon im richtigen Zustand befindet.
Um sicherzustellen, dass alle Teilnehmer gleichzeitig den Entwicklungsschritt durchführen und somit der Randaustausch auch Um sicherzustellen, dass alle Teilnehmer gleichzeitig den Entwicklungsschritt durchführen und somit der Randaustausch auch
korrekt funktioniert, wird eine vereinfachte Version von Lamport Clocks verwendet. korrekt funktioniert, wird eine vereinfachte Version von Lamport Clocks verwendet.
Jeder Prozess hat einen Counter, den er bei jedem Entwicklungsschritt um eins erhöht. Jeder Prozess hat einen Counter, den er bei jedem Entwicklungsschritt um eins erhöht.
Da für jeden Entwicklungsschritt zuerst die Ränder der benachbarten Teilenehmer abgefragt werden müssen und dies blockieriend Da für jeden Entwicklungsschritt (Tick) zuerst die Ränder der benachbarten Teilenehmer abgefragt werden müssen und dies blockierend
geschieht, sind alle Teilnehmer zu jedem Zeitpunkt um maximal 1 bezüglich ihres Counters versetzt. geschieht, sind alle Teilnehmer zu jedem Zeitpunkt um maximal 1 bezüglich ihres Counters versetzt.
Damit man jedoch mit seinem Entwicklungsschritt nicht warten muss, bis alle Nachbar den Rand angefragt haben, hält jeder Damit man jedoch mit seinem Entwicklungsschritt nicht warten muss, bis alle Nachbar den Rand angefragt haben, hält jeder
Prozess eine Kopie seine Randes vom vorherigen Zeitpunkt. Prozess eine Kopie seiner Ränder vom vorherigen Zeitpunkt.
Bei der Anfrage nach dem Rand wird der nachgefragte Counter mitgeschickt, dieser muss dem aktuellen oder dem vorherigen Bei der Anfrage nach dem Rand wird der nachgefragte Counter mitgeschickt, dieser muss dem aktuellen oder dem vorherigen
Counter entsprechen oder um eins größer sein, als der aktuelle Counter. Counter entsprechen oder um eins größer sein, als der aktuelle Counter.
Ist der angefragte Counter um eins größer als der aktuelle, liegt also quasi in der Zukunft, wird der Request blockiert, Ist der angefragte Counter um eins größer als der aktuelle, liegt also quasi in der Zukunft, wird der Request blockiert,
bis der Angefragte den nächsten Entwicklungsschritt durchgeführt hat. bis der Angefragte den nächsten Entwicklungsschritt durchgeführt hat.
Somit wird das gesamte Game of Life nur so schnell ausgeführt, wie der langsamste Teilenehmer ist. Somit wird das gesamte Game of Life nur so schnell ausgeführt, wie der langsamste Teilenehmer ist.
Die Synchronisation kann auch als Variante des Awerbuch Synchronisierers angesehen werden.
Die Nachrichten über den Randaustausch entsprechen den Nachrichten beim Awerbuch Synchronisier, da sie den Counter/Tick enthalten
und blockierend sind, es wird also auf ein ACK gewartet (das wir quasi durch die tiefer liegenden Schichten gemacht).
Anstatt jedoch ein Safe zu verschicken, starte jeder Teilnehmer sofort den nächsten Tick und speichert seine Werte vom vorherigen Tick zwischen.
Die Option, den Entwicklungsschritt erst durchzuführen, nachdem alle Nachbarn die Kanten angefragt haben, wurde bei der Implementierung erwogen,
die Zwischenspeicherung der vorherigen Ränder erschien jedoch komplizierter.
## TODOS/Probleme
- [ ] Sauberer Shutdown
- [ ] Joinen wenn nicht pausiert
- [ ] Zwei Nachbarn als Parameter angeben
- [ ] 2D Gebiete
<!-- LocalWords: Counter <!-- LocalWords: Counter
--> -->