Nebenlufige Programmierung Mina Nikolova bersicht Was ist Nebenlufigkeit
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 cobegincoend – 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 k. A betreten oder wird unterbrochen und in einer Warteschlange eingeordnet • signal Prozedur auf Semaphore s - Prozess verläßt den k. A und erlaubt Prozesse aus der Warteschlange den k. A zu betreten Ø Locks • Prozess testet eine Lock Variable und wartet, wenn sie gesetzt ist, oder betritt den k. A
Mechanismen zur Synchronisation(cont) Ø Monitore (Brinch-Hansen, Dahl, Dijkstra, Hoare) • ähneln abstraktem Datentyp, dessen Operationen die Synchronisation sicherstellen • private Daten • Menge von Prozeduren. . . P 3 Eingangswarteschlange P 2 P 1 MONITOR aktiver Prozess ruft Prozeduren des Monitors auf
Anforderungen an einer Programmiersprache Ø Kontrollstrukturen • Threads • Kommunikationsabstraktionen - synchronisierte Kommunikation - gepufferte, asynchrone Kommunikationskanäle, die Nachrichtenreihenfolge behalten • gegenseitiger Ausschluß – nur ein Prozess darf sich zum Zeitpunkt im k. A 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) thread_id Ø Kommunikation zw. Threads • Kommunikationskanäle • synchron, geordnet, ungepuffert - channel : unit ´a 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 Beispiel: c = channel(); spawn (fn()=> … <A> … send(c, 3); … <B> …); spawn (fn()=> … <C> … recv c; … <D> …); Ergebnis <A> <B> 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 Bsp. : recv. Evt : ´a chan ´a event - receive Event fun receive(ch) = sync (recv. Event (ch)); Ein Thread empfängt Werte von einem Kanal durch Synchronisierung auf einem receive Event für diesen Kanal
Concurrent ML (cont) Ø Synchronisierter gemeinsamer Speicher • Konzept für koordinierte Zuweisungen von gemeinsam benutzten Speicherzellen - Sp Zelle ist anfangs leer put voll 4 4 take Wenn die Zelle schon voll ist, darf ihr kein Thread Werte zuweisen. Wenn sie leer ist, darf nicht mehr gelesen werden
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 Future n wird als Resultat zurückgegeben val n : int = _future inspect n val it : unit = () Zuerst wird _future auf dem Display gezeigt Wenn das Ergebnis fertig ist, wird _future ersetzt
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 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 • ZuweisenLesen 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 : synchronized (object) { Der Thread tested das Lock des Objekts, setzt es und führt die Statements aus 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 benutzen das Wait set notify - Thread „weckt“ anderen Thread eines Objekts zur Synchronisation notify. All - „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
Java (cont) Ø Synchronisierte Methoden , Beispiel (Lea) class Linked. Cell { // Lisp-style cons cell containing protected double value; // value and link to next cell protected Linked. Cell next; public Linked. Cell (double v, Linked. Cell t) { value = v; next = t; } public synchronized double get. Value() { return value; } public synchronized void set. Value(double v) { value = v; // assignment not atomic } public Linked. Cell 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 Languages and Systems 1 -11, 1998
- Slides: 24