init - Awerbuch Synchronisierer in Doku aufgenommen
This commit is contained in:
parent
1ff5e452bb
commit
7aa83376b1
27
README.md
27
README.md
|
@ -38,11 +38,12 @@ Als dritter Teilnehmer
|
|||
python -m Code.Main 0.0.0.0 8082 0.0.0.0 8080 LEFT
|
||||
```
|
||||
|
||||
### Mit zwei Teilnehmern auf dem lokalen Rechner
|
||||
## Steuerung
|
||||
|
||||
```shell
|
||||
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
|
||||
```
|
||||
Es gibt zwei Zustände, pausiert und nicht pausiert.
|
||||
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
|
||||
|
||||
|
@ -79,15 +80,29 @@ schon im richtigen Zustand befindet.
|
|||
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.
|
||||
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.
|
||||
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
|
||||
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,
|
||||
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.
|
||||
|
||||
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
|
||||
-->
|
||||
|
|
Loading…
Reference in a new issue