• Keine Ergebnisse gefunden

Im allgemeinen kann ein Event-Baum vorliegen:

N/A
N/A
Protected

Academic year: 2022

Aktie "Im allgemeinen kann ein Event-Baum vorliegen:"

Copied!
23
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

! " #

$%& '()$%&# * +,-/. $%& *

01 * 010 2

3 $%& 010 2

3 ,45" * ,6 7

1&/$ +,-/. * 98:% 2 ;4< ,45" *>=

1&/$ ! " $%&# ,45"

?

3

-54 ,45" *@=

$%&#

(2)

Im allgemeinen kann ein Event-Baum vorliegen:

sync

f2 f1

g

f3 f4

receive c2 receive c1

send c4 y send c3 x

(3)

→ Die Blätter sind Basis-Events.

→ Auf ein Event kann eine Wrapper-Funktion angewandt werden.

→ Mehrere Ereignisse des gleichen Typs können mit einem Auswahl-Knoten zusammengefasst werden.

→ Synchronisierung auf einen Event-Baum aktiviert ein Blatt-Event.

Als Ergebnis wird der Wert geliefert, den die Komposition der Wrapper-Funktionen auf dem Weg zur Wurzel liefert.

(4)

Beispiel: Ein Swap-Channel

Ein Swap-Channel soll beim Rendezvous die Werte der beiden beteiligten Threads austauschen. Die Signatur lautet:

.:%0 $0 1$ 6

$0 9 1$

" 01!1$ % ;4< 9 1$

" 1$ 9 1$ ;4< 9 ;4< 9 "-&

-/.

Jeder beteiligte Thread muss in einer Implementierung mit normalen Kanälen sowohl die Möglichkeit zu empfangen wie zu senden

anbieten.

(5)

Sobald ein Thread sein Senden erfolgreich beendete (d.h. der andere auf ein ! " -Event synchronisierte), muss noch der zweite Wert übermittelt werden.

Mit dem ersten Wert übertragen wir deshalb einen Kanal für den zweiten Wert:

.:%0 1$

%6

$0- 5.

$0- "-&

$0 9 1$ 9 9 0 0

01!1$ 2 010 2

(6)

1$ * 010 2

3

, 7

1&/$ ! " # 98:% ' ;4<

+,-/. *>= >=

1&/$ +,-/. *@' 98:% 2 ;4<

! "

?

Einen konkreten Austausch können wir implementieren, indem wir

, in ,6 umwandeln.

(7)

Timeouts

Oft dauert unsere Geduld nur eine Weile :-)

Dann wollen wir ein angefangenes Sende- oder Empfangswarten beenden ...

.:%0 $0 4 6

, 4 8!

4 ;4< % "-&

,.!4! " 9 0 ;4< 8!

4 ;4< 9

$&

"-&

,.!!,-/. 9 0 ;4< 9 ;4< 8!

4 ;4< %

$&

"-&

-/.

(8)

, 4 ! 010 2

3 ,45" 2 .!54 =

! " !

3 -54 ,45" 2>= ,-/. ! 2

,.!4! "

, 7

1&/$ ! " # 98:% ;4< >=

1&/$ +, 4 98:% 2 ;4<

0

?

,.!!,-/. *

, 7

1&/$ +,-/. * 98:% ;4< 2>=

1&/$ +, 4 98:% 2 ;4<

0

?

-/.

(9)

11.3 Threads und Exceptions

Eine Exception muss immer innerhalb des Threads behandelt werden, in der sie erzeugt wurde.

.:%0

1 %6

$0- 5.

5. * * >=

$ 3&! 3 +5. 4 34,. 4%05:

/ 3 -54 5. = .!54 =

$ 3&! 3 / 3 4 34,. 4%05:

-/.

(10)

... liefert:

<

%&

5. ,,.

%,%& 4*0-$&

"

0&!4

/ 3 4 34,. 4%05:

Der Thread wurde gekillt, das Ocaml-Programm terminierte trotzdem.

Auch ungefangene Exceptions innerhalb einer Wrapper-Funktion beenden den laufenden Thread:

.:%0

1/$ %6

$0- 5.

$0- "-&

$0- 4

/ 3 5 1&/$ +, 4 98:% 2 ;4<

1 ;4< =

$ 3&! 3

0 -/.

-/.

(11)

Dann liefert:

< 5

%&

4 4

4*0-$&

"

0&!4

Achtung:

Exceptions können nur im Rumpf der Wrapper-Funktion selbst, nicht aber hinter dem abgefangen werden !

(12)

11.4 Gepufferte Kommunikation

Ein Kanal für gepufferte Kommunikation erlaubt nicht

blockierendes Senden. Empfangen dagegen blockiert, sofern keine Nachrichten vorhanden ist. Für solche Känals implementieren wir die Struktur / , * zur Verfügung:

.:%0 $0 / ,

* 6

$0 9 *

" 01 / ,

* % ;4< 9 *

" ,-/. 9 * ;4< 9 ;4< %

" ! " 9 * ;4< 9 "-&

-/.

Zur Implementierung benutzen wir einen Server, der eine Queue der gesendeten, aber noch nicht erhaltenen Nachrichten verwaltet.

(13)

Damit implementieren wir:

.:%0 / ,

*

%6

$0- 5.

$0- -%0-%0

$0- "-&

$0 9 * 9 0 9 0

,-/. + 30 * +,-/. 30 *

! " '(

%&# ! "

%&

01 / ,

* 2 30 010 2

/.

%& 010 2

(14)

3 ,45" 8 + , $& 0 0-

,45" '-4%0-%0

"-& ! " 30# 0

!, ,6 7

1&/$ "-& ! " 30#

98:% ;4< ,45" '-4%0-%0 0>=

1&/$ "-& ,-/.

%& 98 6 0

98:% 2 ;4< '(0 .!4%0-%0

3 ,45" 0

?

3 -54 ,45" 014%0-%0 2>=

+ 30

%&#

-/.

... wobei 8 6 9 4%0-%0 ;4< 9 das erste Element einer Schlange liefert, ohne es zu entfernen :-)

(15)

11.5 Multicasts

Für das Versenden einer Nachricht an viele Empfänger stellen wir die Struktur %0 5,/ zur Verfügung, die die Signatur %0 5,/

implementiert:

.:%0 $0 %0 5,/ 6

$0 9 0 /. 9 $

5

" 01 0 % ;4< 9 0

" 01-$

5 9 0 ;4< 9 $ 5

" %0 5,/ 9 0 ;4< 9 ;4< %

" ! " 9 $

5 ;4< 9 "-&

(16)

Die Operation 01-$ 5 erzeugt einen neuen Port, an dem eine Nachricht empfangen werden kann.

Die Operation %0 5,/ sendet (nicht-blockierend) an sämtliche registrierten Ports.

.:%0 %0 5,/ %6

$0- 5.

$0- "-&

.:%0 / ,

*

$0 9 $

5 9 *

$0 9 0 9 0 % 0

9 $

5 0

01-$

5 '( $

5 +,-/. 2>=

! " $ 5

%0 5,/ +,-/.!( * +,-/. ,-/.! *

! " * ! " *

(17)

Die Operation %0 5,/ sendet die Nachricht auf dem Kanal

,-/.!

. Die Operation ! " liest aus der Mailbox des Ports.

Der Multicast-Kanal selbst wird von einem Server-Thread

überwacht, der eine Liste der zu bedienenden Ports verwaltet:

01 0 2 ,-/.! 010 2

3 010 2

3 $

5 010 2

3 ,-/.!-$

5 * * ,-/. * *

(18)

3 ,45" $

5 ,6 7

1&/$ "-& ! " 0 98:% 2 ;4<

$ 01 / ,

* 2

3 +,-/. $

5 $#>=

,45" $ $

5 &>=

1&/$ "-& ! " ,-/.!# 98:% * ;4<

-54 + 4 +,-/.!-$

5 * $

5 =

,45" $

5 &

?

3 -54 ,45" 7 ? =

+,-/.! $

5

(19)

Beachte, dass der Server-Thread sowohl auf Port-Requests auf dem Kanal wie auf Sende-Aufträge auf dem Kanal ,-/.! gefasst sein muss.

Achtung:

Unsere Implementierung gestattet zwar das Hinzufügen, nicht aber das Entfernen nicht mehr benötigter Ports.

Zum Ausprobieren benutzen wir einen Test-Ausdruck / 3 :

(20)

/ 3 01 0 2

3 5. $ 01-$

5

3 15 , %0 .

* ! " $#

3 $ 3&! 3& = $ 3&! 3 =

$ 3&! 3 * 4

. 0

3 -54 5. = -54 5. =

-54 5. = .!54 =

%0 5,/

=

%0 5,/

,. =

%0 5,/

0 -/. =

.!54

-/.

-/.

(21)

Dann haben wir:

; 5

%&

,.

,.

,.

0 -/.

0 -/.

0 -/.

(22)

Fazit:

• Die Programmiersprache Ocaml bietet komfortable

Möglichkeiten an, nebenläufige Programme zu schreiben :-)

• Kanäle mit synchroner Kommunikation können Konzepte der Nebenläufigkeit wie asynchrone Kommunikation, globale

Variablen, Locks für wechselseitigen Ausschluss und Semaphore simulieren ;-)

• Nebenläufige funktionale Programme können deshalb genauso undurchsichtig und schwer zu verstehen sein wie nebenläufige Java-Programme :-(

• Es werden Methoden benötigt, um systematisch die Korrektheit solcher Programme zu verifizieren ...

(23)

Abschluss:

• Jenseits der hier besprochenen Sprachkonzepte gibt es in Ocaml einige weitere Konzepte, die insbesondere objekt-orientierte

Programmierung ermöglichen.

• Darüberhinaus bietet Ocaml elegante Möglichkeiten, Betriebssystemsfunktionalität auszunutzen, graphische Bibliotheken anzusteuern, mit anderen Rechnern zu kommunizieren ...

==⇒ Ocaml ist eine interessante Alternative zu Java.

Referenzen

ÄHNLICHE DOKUMENTE

„Bundestag und Europäisches Parlament haben sich eindeutig gegen Patente auf Milchkühe und Gemüse ausgesprochen – trotzdem werden diese Patente immer weiter erteilt. Hier werden

Die Beschwerdekammer entscheidet, dass das Patent erneut der Großen Beschwerdekammer vorgelegt werden soll, mit der Frage, ob Pflanzen und Früchte von Pflanzen patentiert

Patentiert werden Verfahren zur Auswahl entsprechender Pflanzen (über die Beobachtung der Verfärbung von Schnittstellen), die Pflanzen, Teile der Pflanzen, Saatgut, die Nachkommen der

In der EU sind aktuell lediglich zwei gentechnisch veränderte Pflanzen für den kommerziellen Anbau zugelassen und zwar der gentechnisch veränderte Mais Mon 810 von Monsanto

Scheißdeutscher ist erlaubt, Scheißtürke ist verboten. Das ist Recht in Deutschland, in dem es unter politischem Vorbehalt steht. Die Politik bestimmt letztend- lich,

Die Lösung für die aktuellen Probleme der In- dustrieländer liegt nicht in ei- nem Verzicht auf Wachstum, son- dern vielmehr im Verzicht, auf Kosten anderer und kommender

Mit anderen Worten, die europäischen Institutionen und ihre Mitgliedstaa- ten müssen sich zum eigenen Handeln entschließen – um der in Weiß- russland unterdrückten Bürger

sechsten Generation zum Motor der Europäischen Gemeinschaft werden konnten, und wenn die finanziell und politisch unsteten Italiener sich so dis- zipliniert verhalten haben, dass