Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03.

36
Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03

Transcript of Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03.

Page 1: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

Ergebnis determiniert nichtdeterminiertAblauf

deterministisch immer -

nichtdeterministisch möglich meistens

Page 30: Nichtsequentielle Programmierung Klaus-Peter Löhr Freie Universität Berlin WS 2002/03.

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.

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.

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.

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.

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.

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.

Beispiele:

co ... <seats = seats-1;> ...|| ... <seats = seats-2;> ...oc

void p(){... <...>...

}...co p(a); || p(b); || p(c); oc...