nichtsequentielle programmierung klaus-peter löhr freie universität berlin ws 2002/03
TRANSCRIPT
![Page 1: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/1.jpg)
Nichtsequentielle Programmierung
Klaus-Peter LöhrFreie Universität Berlin
WS 2002/03
![Page 2: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/2.jpg)
Inhalt
1 Einführung
2 Nebenläufige Prozesse
3 Interaktion über Objekte
4 Interaktion über Nachrichten
5 Elemente der Parallelprogrammierung
6 Entwicklung nichtsequentieller Systeme
![Page 3: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/3.jpg)
1 Einführung
Zur Erinnerung: Fachterminologie Englisch/Deutsch siehe
http://www.babylonia.org.uk
![Page 4: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/4.jpg)
1.1 Nichtsequentielle Programme und Prozesse
Was? Warum? Wie?
Sequentielle Programme
versus
Nichtsequentielle Programme
![Page 5: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/5.jpg)
1.1.1 Was ist Nichtsequentialität?
Aktion = Ausführung einer Programmanweisung,einer Maschineninstruktion,eines Mikroprogrammbefehls,. . . . .
je nach betrachteter Abstraktionsebene
![Page 6: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/6.jpg)
Programmablauf besteht aus Aktionen und heißt
sequentiell (sequential),wenn er aus einer Folge von zeitlich nicht überlappenden Aktionen besteht,
parallel (parallel),wenn er nicht sequentiell ist
![Page 7: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/7.jpg)
Achtung: ein und derselbe Ablauf kann
auf einer Abstraktionsebene sequentiell,auf einer anderen parallel sein !
Beispiel 1: x = 3; y = 7;{ x = x+1; y = 2*y; }z = x+y;
beschreibt einen sequentiellen Ablaufvon 5 Aktionen (genauer: Zuweisungen)
- aber auf Hardware-Ebene könnten manchedieser Zuweisungen parallel ausgeführt werden!
![Page 8: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/8.jpg)
Beispiel 2: Manche Programmiersprachen
erlauben explizit parallele Abläufe,ohne sie vorzuschreiben, z.B.
x = 3; y = 7;(x,y) = (x+1,2*y); z = x+y;
aber auf Hardware-Ebene könnte dashier gezeigte multiple assignment auch wie
x = x+1; y = 2*y;
ausgeführt werden(oder in umgekehrter Reihenfolge!)
![Page 9: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/9.jpg)
Terminologie:
• eine Programmiersprache heißt
nichtsequentiell (nebenläufig, concurrent), [konkurrierend – falsche Übersetzung]
wenn sie Konstrukte enthält, die explizitparallele Abläufe zulassen
• ein Programm oder Programmteil heißt nichtsequentiell,
wenn es solche Konstrukte verwendet.
![Page 10: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/10.jpg)
Typische Nebenläufigkeitskonstrukte
identifizieren Programmteile als Prozesse:
Def.: Ein Prozeß (process) ist ein Programmteil,der – sobald er gestartet wurde – unabhängig vom Rest des Programms ablaufen kann
Ein Prozeß kann sequentiell oder nichtsequentiell sein.
Häufig ist mit „Prozeß“ „sequentieller Prozeß“ gemeint.
![Page 11: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/11.jpg)
Nebenläufigkeitsanweisung (concurrent statement)
Statement = . . . . . | ConcurrentStatement .
ConcurrentStatement = co Processes oc .
Processes = Process { || Process } .
Process = StatementSequence .
z.B. x = 3; y = 7;co x = x+1; || y = 2*y; ocz = x+y;
![Page 12: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/12.jpg)
Semantik:
Die Prozesse einer Nebenläufigkeitsanweisungwerden unabhängig voneinander ausgeführt.
Die Nebenläufigkeitsanweisung ist beendet,wenn alle Prozesse beendet sind.
x = 3; y = 7;
co x = x+1; || y = 2*y; oc
z = x+y;
![Page 13: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/13.jpg)
Gabelungsanweisung (fork statement)
ForkStatement = fork Process .
Process = Statement .
z.B. x = 3; y = 7;fork x = x+1; y = 2*y; z = x+y;
![Page 14: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/14.jpg)
Semantik:
Die Gabelungsanweisung startet den angegebenen Prozeß.
(Wann dieser beendet ist, ist nicht bekannt!)
z.B. x = 3; y = 7;
fork x = x+1;
y = 2*y; ? z = x+y;
?
Elternprozeß
Kindprozeß
![Page 15: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/15.jpg)
Bemerkung:
Es wird grundsätzlich unterstellt, daß Prozeduren eintrittsinvariant implementiert sind;
somit ist folgendes unproblematisch:
...fork p(x+1);fork p(x+2);
p(x+3);...
![Page 16: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/16.jpg)
1.1.2 Warum nichtsequentielle Programmierung?
Effizienz
durch schnellere parallele Ausführung– sofern entsprechende Hardware vorhanden
![Page 17: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/17.jpg)
Problemlösungsstruktur
soll im Programm gut sichtbar sein(„Problemorientierung statt Maschinenorientierung“)
...; x = x+1; y = 2*y; ... ?
...; y = 2*y; x = x+1; ... ?
...; co x = x+1; || y = 2*y; oc ...
![Page 18: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/18.jpg)
Systemarchitektur:
Mehrprozeßbetrieb (multitasking) bei
- Betriebssystemen,
- Datenbanksystemen,
- Echtzeitsystemen,
motiviert durch Effizienzüberlegungen undkonkurrierende Nutzung knapper Ressourcen
![Page 19: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/19.jpg)
1.1.3 Wie wird nichtsequentiell programmiert?
Zentrale Begriffe:
Prozeß
Interaktion zwischen Prozessen
Synchronisation von Prozessen
![Page 20: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/20.jpg)
1.1.3.1 Prozeßbegriff
„Prozeß“ ist ein schillernder Begriff –mit unterschiedlichsten Definitionen:
unabhängig ausführbarer Teil eines Programms
Programmablauf (!)
virtueller Prozessor (Betriebssystem!)
industrieller Prozeß (Prozeßrechner!)
u.a.
![Page 21: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/21.jpg)
Manchmal muß auch zwischen „Prozeß“
und „Inkarnation eines Prozesses“ unterschieden werden:
process void p(int i) {.....} „Prozeß“...start p(x); start p(y);
start p(x); erzeugt Inkarnation (Exemplar, instance)[Instanz – falsche Übersetzung]
des Prozesses p
oder aber auch „erzeugt Prozeß, der p ausführt“
![Page 22: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/22.jpg)
1.1.3.2 Interaktion zwischen Prozessen
z.B. über gemeinsame Variable:
co ... time = clock(); ...|| ... write(time); ...oc
co ... decrement(seats); ...|| ... increment(seats); ...oc
![Page 23: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/23.jpg)
Def.: Zwei Prozesse, die nebenläufig auf einegemeinsame Variable x zugreifen, stehen miteinander in Konflikt (conflict, interference) bezüglich x,wenn mindestens einer der Prozesse x verändert.
Konflikte sind meistens unerwünscht (1.2)
und werden durch Synchronisationsmaßnahmen unterbunden
![Page 24: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/24.jpg)
1.1.3.3 Synchronisation
Prozesse laufen grundsätzlich asynchron,d.h. unabhängig voneinander undmit nicht vorhersagbaren relativen Geschwindigkeiten
Beispiel: co p(x); || q(y); oc r(z);
Es bleibt offen, ob p oder q zuerst fertig ist.Und: „heute so, morgen so“!
Die schließende Klammer oc synchronisiertdie beiden Prozesse, bevor mit r fortgefahren wird
![Page 25: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/25.jpg)
Alternative Formulierung mit Gabelungsanweisung:
fork p(x); q p
q(y); wait;
r(z); r
wait-Anweisung bewirkt Synchronisation des Elternprozesses mit einem Kindprozeßdurch eventuelles Warten (auf die Beendigung des Kindprozesses)
![Page 26: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/26.jpg)
1.2 Nichtdeterminismus
Der Ablauf eines sequentiellen Programms ist immerdeterministisch – d.h. gleiche Eingaben führen zu gleichen Zustandsfolgen – und das Ergebnis istdeterminiert – d.h. gleiche Eingaben führen zugleichen Ausgaben(sofern nicht explizit mit Zufallszahlen gearbeitet wird)
Asynchronie führt in der Regel zu nichtdeterministischen Abläufen – möglicherweise aber trotzdem zu determinierten Ergebnissen.
![Page 27: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/27.jpg)
1.2.1 Zeitschnitte
dienen der Veranschaulichung nichtsequentieller,insbesondere nichtdeterministischer Abläufe:
Prozeß 1 Prozeß 2 . . . . time = „10:59“ . . time = „11:00“time = clock(); write(time); „11:00“ ! . . . . time = „11:00“
„10:59“ !!
![Page 28: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/28.jpg)
Prozeß 1 Prozeß 2 . . . .
seats = 17seats = 16
a = seats; b = seats;seats = 17
a = a-1; b = b-2;seats = 16
seats = a; seats = b;seats = 15seats = 14seats = 15 !seats = 16 !!
![Page 29: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/29.jpg)
Ergebnis determiniert nichtdeterminiertAblauf
deterministisch immer -
nichtdeterministisch möglich meistens
![Page 30: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/30.jpg)
1.2.2 Unteilbare Anweisungen
verhalten sich so, als würden sie „zeitlos“ ausgeführt(oder auch: als würde sich während ihrer Ausführungder Programmzustand nicht ändern)
(statt „unteilbar“ auch atomar, indivisible, atomic)
(Beachte: in 1.2.1 wurde stillschweigend vorausgesetzt,daß die dortigen Anweisungen unteilbar sind.)
![Page 31: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/31.jpg)
Achtung!
Annahmen über die Unteilbarkeit selbst einfachsterAnweisungen sind häufig nicht gerechtfertigt.
Sprachbeschreibungen sind häufig unpräzisein Bezug auf die Unteilbarkeit.
Implementierungen können auf subtile Weise dieUnteilbarkeit verletzen.
Im Zweifelsfall konservative Betrachtungsweise:Das Lesen bzw. Schreiben einer Arbeitsspeicherzelledurch eine Maschineninstruktion ist unteilbar.
![Page 32: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/32.jpg)
Beispiel – wenn Zeichenfelder keine Objekte sind: Prozeß 1 Prozeß 2 . . clock = „11:00“ . . time = „10:59“time = clock;//time[0]=clock[0]; time = „10:59“
//time[1]=clock[1]; time = „11:59“write(time); „11:59“ !
//time[2]=clock[2]; time = „11:59“
//time[3]=clock[3]; time = „11:09“
//time[4]=clock[4]; time = „11:00“
![Page 33: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/33.jpg)
Klassifikation von Variablen in höheren Programmiersprachen:
einfache Variable (simple variable):
wird von der Hardware unteilbar gelesen/geschrieben
private Variable (private variable) eines Prozesses:
wird nur von diesem Prozeß benutzt
gemeinsame Variable (shared variable) mehrerer Prozesse:
nicht privat
![Page 34: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/34.jpg)
Präzisierung der Unteilbarkeit(wenn wegen lückenhafter Beschreibung der Sprache und/oder ihrer Implementierung erforderlich):
Ein Ausdruck ist unteilbar, wenn seine Auswertung keine Nebenwirkungen hat und während der Auswertung höchstens eine – zudem einfache – gemeinsame Variable höchstens einmal gelesen wird.
Eine Zuweisung v = A ist unteilbar, wenn entweder
– v privat und A unteilbar ist oder
– v einfach ist und A sich nur auf private Variable bezieht
![Page 35: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/35.jpg)
Angesichts oft ungesicherter Verhältnissewünschenswertes Sprachkonstrukt: Klammerung mit < >
AtomicExpression = < Expression >
AtomicStatement = < Statement >
Semantik:
Während ein Prozeß einen atomaren Ausdruck auswertet bzw. eine atomare Anweisung ausführt,ruhen alle anderen Prozesse (Synchronisation!)
(Aber: Die Praktikabilität von <> läßt zu wünschen übrig! 3.1)
![Page 36: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03](https://reader036.vdocuments.pub/reader036/viewer/2022081604/570491c31a28ab14218d9dce/html5/thumbnails/36.jpg)
Beispiele:
co ... <seats = seats-1;> ...|| ... <seats = seats-2;> ...oc
void p(){... <...>...
}...co p(a); || p(b); || p(c); oc...