Es wird die parallele LuaJit VM lvm mit integrierten CSP Modul für das jeweilige eigene Betriebssystem benötigt
Momentan steht lvm für die Betriebssysteme Linux 32bit, Linux 64bit, Solaris 32bit, Windows 32bit und MacOS X 64bit zur Verfügung. Unter Microsoft Windows kann es zu funktionalen Abweichungen und Einschränkungen von lvm kommen → lvm, die aber für die Übung nicht relevant sind.
Lua/CSP Programme können direkt von der Konsole ausgeführt werden:
# lvm myprog.lua
Die Programme (oder Teile davon) können ebenso in diesem Notebook ausgeführt werden wenn lvm mit einem WEB Shell Wrapper gestartet wird (lokaler Rechner, Konsole):
# lvm weblvm.lua
Service thread 2 started.
[2@1592562880] HTTP server (2) listening to http://0.0.0.0:4610
Monitor thread 4 started.
[4@1592562880] HTTP server (4) listening to http://0.0.0.0:4611
Es wird mindestens lvm version 1.1.14 benötigt!
Alle Code Snippets in diesem Notebook haben dann den gleichen Ausführungskontext (d.h. globale Variablen und Funktionen können von den einzelnen Snippets geteilt werden!)
Dieser geteilte Kontext kann aber auch zu Problemen führen und bei Fehlern in parallelen Prozessen können Geisterprozesse übrig bleiben die nicht beendet werden können
Ein Neustart des lvm Web Wrappers kann daher hin und wieder notwendig werden!. Das Notebook muss dann nicht neu geladen werden und funktioniert sofort nach dem Neustart von lvm wieder. Nur der globale VM Kontext ist wieder "leer"!
Die Konsolenausgabe (mittels der print Anweisung) bei der Ausführung eines Programabschnitts wird automatisch weitergeleitet und hier angezeigt. Es kann aber nach einer gewissen Zeit erforderlich werden diese automatische Ausgabeweiterleitung wieder durch Drücken des Refresh Buttons anzustoßen (rechts an der jeweiligen Ausgabekonsole hier im Notebook)
Jedes Codesnippet hat seine eigene Ausgabekonsole!
Der Programmcode kann in dem oberen Teilfenster eines Snippets verändert werden.
Der Programmcode wird ausgeführt durch Drücken der Playtaste ▸ im unteren Teilfenster (Ausgabekonsole).
Die Ausgabekonsole kann auf der rechten Seite gelöscht werden durch Drücken von ✗.
Hin und wieder kann eine Aktualisierung des Ausgabefensters durch Drücken des Knopfes ↻ erforderlich sein.
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 ◼.
Ein Beispiel
▸
◼
✗
↻
≡
Channel
Der Kommuniaktionskanal wurde bereits eingeführt. Hier noch einmal die Zusammenfassung:
Ein Channel ist entweder ein FIFO Speicher (Puffer/Queue, N Zellen) oder ein Redezvouz Kontakt (N=0)
Es gibt zwei Operatione
Lesen (Read)
Schreiben (Write)
Als Queue gibt es zwei Synchronisationsereignisse die zur Blockierung des aufrufenden Prozesses führen kann:
Keine Daten im Puffer (Empty) ⇒ Read Sync
Kein freier Platz m Puffer für neue Daten (Full) ⇒ Write Sync
Ein Beispiel: Verwendung eines Chennels in Par Prozessen
▸
◼
✗
↻
≡
Mit Kanälen können höhere und komplexere Kommunikationsprotokolle für die Prozesskommunikation eingesetzt werden.
Der Alt Prozesskonstruktor
Der Alt Prozesskonstruktor implemtiert einen mutualen Ausschluss auf möglicherweise parallelen Ereignissen, und führt eine Auswahl und Sequenzialisierung ein. So kann mit einem Alt Prozesse parallel auf das Eintreten von Ereignissen gewartet werden, prominent das Warten auf Daten in mehreren Kanälen.
Ein Alt Prozesskonstruktor muss immer in einen Par Prozess eingebettet werden (oder Fork oder Co), ansonsten entsteht eine permanente Blockierung des aufrufenden Prozesses (Deadlock!)
Ein Alt Prozesse besteht aus Teilprozessen mit konditionalen Vor- und Nachprozessen
Kompakte Version: Der Vorprozess ist immer die erste Anweisung, der Nachprozess alle folgenden Anweisungen.
Derzeit wird nur das Lesen aus einem Channel als konditionaler Vorprozess unterstützt.
Ein Beispiel: Verwendung eines Alt Prozesses in Par Prozessen
▸
◼
✗
↻
≡
Aufgabe. Welcher Wert wird ausgegeben? Was passiert wenn vor dem Alt Operator ein Wert in den Channel 2 geschrieben wird (also ch2:write("B"))?
Kommunizierende Prozesse
In dieser Aufgabe sollen mehrere Prozesse mit einem Verwaltungsprozess kommunizieren. Der Verwaltungsprozess verwaltet und verteilte geteilte Ressourcen ohne Deadlock Gefahr.
Ein Beispiel ist nachfolgend die Implementierung eines Semaphor durch einen Prozess. Die anderen Prozesse fragen die Ressource über Kommunikationskanäle an, und bekommen die Antwort über einen Kommunikationskanal. Es gibt zwei Kanäle pro Prozess und Ressource:
Anfrage (Request)
Antwort (Reply)
Mit Nachrichten kommunizierende Prozesse und zentraler Verwaltung einer Lock Ressource.
▸
◼
✗
↻
≡
Die auskommentierten Zeilen setmetatable(chreq, chreq.__class) müssen bei lvm version < 1.15 aktiviert werden.
Aufgabe. Implementiere anstelle eines Locks ein Semaphor Objekt. Teste die Ausführung mit drei Prozessen.
Kommunizierende Dinierende Philosophen
Aufgabe. Implementiere die Dinierenden Philosophen mit einem zentralen Verwaltungsprozess der die N Gabeln verwaltet. Die Anfrage von Gabeln erfolgt über Kommunikationskanäle. Der Alt Prozesskonstruktor muss vom Verwaltungsprozess verwendet werden um auf allen Anfragekanälen Nachrichten empfangen zu können.
Implementierung der Dinierenden Philosophen ohne Deadlock mittels Alt, Par, und Kommunikationskanälen für Anfrage und Bestätigung von Ressourcen (hier die Gabeln)
▸
◼
✗
↻
≡
Frage. Wie müssen die Gabeln angefragt werden damit kein Deadlock auftreten kann? Können die Gabeln sequenziell nacheinander angefragt werden? Wo wird Atomarität verletzt (siehe auch Test & Set Probleme).
Hilfe
Einreichung (Assignment #2024-90707 )
Prüfen
Bewerten (Lehrer)
Created by the NoteBook Compiler Ver. 1.27.2 (c) Dr. Stefan Bosse (Mon Jul 01 2024 09:32:02 GMT+0200 (CET))