Parallel LUA / CSP (Stefan Bosse) [6.2020]

Parallel Lua / Csp Tutorial (Teil 1)

Vorbereitung

Leider kann unter seltenen Bedingungen (Race conditions!) lvm fehlerhaft arbeiten und "abstürzen" → Auch ich als Autor von lvm habe mit den Tücken von parallelen und konkurrierenden Softwaresystem zu kämpfen!

Lua Code Ausführen

  1. Der Programmcode kann in dem oberen Teilfenster eines Snippets verändert werden.
  2. Der Programmcode wird ausgfeührt durch Drücken der Playtaste ▸ im unteren Teilfenster (Ausgabekonsole).
  3. Die Ausgabekonsole kann auf der rechten Seite gelöscht werden durch Drücken von ✗.
  4. Hin und wieder kann eine Aktualisierung des Ausgabefensters durch Drücken des Knopfes ↻ erforderlich sein.
  5. Bei parallelen Prozessen werden jeweils neue VM Instanzen in Threads gestartet. Wenn etwas schief läuft kann das Programm hängen und nicht terminieren (also der aktuelle Codeabschnitt). Der Abbruch kann versucht werden durch Drücken des Knopfes ◼.
Eine einfache Textausgabe (1)

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Prozesse

Sequenzielle Prozesse

Eine einfache Textausgabe (2)

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Aufgabe.
  1. Füge in die beiden obigen seq. Prozesse die sleep(millisec) Funktion vor der Konsolenausgabe print ein (wähle für die verzögerung Werte im Bereich 100-500 ms)
  2. Wie verhält sich das Programm? Füge die Ausgabe der Prozesszeit ein (print(time())) vor und nach dem sleep Aufruf. Alternativ kann anstelle der print die log Anweisung verwendet werden. Diese gibt die aktuelle Prozesszeit in Millisekunden zusammen mit den Argumenten aus.
  3. Was passiert wenn in einem Prozess ein Fehler auftritt? Also füge z.B. den Aufruf einer nicht definierten Funktion foo(1) ein...

Fehlerbehanldung

Fehlerbehandlung

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Fehlerbehandlung

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Parallele Prozesse

Eine einfache Textausgabe mit Prozesskommunikation (2)

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Kommunikationskanäle

Aufgabe.
  1. Was läuft bei dem nächsten Beispiel falsch?
    • Hinweis: Wenn der Par Prozess nicht terminiert, benutze den ◼ Knopf bis die Meldung mit dem Signal EPROC erscheint!
  2. Ändere das Programm so ab dass sich beide Prozesse richtig synchronisieren und der Par prozess terminiert.

Eine komplexere Textausgabe mit Prozesskommunikation (3)

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Semaphoren

\[ sem_{counter} = init + \sum sem:up - \sum sem:down \ge 0 \]
Ein einfaches Produzenten-Konsumenten System

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Frage. Wie ist der zeitliche Ablauf?

Frage. Welchen Wert haben die Semaphorenzähler von prod und cons am Ende?

Aufgabe

Dinierende Philosophen

Zwei dinierende Philosopgen - der Auftakt!

 ▸ 
 ◼ 
 ✗ 
 ↻ 

Aufgabe.
  1. Starte eine Reihe (10) von Durchläufen. Ist die Ablaufreihenfolge deterministisch?
  2. Führe in jedem Phil.prozess eine Zählschleife ein die den obigen Anweisungblock kapselt (for)
  3. Experimentiere mit den auskommentierten random dely (sleep in Millisekunden) und der Threadwechsel mit yield
  4. Führe den Prozess aus, mit z.b. M=20 Durchläufen. Was lässt sich beobachten?
  5. Erweitere nun das parallele Prozesssystem auf N=5 Phils. Lässt sich ein Deadlock feststellen? Die Versuche müssen ggfs. vielfach wiederholt werden.


Created by the NoteBook Compiler Ver. 1.3.9 (c) Dr. Stefan Bosse (Fri Jul 31 2020 09:52:50 GMT+0200 (CET))