Übung 6: Parallel Lua / CSP Tutorial - Nachrichtenbasierte Kommunizierende Prozesse (Stefan Bosse) [7.2025] |
Minimalanforderungen: lvm 1.1.18, luv 2.7.5
# lvm myprog.lua
# 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
▸
◼
|
✗
↻
≡
|
Der Kommuniaktionskanal wurde bereits eingeführt. Hier noch einmal die Zusammenfassung:
▸
◼
|
✗
↻
≡
|
Aufgabe 1. 1. Füge eine Zeitmessung ein indem die log
Funktion verwendet wird (anstelle print), sowohl vor als auch nach den Kanaloperationen. Füge vor dem Lesen aus dem Kanal eine Verzögerung sleep(100)
ein. Wie ist das zeitliche Verhalten? 2. Was passiert wenn der Kanal mit n=0 (kein Puffer) erzeugt wird?
LS0gMS4gV3JpdGUgd2lyZCBuaWNodCBibG9ja2llcnQgdW5kIGRlciBQcm96ZXNzIDIgYXJiZWl0ZXQgdW5hYmjDpG5naWcgdm9uIFByb3plc3MgMQotLSAgICBELmguIChQMSAvLyBQMikgCi0tIDIuIFdyaXRlIHVuZCBSZWFkIHNpbmQgZ2Vrb3BwZWx0LCB1bmQgKFAxIHx8IFAyKSwgV3JpdGUgd2lyZCB2ZXJ6w7ZnZXJ0IApyZXF1aXJlICJDc3AiCmxvY2FsIGNoID0gQ2hhbm5lbCgxKQpsb2NhbCBjaCA9IENoYW5uZWwoMCkgIC0tIDIuClBhcih7CiAgZnVuY3Rpb24gKCkKICAgIHNsZWVwKDEwMCkKICAgIGxvZygiQmVmb3JlIFJlYWQiKQogICAgbG9jYWwgeCA9IGNoOnJlYWQoKQogICAgbG9nKCJDb25zdW1lZCAiLi54KQogIGVuZCwKICBmdW5jdGlvbiAoKQogICAgbG9jYWwgeCA9ICJEYXRhIgogICAgbG9nKCJQcm9kdWNpbmcgIi4ueCkKICAgIGNoOndyaXRlKHgpCiAgICBsb2coIkFmdGVyIFdyaXRlIikKICBlbmQKfSx7CiAgY2g9Y2gKfSk=
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.
▸
◼
|
✗
↻
≡
|
Aufgabe. Welcher Wert wird ausgegeben? Was passiert wenn vor dem Alt Operator ein Wert in den Channel 2 geschrieben wird (also ch2:write("B")
, fügre ein sleep(100)
vor dem Alt Operator ein)?
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:
Die Dinierenden Philosophen sind der Klassiker um Deadlock Szenarien und das randomisierte Verhalten von parallelen Systemen zu demonstrierem.
require('Csp')
local s = {Semaphore(1),Semaphore(1),Semaphore(1)}
local b = Barrier(3)
local function eat(id)
print('Eating '..id)
end
local function think(id)
print('thinking '..id)
end
Par({
function () b:await(); for i = 1,10 do
s[1]:down(); s[2]:down(); eat(1); s[2]:up(); s[1]:up(); think(1)
end end,
function () b:await(); for i = 1,10 do
s[2]:down(); s[3]:down(); eat(2); s[3]:up(); s[2]:up(); think(2)
end end,
function () b:await(); for i = 1,10 do
s[3]:down(); s[1]:down(); eat(3); s[1]:up(); s[3]:up(); think(3)
end end
})
print('Done.')
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.
▸
◼
|
✗
↻
≡
|
PGI+bG9jYWw8L2I+IGNoX3AxX3JlcSA9IENoYW5uZWwoMSkKPGI+bG9jYWw8L2I+IGNoX3AxX3JlcCA9IENoYW5uZWwoMSkKUGFyKHsKICA8Yj5mdW5jdGlvbjwvYj4gKCkgCiAgICAtLSBQaGlsbyAxCiAgZW5kLAogIDxiPmZ1bmN0aW9uPC9iPiAoKSAKICAgIC0tIFBoaWxvIDIKICBlbmQsCiAgLS0gLi4uLgogIDxiPmZ1bmN0aW9uPC9iPiAoKQogICAgLS0gVmVyd2FsdHVuZwogICAgQWx0KHsKCiAgICB9KQogIDxiPmVuZDwvYj4KfSx7Cgp9KQ==
Frage 4. 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).