PD Stefan Bosse
Universität Bremen, FB Mathematik & Informatik
SS 2020
Version 2020-05-19 sbosse@uni-bremen.de |
Ein Datenfluss (Graph aus Operationen oder Variablen) beschreibt den Verlauf und die Verarbeitung von Daten durch Operationen → Verhaltensbeschreibung
Ein Datenpfad beschreibt die Verbindung von Komponenten zur Implementierung des Datenflusses → Strukturbeschreibung
Der Kontrollfluss beschreibt die zustandsbasierte Steuerung einer Berechnung
Der Kontrollpfad implementiert den Kontrollfluss → Zustandsautomat
Jeder generische Mikroprozessor und i.A. jedes anwendungsspezifische Digitallogiksystem läßt sich in die zwei funktionale Bereiche aufteilen:
Der Programmfluss kann in Daten- und Kontrollfluss zerlegt werden, die jeweils im Daten- und Kontrollpfad eines Datenverarbeitungssystems verarbeitet werden.
Parallelität auf Prozessebene (Multithreading) mit Interprozesskommunikation → Mittlere bis geringe Beschleunigung, mittlerer Overhead
Parallelität auf Dateninstruktionsebene ohne explizite Kommunikation → Hohe Beschleunigung, geringer Overhead
Ein (prozedurales/imperatives) Programm besteht aus mindestens einem Daten- und Kontrollpfad (oder Fluss)
Ein Programm ist aus einer Vielzahl von Komponenten zusammengesetzt → Komposition
Komposition von Datenfluss und Datenpfad:
Komposition von Daten- und Kontrollfluss/pfad:
Der KFG bildet verschieden Ablaufpfade (Sequenzen) in einem Programm ab
Der KFG besteht aus Basisblöcken mit DFG
Ein Basisblock beinhaltet nur Berechnungen ohne Verzweigungen und Schleifen
Verzweigungen im Kontrollfluss können konditional sein und von Variablen abhängen
Definition 1.
Ein Kontrollflussgraph ist ein gerichteter Graph GCFG(BB,Econtrol) der aus einer Knotenmenge BB von Basisblöcken bestehten aus reinen Berechnungsanweisungen (Datenpfad) und einer Menge von Kanten E besteht, die den Kontrollfluss zwsichen den Basisblöcken beschreiben.
Die Kombination aus KFg und DFG zu sog. hierarchischen Taskgraphen (HTG) führt zu einer Komposition eines Programms aus einzelnen Tasks H
Die Abhängigkeiten und der Fluss der Tasks wird im folgendne Prozessmodell wieder auftauchen
Abhängigkeiten im HTG können Synchronisation erfordern!
Mit Tasks können auch komplexeren Kontrollstrukturen wie Schleifen, Bedingte Verzweigung und Mehrfachauswahl gekapselt werden!
Hierarchie: HTG Blöcke (Knoten des HTG) können aus weiteren Tasks und HTG Knoten bestehen!
Eine Berechnung setzt sich aus der verschachtelten und verketteten Applikation von Funktionen zusammen, die jeweils aus elementaren Ausdrücken E={ε1,ε2,..} bestehen → Funktionale Komposition F(X)=f1(f2(f3..(X)))
Jede Funktion fi beschreibt einen Teil der Berechnung.
Ausdrücke bestehen aus:
|
|
Entspricht dem mathematischen Modell was auf Funktionen und Ausdrücken gründet mit den Methoden
Definition f(x) = λ.x → ε(x)
Applikation f(ε), bei mehreren Funktionsargumenten f(ε1,ε2,..)
Komposition f ∘ g ∘ h ∘ .. = f(g(h(..(x)))
Rekursion f(x) = λ.x → ε(f,x)
und Substitution a=ε
Zeitliches Modell: unbestimmt (t ↦ 0), Auswertereihenfolge nicht festgelegt
Eine imperative Berechnung setzt sich aus einer Sequenz I=(i1 , i2 , ..) von elementaren Anweisungen A={a1,a2,..} zusammen →
Sequenzielle Komposition i1 ; i2 ; …
Die Anweisungen werden sequentiell in exakt der angegebenen Reihenfolge ausgeführt
Die Menge der Anweisungen A lässt sich in folgende Klassen unterteilen:
x+1, a*(b-c)*3, x<(a+b), ...
x := a+b
if a < b then x := 0
label: x:=x+1; if x < 100 then loop label
Man fasst die Sequenz I als ein imperatives Programm X == Ausführungsvorschrift zusammen.
Die Ausführung des Programms (statisch) bezeichnet man als Prozess (dynamisch)
Ein Prozess befindet sich aktuell immer in einem Zustand σ einer endlichen Menge von Zuständen Σ={σ1 , σ2 , ..}.
Der gesamte Zustandsraum Σ des Prozesses setzt sich aus dem
Der Fortschritt eines sequenziellen Programms bedeutet ein Änderung des Kontroll- und Datenzustandes → Zustandsübergänge
Die Zustandsübergänge können durch ein Zustandsübergangsdiagramm dargestellt werden.
Beispiel Berechnung GGT
| Kontrollzustandsdiagramm
|
Ein Prozess P besitzt einen “makroskopischen” Ausführungszustand ps. Die Basismenge der Ausführungszustände PS ist (“Milestones”):
START
)
RUN
)
END
)
Dazu kann es eine erweiterte Menge PS*an Ausführungszuständen geben:
AWAIT
)
BLOCKED
)
READY
)
Das Konzept der Prozessblockierung ist elementar für kommunizierende Prozesse
Kommunikation: Lesen und Schreiben von Daten, Ein- und Ausgabe, Netzwerknachrichten, usw.
Befindet sich ein Prozess im Ausführungszustand BLOCKED
wartet dieser auf ein Ereignis:
Bei einem blockierten Prozess schreitet der Kontrollfluss nicht weiter voran (keine Terminierung der aktuellen Operation)
Die Ausführung einer Operation (Instruktion) kann verzögert werden bis das zu erwartende Ereignis eintritt
Ein Prozess kann mittels der Operation suspend
und resume
blockiert oder wieder lauffähig gemacht werden
In einem Kontrollflussdiagramm würde es einen Kantenübergang auf den blockierten Zustand geben
[bitsofcomputer.blogspot.com]
|
|
Ein sequenzieller Prozess Ps besteht aus einer Sequenz von Anweisungen I=(i1 ; i2 ;..) (Berechnungen), die schrittweise und nacheinander ausgeführt werden: Ps=P(i1 ; i2 ; .. ; in) ⇒ p1 ↦ p2 ↦ .. ↦ pn
RS={START, RUN, BLOCKED(i),END}
ps(P) ∈ RS
Definition 2.
op start(P): ps(P)=START|END ↦ ps(P)=RUN
op stop(P): ps(P)=RUN|BLOCKED|START ↦ ps(P)=END
op suspend(P): ps(P)=RUN ↦ ps(P)=BLOCKED
op resume(P): ps(P)=BLOCKED ↦ ps(P)=RUN
Ein Datenverarbeitungssystem als paralleler Prozess kann aus einer Vielzahl nebenläufig ausgeführter Prozesse P={P1, P2, P3,…} bestehen
Parallele Komposition P=P1 ∥ P2 ∥ P3 ∥ ..
Achtung! Wenn keine Kommunikation (Synchronisation) zwischen den Prozessen stattfindet ist die Ausführung und das Endergebnis (der Berechnung) gleich der sequenziellen Ausführung der Prozesse:
Ein neuer paralleler Prozess kann durch den entsprechenden Prozesskonstruktor erzeugt werden
Geschieht dies innerhalb eines Prozesses Pi so wird dessen Prozessausführung blockiert bis alle Teilprozesses des parallelen Prozessen terminiert sind!
Der Prozessfluss in einem parallelen System kann durch Übergangs- und Terminierungsdiagramme dargestellt werden. (wie bereits im seq. Fall gezeigt wurde).
Eingehende Kanten (Pfeile) des Graphen beschreiben den Start eines Prozesses, ausgehende Kanten die Terminierung.
Seq({
function (id) print('P1: I am '+id) end,
function (id) print('P2: I am '+id) end,
})
Par({
function (id) print('P3: I am '+id) end,
function (id) print('P4: I am '+id) end,
})
print('after')
Definition 3.
Prozesskommunikation bedeutet Synchronisation zwischen Prozessen
Prozess Synchronisation tritt auf, wenn der Berechnungsfortschritt eines oder mehrerer Prozesse von dem Verhalten der anderen Prozesse abhängt.
Daten werden gespeichert und befinden sich in Speicherelementen: einzelne Register oder adressierbare RAM Speicher.
Mehrere Prozesse müssen je nach Datenabhängigkeit parallel auf geteilte Ressource Speicher zugreifen, um
⇔ Wettbewerb
Ressourcen-Konflikt und Synchronisation kann mit Daten-Queues/Channels aufgelöst werden.
Eine Queue hat im wesentlichen zwei Operationen die synchronisierten Zugriff ermöglicht (FIFO Speicher):
Definition 4.
OP WRITE(Q,x): Q[y,z,...],x → Q[x,y,z,...]
OP READ(Q): Q[x,y,z] → Q[x,y],z
Queue Q=[] ⇔ state=EMPTY: Lesender Prozess wird blockiert bis Q ≠ []
Queue Q=[x,y,z] ⇔ state=FULL: Schreibender Prozess wird blockiert bis state(Q) ≠ FULL
Par({
function ()
local x=ch:read();
log('hello '+x);
end,
function ()
ch:write('world');
end
},{
ch=Channel(1)
})
Ein Prozess kann in seinem Kontrollfluss nur eine blockierende Anweisung gleichzeitig aufrufen, d.h. in unserem Prozessmodell nur einen folgenden elementaren Prozess aktivieren.
Häufig ist es aber notwendig dass der Prozessfluss in mehrere Elementarprozesse mit einer blockierenden Operation aufspaltet (z.B. Lesen eines Channels) von dem dann nur ein Prozess zur Ausführung kommt (der erste der bereit wurde) → Konditionaler Fork
Der aufgespaltete konditonale Prozessfluss wird dann wieder zusammengeführt (join) → Klassische IO Selektion
Par({
function ()
local x;
Alt({
{function () x=ch1:read() end, Konditonaler Prozess 1
function () print('Got channel 1') end}, Ereignis Prozess 1
{function () x=ch2:read() end, Konditonaler Prozess 2
function () print('Got channel 2') end }, Ereignis Prozess 2
{function () x=ch3:read() end, Konditonaler Prozess 3
function () print('Got channel 3') end }, Ereignis Prozess 3
]);
log('Got data '+x);
},
function ()
ch1:write('world');
end
],{
ch1=Channel(),
ch2=Channel(),
ch3=Channel()
})
Prozessalgebra nach dem “Communicating Sequential Processes” (CSP) Modell von Hoare:
Beschreibung des Verhaltens von Prozessen als Reaktion auf Ereignisse → Synchronisierter Prozessfluss
Kommunikation sind Ereignisse
Algebraisch wird die Entwicklung von Prozessen durch Ereignisse x,y, .. beschrieben
Definition 5.
Ereignis :
Prozess :
Ein Prozess der nach einem Ereignis sich wie Prozess verhält:
Folge von Ereignissen:
Parallele Ausführung:
Alphabet eines Prozesses:
Ein Alphabet eines Prozesses beschreibt die möglichen Ereignisse die als Vorbedingung eines Prozesses auftreten können:
Rekursive Definition von Prozessen:
Mit : Alphabet des Prozesses (Ereignismenge)
Definition 6.
Auswahl:
→ D.h. entweder tritt Ereignis ein und der Auswahlprozess verhält sich wie , oder es tritt das Ereignis ein und der Prozess verhält sich wie .
Es gilt:
→ D.h. die Ereignismenge ist immer .
Eine Spur (Trace) des Verhaltens eines Prozesses beschreibt die zeitliche Abfolge von Ereignissen in die ein Prozess verwickelt war.
Spruen werden von Beobachtern aufgenommen (Monitor).
Definition 7.
Spur:
Leere Spur:
Spurbindung: →
Es gibt eine Vielzahl von möglichen Spuren in einem Einzel- und Multiprozesssystem!
Jede Spur kann zudem in Teilspuren zerlegt werden beginned mit der leeren Spur.
Spurenmenge ⇔ Zustandsraumdiagramm!
Definition 8.
: Menge aller Nachrichten eines Prozeses P
: Ausgabe eines Wertes über den Kanal c (Schreiben)
: Eingabe eines Wertes über einen Kanal c (Lesen)