Nichtsequentielle Programmierung - LinkFang.de





Parallele Programmierung

(Weitergeleitet von: Parallele_Programmierung)

Parallele Programmierung ist ein Programmierparadigma. Es umfasst zum einen Methoden, ein Computerprogramm in einzelne Teilstücke aufzuteilen, die nebenläufig ausgeführt werden können, zum anderen Methoden, nebenläufige Programmabschnitte zu synchronisieren. Dies steht im Gegensatz zur klassischen, sequentiellen (oder seriellen) Programmierung. Ein Vorteil der parallelen Programmierung ist neben möglicher schnellerer Programmausführung (bspw. bei Nutzung mehrerer Prozessorkerne) die Möglichkeit, das typische Alltagsphänomen Nebenläufigkeit direkt in Programmen abzubilden, was zu einfacherem, verständlicherem Quelltext führen kann. Ein Nachteil ist, dass das Laufzeitverhalten paralleler Algorithmen schwieriger nachvollziehbar sein kann als das eines äquivalenten sequentiellen Algorithmus.

Umsetzung

Parallele Programmierung kann zum Beispiel explizit dadurch geschehen, dass der Programmierer Programmteile in separaten Prozessen oder Threads ausführen lässt, oder es geschieht automatisch, so dass kausal unabhängige (parallelisierbare) Anweisungsfolgen „nebeneinander“ ausgeführt werden. Diese automatische Parallelisierung kann durch den Compiler vorgenommen werden, wenn als Zielplattform ein Computer mit Mehrkernprozessor oder ein Parallelrechner zur Verfügung steht, aber auch einige moderne CPUs können solche Unabhängigkeiten (im Mikrocode eines Programms) erkennen und die Anweisungen so auf verschiedene Teile des Prozessors verteilen, dass sie gleichzeitig ausgeführt werden (Out-of-order execution).

Es ist aus der Sicht des Programmierers bei der Parallelisierung im Allgemeinen gleichgültig, ob die einzelnen Programmteile tatsächlich gleichzeitig von unabhängigen Ausführungseinheiten bearbeitet werden, oder ob sie nur quasi-parallel ausgeführt werden (siehe Time-Sharing, Multitasking).

Bei der Parallelen Programmierung verwendet man den weniger strengen Begriff der Nebenläufigkeit, bei dem der Programmcode nicht streng hintereinander, sondern parallel ausgeführt wird. Zwei Transaktionen, Prozesse oder Threads sind genau dann parallelisierbar, wenn die parallele, verzahnte oder verdrehte Ausführung zum selben Resultat führt wie das sequentielle Ausführen (Parallelisierbarkeit). Ist dies nicht gegeben, so kann die Ausführung zu einer Race Condition führen.

Die Nebenläufigkeit von mehreren unabhängigen Prozessen bezeichnet man als Multitasking; Nebenläufigkeit innerhalb eines Prozesses als Multithreading. In den Frühzeiten der Computerentwicklung waren auch reine Time-Sharing-Systeme weit verbreitet, die eine Nebenläufigkeit auf Benutzerebene ermöglichten.

Konflikte

Sobald die einzelnen Prozesse oder Threads aber untereinander kommunizieren, sind sie streng genommen nicht mehr als Ganzes nebenläufig (sie beeinflussen sich ja) – nur noch einzelne Teilabläufe sind zueinander nebenläufig. Wenn nun die Reihenfolge der Ausführung der Kontaktpunkte (oder Kommunikationspunkte) nicht entsprechend vorgegeben ist, können sich daraus Konflikte ergeben, insbesondere eine so genannte Verklemmung (deadlock), wenn zwei Abläufe gegenseitig aufeinander warten (bzw. sich gegenseitig blockieren). Zur Lösung dieser Problematik werden verschiedene Techniken herangezogen:

Der Kontext jedes Programmteils muss vor unerwarteter Veränderung durch andere Teile geschützt werden (Synchronisierung). Soll ein gemeinsamer Zugriff auf Daten realisiert werden, dann muss der Zugriff synchronisiert werden, bspw. durch gegenseitigen Ausschluss (Mutex) unter Benutzung von Monitoren oder von Semaphoren. Alternativ kann auch verlangt werden, dass bestimmte Aktionen von zwei Prozessen gemeinsam ausgeführt werden, mit so genannten Rendezvous. Eine weitere sichere Art der Kommunikation sind Warteschlangen. Diese Techniken lösen das Problem des gleichzeitigen Zugriffs auf Ressourcen, verhindern jedoch keine Verklemmungen (ganz im Gegenteil).

Besonders wichtig sind solche Techniken in verteilten Systemen, vor allem um die Integrität von verteilten Transaktionen zu gewährleisten.

Parallele Programmiersprachen

Die meisten Programmiersprachen bieten Möglichkeiten zur Parallelisierung von Abläufen. Einige Sprachen sind jedoch von Grund auf für paralleles Programmieren entworfen oder besitzen diese Fähigkeit inhärent:

  • Newsqueak - in den Achtziger Jahren veröffentlichte Sprache zur Implementierung grafischer Benutzeroberflächen
  • Occam - 1985 veröffentlichte imperative Programmiersprache, die auf Communicating Sequential Processes aufbaut
  • Scratch - 2007 veröffentlichte erziehungsorientierte visuelle Programmiersprache. Eine erstaunliche Eigenschaft von Scratch ist, dass das eigentlich komplexe Programmierparadigma Parallele Programmierung quasi nebenbei eingeführt wird. Im Gegensatz zu traditionellen erziehungsorientierten Programmiersprachen, wird dieses in Scratch auch von Anfängern intuitiv sofort genutzt, so dass sie sich später ggf. wundern, dass andere "Profi-Programmiersprachen" zunächst nur sequentiell arbeiten.
  • X10 - parallele Programmiersprache entwickelt bei IBM zur Programmierung massiv paralleler Systeme.

Effizienz

Das gleichzeitige Abarbeiten der Berechnungen verkürzt im Allgemeinen die Ausführungszeit eines Programms. Bezüglich der verbrauchten CPU-Zeit ist ein paralleler Algorithmus jedoch fast immer schlechter als ein serieller, da die Synchronisierung der Abläufe zusätzlichen Verwaltungsaufwand erzeugt.

Auf einem Einkernsystem sind somit nur Parallelisierungen sinnvoll, bei denen ein Ausführungsstrang „weiterarbeiten“ kann, während ein anderer warten muss/soll - ohne Parallelisierung würde dieser Warte-Zwang das „Hintergrund-Weiterrechnen“ blockieren. Meistens muss darauf gewartet werden, dass das Betriebssystem einen Auftrag des Programms erledigt hat, oder der Ausführungsstrang soll auf weitere Benutzereingaben warten, während im Hintergrund Abarbeitungen (z. B. zuvor ausgelöster Benutzeraufträge) berechnet werden.

Um parallele Programmierung voll auszunutzen, sind mehrere Ausführungseinheiten nötig. Techniken dafür sind Simultaneous Multithreading (SMT), z. B. Hyper-Threading Technology (HTT), Symmetrisches Multiprocessing (SMP), z. B. mittels Multicore-Prozessor oder mehrerer CPUs. Den Extremfall bildet das Massively Parallel Processing (MPP) mit zum Teil mehreren tausend Prozessoren. Verbreitet ist auch, ganze Verbünde von Einzelrechnern zum parallelen Berechnen einzusetzen (Computercluster).

Auf der anderen Seite sollte möglichst wenig Kontrollcode zur Koordination der Threads vorhanden sein, falls dieser nur sequentiell ausgeführt werden kann. Dieser Sachverhalt ist Ergebnis des Amdahlschen Gesetzes über die Parallelisierungseigenschaften von Programmen.

Siehe auch

Literatur


Kategorien: Keine Kategorien vorhanden!

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Parallele Programmierung (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.