<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Parallele_Programmierung</id>
	<title>Parallele Programmierung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Parallele_Programmierung"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Parallele_Programmierung&amp;action=history"/>
	<updated>2026-05-26T10:32:44Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Parallele_Programmierung&amp;diff=174844&amp;oldid=prev</id>
		<title>2003:EC:73A:E6B9:91A9:61BC:35C:6DB1: /* Parallele Programmiersprachen */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Parallele_Programmierung&amp;diff=174844&amp;oldid=prev"/>
		<updated>2024-12-28T10:23:50Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Parallele Programmiersprachen&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Parallele Programmierung&amp;#039;&amp;#039;&amp;#039; ist ein [[Programmierparadigma]]. Es umfasst zum einen Methoden, ein [[Computerprogramm]] in einzelne Teilstücke aufzuteilen, die [[Nebenläufigkeit|nebenläufig]] ausgeführt werden können, zum anderen Methoden, nebenläufige Programmabschnitte zu [[Prozesssynchronisation|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 [[Prozessorkern]]e) 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 Algorithmus|paralleler Algorithmen]] schwieriger nachvollziehbar sein kann als das eines äquivalenten sequentiellen Algorithmus.&lt;br /&gt;
&lt;br /&gt;
== Umsetzung ==&lt;br /&gt;
Es ist für eine Parallelisierung theoretisch gleichgültig, ob die einzelnen Programmteile tatsächlich &amp;#039;&amp;#039;echt gleichzeitig&amp;#039;&amp;#039; von unabhängigen [[Hauptprozessor|Ausführungseinheiten]] bearbeitet werden, oder ob sie nur &amp;#039;&amp;#039;quasi-parallel&amp;#039;&amp;#039; ausgeführt werden (siehe [[Time-Sharing (Informatik)|Time-Sharing]], [[Multitasking]]).&lt;br /&gt;
&lt;br /&gt;
Bei der Parallelen Programmierung verwendet man den weniger strengen Begriff der [[Nebenläufigkeit]], bei dem der [[Maschinensprache|Programmcode]] nicht streng hintereinander, sondern parallel ausgeführt wird. Zwei Programmteile sind genau dann parallelisierbar, wenn die parallele, verzahnte oder verdrehte Ausführung zum selben Resultat führt wie das sequentielle Ausführen (&amp;#039;&amp;#039;Parallelisierbarkeit&amp;#039;&amp;#039;). Ist dies nicht gegeben, so kann die Ausführung zu einer [[Race Condition]] führen.&lt;br /&gt;
&lt;br /&gt;
Die Nebenläufigkeit von mehreren unabhängigen [[Prozess (Computer)|Prozessen]] bezeichnet man als [[Multitasking]]; Nebenläufigkeit innerhalb eines Prozesses als [[Multithreading]]. In den Frühzeiten der Computerentwicklung waren auch reine [[Time-Sharing (Informatik)|Time-Sharing]]-Systeme weit verbreitet, die eine Nebenläufigkeit auf Benutzerebene ermöglichten.&lt;br /&gt;
&lt;br /&gt;
=== Unterstützende Hardware ===&lt;br /&gt;
{{Anker|Auto-Parallelisierung}}&lt;br /&gt;
Meist wird die parallele Ausführung eines Programms hardwareseitig unterstützt; die Programmiersprachen sind dann im Allgemeinen darauf angepasst. So kann Parallele Programmierung zum Beispiel explizit dadurch geschehen, dass der [[Programmierer]] Programmteile in separaten [[Prozess (Computer)|Prozessen]] oder [[Thread (Informatik)|Threads]] ausführen lässt, oder es geschieht automatisch, so dass &amp;#039;&amp;#039;[[Kausalität|kausal]] unabhängige&amp;#039;&amp;#039; (&amp;#039;&amp;#039;parallelisierbare&amp;#039;&amp;#039;) 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 [[Hauptprozessor|CPUs]] können solche Unabhängigkeiten (im [[Maschinencode]] bzw. [[Mikrocode]] eines Programms) erkennen und die Anweisungen so auf verschiedene Teile des Prozessors verteilen, dass sie gleichzeitig ausgeführt werden ([[Out-of-order execution]]).&lt;br /&gt;
&lt;br /&gt;
== Konflikte ==&lt;br /&gt;
&lt;br /&gt;
Sobald die einzelnen Prozesse oder [[Thread (Informatik)|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 &amp;#039;&amp;#039;Kontaktpunkte&amp;#039;&amp;#039; (oder &amp;#039;&amp;#039;Kommunikationspunkte&amp;#039;&amp;#039;) nicht entsprechend vorgegeben ist, können sich daraus Konflikte ergeben, insbesondere eine so genannte [[Verklemmung]] (&amp;#039;&amp;#039;deadlock&amp;#039;&amp;#039;), wenn zwei Abläufe gegenseitig aufeinander warten (bzw. sich gegenseitig blockieren). Zur Lösung dieser Problematik werden verschiedene Techniken herangezogen:&lt;br /&gt;
&lt;br /&gt;
Der [[Prozesskontext|Kontext]] jedes [[Unterprogramm|Programmteils]] muss vor [[Fraud|unerwarteter Veränderung]] durch andere Teile geschützt werden ([[Synchronisierung]]). Soll ein gemeinsamer [[Speicherzugriff|Zugriff]] auf [[Daten]] realisiert werden, wobei zumindest eine Partei schreibend/verändernd zugreifen möchte, dann muss der Zugriff synchronisiert werden, bspw. durch &amp;#039;&amp;#039;gegenseitigen Ausschluss&amp;#039;&amp;#039; ([[Mutex]]) unter Benutzung von [[Monitor (Informatik)|Monitoren]] oder von [[Semaphor (Informatik)|Semaphoren]]. Alternativ kann auch verlangt werden, dass bestimmte Aktionen von zwei Prozessen &amp;#039;&amp;#039;gemeinsam&amp;#039;&amp;#039; ausgeführt werden, mit so genannten [[Rendezvous (Informatik)|Rendezvous]]. Eine weitere sichere Art der Kommunikation sind [[Warteschlange (Datenstruktur)|Warteschlangen]]. Diese Techniken lösen das Problem des gleichzeitigen Zugriffs auf [[Ressource]]n, verhindern jedoch keine Verklemmungen (ganz im Gegenteil).&lt;br /&gt;
&lt;br /&gt;
Besonders wichtig sind solche Techniken in [[Verteilte Systeme|verteilten Systemen]], vor allem um die [[Integrität (Informationssicherheit)|Integrität]] von verteilten [[Transaktionssystem|Transaktionen]] zu gewährleisten.&lt;br /&gt;
&lt;br /&gt;
== Parallele Programmiersprachen ==&lt;br /&gt;
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:&lt;br /&gt;
* [[Newsqueak]] – in den 1980er Jahren veröffentlichte Sprache zur Implementierung grafischer Benutzeroberflächen&lt;br /&gt;
* [[Occam]] – 1985 veröffentlichte imperative Programmiersprache, die auf [[Communicating Sequential Processes]] aufbaut&lt;br /&gt;
* [[Scratch (Programmiersprache)|Scratch]] – 2007 veröffentlichte [[Bildungsorientierte Programmiersprachen|bildungsorientierte]] [[Visuelle Programmierung|visuelle]] [[Programmiersprache]]. Eine erstaunliche Eigenschaft von Scratch ist, dass das eigentlich komplexe [[Programmierparadigma]] ‚Parallele Programmierung‘ quasi nebenbei eingeführt wird. Im Gegensatz zu traditionellen bildungsorientierten Programmiersprachen wird dieses in Scratch auch von Anfängern intuitiv sofort genutzt, so dass sie sich später ggf. wundern, dass „Profi-Programmiersprachen“ zunächst nur sequentiell arbeiten.&lt;br /&gt;
* [[X10 (Programmiersprache)|X10]] – entwickelt bei [[IBM]] zur Programmierung massiv paralleler Systeme&lt;br /&gt;
* [[Erlang (Programmiersprache)|Erlang]] – wurde bei [[Ericsson]] von [[Joe Armstrong (Informatiker)|Joe Armstrong]] und anderen entwickelt&lt;br /&gt;
* [[Chapel (Programmiersprache)|Chapel]] – Konkurrent zu X10; von [[Cray]]&lt;br /&gt;
* [[Unified Parallel C]] – eine Erweiterung von C99; vom &amp;#039;&amp;#039;UPC-Konsortium&amp;#039;&amp;#039;&lt;br /&gt;
* [[Rust (Programmiersprache)|Rust]] – 2015 entwickelte Programmiersprache von [[Mozilla Foundation|Mozilla]] Research Group, welche [[C (Programmiersprache)|C]] und [[C++]] ablösen soll&lt;br /&gt;
* [[Go (Programmiersprache)|Go]]&lt;br /&gt;
&lt;br /&gt;
== Effizienz ==&lt;br /&gt;
&lt;br /&gt;
Das gleichzeitige Abarbeiten der Berechnungen verkürzt im Allgemeinen die Ausführungszeit eines Programms. Bezüglich der verbrauchten [[Prozessorzeit|CPU-Zeit]] ist ein paralleler Algorithmus jedoch fast immer schlechter als ein serieller, da die Synchronisierung der Abläufe zusätzlichen Verwaltungsaufwand erzeugt.&lt;br /&gt;
&lt;br /&gt;
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.&amp;amp;nbsp;B. zuvor ausgelöster Benutzeraufträge) berechnet werden.&lt;br /&gt;
&lt;br /&gt;
Um Parallele Programmierung voll auszunutzen, sind mehrere Ausführungseinheiten nötig. Techniken dafür sind [[Simultaneous Multithreading]] (SMT), z.&amp;amp;nbsp;B. [[Hyper-Threading|Hyper-Threading Technology]] (HTT), [[Symmetrisches Multiprocessing]] (SMP), z.&amp;amp;nbsp;B. mittels [[Multicore-Prozessor]] oder mehrerer [[Hauptprozessor|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]]).&lt;br /&gt;
&lt;br /&gt;
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 [[Amdahlsches Gesetz|Amdahlschen Gesetzes]] über die Parallelisierungseigenschaften von Programmen.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Paralleler Algorithmus]]&lt;br /&gt;
* [[Synchrone Kommunikation]]&lt;br /&gt;
* [[Asynchrone Kommunikation]]&lt;br /&gt;
* [[Sequentialisierung]]&lt;br /&gt;
* [[Graphpartitionierung]]&lt;br /&gt;
* [[OpenMP]], [[Message Passing Interface|MPI]]&lt;br /&gt;
* [[Vektorprozessor]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* Peter Ziesche: &amp;#039;&amp;#039;Nebenläufige &amp;amp; verteilte Programmierung&amp;#039;&amp;#039;, W3L, 2004, ISBN 3-937137-04-1&lt;br /&gt;
* Douglas Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann: &amp;#039;&amp;#039;Pattern-orientierte Softwarearchitektur, Muster für nebenläufige und vernetzte Objekte&amp;#039;&amp;#039;, dpunkt 2002, ISBN 3-89864-142-2&lt;br /&gt;
* M. Ben-Ari: &amp;#039;&amp;#039;Grundlagen der Parallel-Programmierung&amp;#039;&amp;#039;, 1984, ISBN 3-446-14155-3&lt;br /&gt;
* Dietrich Boles: &amp;#039;&amp;#039;[http://www.java-hamster-modell.de/eBooks/hamster3.pdf Parallele Programmierung spielend gelernt mit dem Java-Hamster-Modell – Programmierung mit Java-Threads] (PDF; 4,1&amp;amp;nbsp;MB)&amp;#039;&amp;#039;. Vieweg+Teubner-Verlag, 2008, ISBN 978-3-8351-0229-3&lt;br /&gt;
* Wolfgang W. Baumann: &amp;#039;&amp;#039;Parallel-Computing als Hilfsmittel im technisch-wissenschaftlichen Höchstleistungsrechnen – Eine Einführung&amp;#039;&amp;#039;, 2000 [http://hodgson.pi.tu-berlin.de/Lehre/EDV2/dokus/parallel.pdf pdf]&lt;br /&gt;
* {{Literatur |Autor=Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David Holmes |Titel=Java Concurrency in Practice |Verlag=Addison-Wesley Longman |Ort= |Datum=2006 |ISBN=978-0-321-34960-6}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Parallelverarbeitung]]&lt;br /&gt;
[[Kategorie:Programmierparadigma]]&lt;/div&gt;</summary>
		<author><name>2003:EC:73A:E6B9:91A9:61BC:35C:6DB1</name></author>
	</entry>
</feed>