240 likes | 468 Views
Nebenläufige Programmierung. Mina Nikolova. Übersicht. Was ist Nebenläufigkeit? Anwendungen Grundlegende Begriffe Problemme Mechanismen zur Synchronisation Programmiersprachen CML Alice Java. Einführung. Grosse Systemen fordern Nebenläufigkeit
E N D
Nebenläufige Programmierung Mina Nikolova
Übersicht • Was ist Nebenläufigkeit? • Anwendungen • Grundlegende Begriffe • Problemme • Mechanismen zur Synchronisation • Programmiersprachen • CML • Alice • Java
Einführung • Grosse Systemen fordern Nebenläufigkeit • Mehrere Folgen von Aktionen werden gleichzeitig ausgeführt • Prozess – sequentielle Ausführung von Aktionen • Thread – „light-weight“ Prozess
Nebenläufigkeit • Multi-Programmierung • Ein Prozessor führt mehrere Prozesse parallel aus • Ein Prozess wird sequentiell ausgeführt • Teile eines Pozesses werden zw. Abschnitten anderer Prozesse ausgeführt • Multiprozessor-Programmierung • Zwei oder mehrere Prozessoren teilen gemeinsamen Speicher oder sind in einem Netzwerk verbunden • Prozesse, die auf den verschiedenen Prozessoren ausgeführt werden, können miteinander kommunizieren
Anwendungen • Ein Programm arbeitet während ein anderes Programm auf ein Ereignis wartet • Window Systeme zeigen parallel verschiedene Fenster auf dem Display • Prozesse auf verschiedenen Prozessoren können zusammenarbeiten und Probleme lösen • Ein Prozessor kann weiterarbeiten,falls ein anderer Prozessor abstürtzt
Grundlegende Begriffe • Kommunikation • gemeinsam benutzte Variablen, Datenstrukturen, Dateien • Nachrichtenaustausch durch Kommunikationskanäle • Kooperation - veranlaßt einen Prozess auf einen anderen zu warten oder signalisiert einem Prozess weiterzuarbeiten • Atomarität – atomare Aktion darf nicht während ihrer Ausführung unterbrochen werden
Grundlegende Begriffe (cont.) • Kritischer Abschnitt – Abschnitt eines Programms, der lesend oder schreibend gemeinsame Daten verarbeitet • procedure sign_up(person) • begin • number := number + 1; • list[number] := person; • end; • cobegin • sign_up(fred); • sign_up(bill); • coend; kritischer Abschnitt cobegin\coend – Aktionen in diesem Block werden nebenläufig ausgeführt
Probleme • Nichtdeterminismus • ein Programm produziert verschiedene Ausgaben mit derselben Eingabe • Schwer zu testen • viele mögliche Ausführungen eines Programms • nur selten auftretende Fehler • Deadlock - ein Prozess kann wegen des Zustandes eines anderen Prozesses nicht mehr arbeiten
Mechanismen zur Synchronisation • Semaphore(Edsger W. Dijkstra,1968) • schützt gemeinsame Daten.Jeder Prozess benutzt folgende Prozeduren, damit er die Daten benutzen darf : • wait Prozedur auf Semaphore s • Prozess darf entweder den kA betreten oder wird unterbrochen und in einer Warteschlange eingeordnet • signal Prozedur auf Semaphore s • Prozess verläßt den kA und erlaubt Prozesse aus der Warteschlange den kA zu betreten • Locks • Prozess testet eine Lock Variable und wartet, wenn sie gesetzt ist, oder betritt den kA
Mechanismen zur Synchronisation(cont) • Monitore (Brinch-Hansen, Dahl, Dijkstra, Hoare) • ähneln abstraktem Datentyp, dessen Operationen die Synchronisation sicherstellen • private Daten • Menge von Prozeduren . . . Eingangswarteschlange P3 P2 P1 MONITOR aktiver Prozess ruft Prozeduren des Monitors auf
Anforderungen an einer Programmiersprache • Kontrollstrukturen • Threads • Kommunikationsabstraktionen • synchronisierte Kommunikation • gepufferte, asynchrone Kommunikationskanäle, die die Nachrichtenreihenfolge behalten • gegenseitiger Ausschluß – nur ein Prozess darf sich zum Zeitpunkt im kA befinden
Programmiersprachen • CML • Alice • Java • Erlang • MPD • ADA • Actors • Concurrent Pascal • Cobegin/coend
Concurrent ML(Reppy, Gansner) • Threads • CML Prozesse • Programm besteht zuerst aus einem Thread • spawn : (unit unit) thread_id • Kommunikation zw. Threads • Kommunikationskanäle • synchron, geordnet, ungepuffert • channel : unit ´a chan channel() kreiert einen Kanal, der mit Werten vom Typ ´a kommuniziert
Concurrent ML (cont) • Operationen auf Kanälen • send : (´a chan * ´a) unit • receive : ´a chan ´a c = channel(); Beispiel: • spawn (fn()=> … <A> … send(c,3); … <B> …); • spawn (fn()=> … <C> … recv c; … <D> …); <A> <B> Ergebnis send/receive <C> <D>
Concurrent ML (cont) • Events • mächtiges Konzept für Nebenläufigkeit • verzögerte Aktionen, die der Synchronisation dienen • ´a event : Typ einer Aktion, die einen Wert vom Typ ´a liefert, wenn sie ausgeführt wird • sync : ´a event´a - synchronisieren auf einem Event recvEvt : ´a chan ´a event - receive Event fun receive(ch) = sync (recvEvent (ch)); Ein Thread empfängt Werte von einem Kanal durch Synchronisierung auf einem receive Event für diesen Kanal Bsp.:
Concurrent ML (cont) • Synchronisierter gemeinsamer Speicher • Konzept für koordinierte Zuweisungen von gemeinsam benutzten Speicherzellen • Sp Zelle ist anfangs leer Wenn die Zelle schon voll ist, darf ihr kein Thread Werte zuweisen.Wenn sie leer ist,darf nicht mehr gelesen werden leer put 4 voll take 4
Alice • Threads • mehrere Threads können nebenläufig laufen • werden durch spawn kreiert • Future • kommt als Resultat des spawn Ausdrucks • ist ein Platzhalter für das Ergebnis der nebenläufigen Berechnung • wird später durch das fertige Resultat ersetzt fun fib (0 | 1) = 1 | fib n = fib (n-1) + fib (n-2) val n = spawn fib 35 val n : int = _future Future n wird als Resultat zurückgegeben Zuerst wird _future auf dem Display gezeigt Wenn das Ergebnis fertig ist, wird _future ersetzt inspect n val it : unit = ()
Alice (cont) • Data-flow Synchronisation • mächtiger Mechanismus für nebenläufige Programmierung • Futures werden als Werte übergeben • Der Thread, der den Wert der Future fordert, wird blockiert, bis das Ergebnis die Future ersetzt • Wenn eine nebenläufige Berechnung eine Exception produziert, „fails“ die Future und wenn sie angefordert wird, liefert die die Exception
Java • Threads • Objekte der Klasse Thread • start : ertsellt einen neuen Thread durch Ausführung der run Methode von JVM • interrupt : suspendiert einen Thread und wirfft in ihm eine Exception • Kommunikation zw. Threads • Zuweisen\Lesen gemeinsamer Variablen • Aufrufen von Methoden von gem. Objekten
Java (cont) • Synchronisation • Locks • sichern den gegenseitigen Ausschluß bei Nutzung eines Objektes • Objekte können synchronisierte Methoden haben • Beim Aufruf einer synchronisierten Methode eines Objekts : Der Thread tested das Lock des Objekts, setzt es und führt die Statements aus synchronized (object) { statements } Wenn das Lock schon gesetzt ist, muss er warten bis es wieder verfügbar ist
Java (cont) • Wait set • eine Form von Semaphore für jedes Objekt wait - Thread suspendiert sich notify - Thread „weckt“ anderen Thread notifyAll - „weckt“ alle Threads vom wait set • Thread termination • join - Methode, die einen Thread darauf warten läßt, daß ein anderer Prozess terminiert,damit der Thread z.B. die Ergebnisse vom Prozess nutzen kann benutzen das Wait set eines Objekts zur Synchronisation
Java (cont) • Synchronisierte Methoden , Beispiel (Lea) class LinkedCell { // Lisp-style cons cell containing protected double value; // value and link to next cell protected LinkedCell next; public LinkedCell (double v, LinkedCell t) { value = v; next = t; } public synchronized double getValue() { return value; } public synchronized void setValue(double v) { value = v; // assignment not atomic } public LinkedCell next() { // no synch needed return next; }
Zusammenfassung • Nebenläufigkeit • wichtiges Konzept in der Informatik • schwer und aufwendig korrekt zu benutzen • CML • Threads, Events • Alice • Futures, Data-flow Synchronisation • Java • Threads,Synchronisation
Literaturhinweisen • Mitchell, Concepts in Programming Languages, Cambridge University Press 2003 • The Alice Team, The Alice System, Online Manual, 2003 • Gert Smolka, Concurrent Constraint Programming Based on Functional Programming. Programming Languages and Systems 1-11, 1998