Der Unterschied zwischen "gleichzeitiger" und "paralleler" Ausführung?

107

Was ist der Unterschied zwischen den Begriffen gleichzeitige und parallele Ausführung? Ich habe den Unterschied nie richtig verstanden.

Das Tag definiert Parallelität als eine Art und Weise, zwei Prozesse gleichzeitig auszuführen, aber ich dachte, Parallelität sei genau dasselbe, dh separate Threads oder Prozesse, die möglicherweise auf separaten Prozessoren ausgeführt werden können.

Wenn wir so etwas wie asynchrone E / A betrachten, haben wir es dann auch mit Parallelität oder Parallelität zu tun?

blz
quelle
27
Auf den Punkt gebracht - gleichzeitig: Es finden viele verschiedene Operationen gleichzeitig statt. parallel: Die gleiche Operation wird in kleine Teile aufgeteilt, die gleichzeitig stattfinden.
Oded
3
@Oded, ich verstehe, was die Wörter bedeuten, aber ich habe Probleme, die Implikationen zu verstehen. Hast du ein konkretes Beispiel?
Blz
7
@Oded, ich stimme Ihnen nicht wirklich zu, nirgendwo in ihren Definitionen (entweder allgemein oder auf die Programmierung bezogen) erwähnen die Begriffe "gleichzeitig" und "parallel" irgendetwas über die Anzahl oder "Größe" von Operationen.
Shivan Dragon
2
@Oded als du "small bits" gesagt hast.
Avner Shahar-Kashtan
2
@Oded: Ja, aber das scheint die Wurzel des Missverständnisses zwischen dir und ShivanDragon zu sein.
Avner Shahar-Kashtan

Antworten:

97

Parallelität und Parallelität sind zwei verwandte, aber unterschiedliche Konzepte.

Parallelität bedeutet im Wesentlichen, dass Task A und Task B unabhängig voneinander ausgeführt werden müssen und A ausgeführt wird. Anschließend wird B ausgeführt, bevor A abgeschlossen ist.

Es gibt verschiedene Möglichkeiten, die Parallelität zu erreichen. Eine davon ist die Parallelität, bei der mehrere CPUs gleichzeitig an den verschiedenen Aufgaben arbeiten. Aber das ist nicht der einzige Weg. Eine andere Möglichkeit ist die Taskumschaltung, die folgendermaßen funktioniert: Task A arbeitet bis zu einem bestimmten Punkt, dann stoppt die CPU, die daran arbeitet, und wechselt zu Task B, arbeitet eine Weile daran und wechselt dann zurück zu Task A. Wenn Wenn die Zeitscheiben klein genug sind, scheint es dem Benutzer, dass beide Dinge parallel ausgeführt werden, obwohl sie tatsächlich von einer Multitasking-CPU seriell verarbeitet werden.

Mason Wheeler
quelle
4
Fall B ist, wie asynchrone E / A funktioniert, nein?
Blz
6
@blz: Das stimmt. So funktioniert präventives Multitasking. Der Hauptunterschied besteht darin, dass das Programm bei asynchronem E / A seine Zeit aufgibt und die CPU anweist , etwas anderes zu verarbeiten, während das Betriebssystem bei präemptivem Multitasking die CPU nach einer ausreichenden Zeit nicht freiwillig aufgibt es.
Mason Wheeler
1
Die beste Erklärung zweifellos
Konrad
@ MasonWheeler: Wenn wir nur 1 CPU haben, dann können wir nur Parallelität haben, keine Parallelität. Richtig? Parallelität kann durch mehr als 1 CPU erreicht werden. Richtig? Und wenn es richtig ist und wir nur 1 CPU haben, sind Streams von Java 8 nicht von Nutzen.
Anish Mittal
1
Gleich zu den ersten Punkten. Was den letzten betrifft, ist Parallelität der einzige Vorteil, den Sie aus Streams ziehen können? Ich bin kein Java-Entwickler, aber ich habe den Eindruck, dass Java-Streams in etwa LINQ entsprechen und dass dies echte Vorteile in Bezug auf Ausdruckskraft und einfache Entwicklung mit sich bringt.
Mason Wheeler
37

Die beiden Konzepte sind verwandt, aber unterschiedlich.

Parallelität bedeutet, dass zwei oder mehr Berechnungen innerhalb desselben Zeitrahmens durchgeführt werden und normalerweise eine gewisse Abhängigkeit zwischen ihnen besteht.

Parallelität bedeutet, dass zwei oder mehr Berechnungen gleichzeitig durchgeführt werden.

Kurz gesagt, Parallelität beschreibt ein Problem (zwei Dinge müssen zusammen passieren), während Parallelität eine Lösung beschreibt (zwei Prozessorkerne werden verwendet, um zwei Dinge gleichzeitig auszuführen).

Parallelität ist eine Möglichkeit, Parallelität zu implementieren, aber nicht die einzige. Eine andere beliebte Lösung ist Interleaved Processing (auch bekannt als Coroutines): Teilen Sie beide Aufgaben in atomare Schritte auf und wechseln Sie zwischen den beiden hin und her.

Das mit Abstand bekannteste Beispiel für nicht parallele Parallelität ist die Funktionsweise von JavaScript: Es gibt nur einen Thread, und jeder asynchrone Rückruf muss warten, bis der vorherige Codeabschnitt ausgeführt wurde. Dies ist wichtig zu wissen, da es garantiert, dass jede Funktion, die Sie schreiben, atomar ist - kein Rückruf kann sie unterbrechen, bis sie zurückkehrt. Es bedeutet jedoch auch, dass "Busy Loops" nicht funktionieren. Sie können kein Timeout festlegen und dann eine Schleife ausführen, bis sie ausgelöst wird, da die Schleife die Ausführung des Timeout-Rückrufs verhindert.

tdammers
quelle
8
Sie sagen das. Concurrency means that two or more calculations happen within the same time frame, and there is usually some sort of dependency between them.Aber der Benutzer, der die akzeptierte Antwort geschrieben hat, sagt Concurrency means, essentially, that task A and task B both need to happen independently of each other. Was ist die Schlussfolgerung?
Nr.
Können Sie erklären, warum das JavaScript-Modell gleichzeitig ausgeführt wird? Nach Ihrer Definition der Parallelität sollten zwei oder mehr Berechnungen innerhalb desselben Zeitrahmens durchgeführt werden. In JavaScript werden Berechnungen jedoch nacheinander anhand einer einzelnen Warteschlange sortiert.
Damluar
4
Mit "innerhalb desselben Zeitrahmens" meine ich nicht unbedingt "gleichzeitig", sondern nur, dass sich die Gesamtzeitrahmen, in denen sie auftreten, überlappen. Dies kann parallel erfolgen (z. B. zwei Prozessorkerne, die jeweils eine der Aufgaben ausführen), es kann jedoch auch durch vollständige Serialisierung der Ausführung erreicht werden (zuerst Aufgabe 1 ausführen, das Ergebnis merken, dann Aufgabe 2 ausführen, dann beide melden). oder durch Zerhacken und Verschachteln der Stücke. Letzteres macht JS.
Tdammers
9

Ich glaube, dass diese Antwort korrekter ist als die vorhandenen Antworten, und wenn sie bearbeitet worden wären, hätte dies ihr Wesen verändert. Ich habe versucht, auf verschiedene Quellen oder Wikipedia-Seiten zu verlinken, damit andere die Richtigkeit bestätigen können.


Parallelität: Die Eigenschaft eines Systems, mit der Einheiten des Programms, des Algorithmus oder des Problems außerhalb der Reihenfolge oder in Teilreihenfolge ausgeführt werden können, ohne das Endergebnis zu beeinflussen 1 2 .

Ein einfaches Beispiel hierfür sind aufeinanderfolgende Ergänzungen:

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

Aufgrund der kommutativen Zusatzeigenschaft kann deren Reihenfolge ohne Beeinträchtigung der Korrektheit geändert werden; Die folgende Anordnung ergibt die gleiche Antwort:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

Hier habe ich Zahlen zu Paaren zusammengefasst, die sich zu 10 summieren, was es mir leichter macht, die richtige Antwort in meinem Kopf zu finden.

Parallel Computing: eine Art der Berechnung , in der viele Berechnungen oder die Ausführung der Prozesse gleichzeitig ausgeführt werden 3 4 . Somit nutzt die Parallelverarbeitung die Eigenschaft der Parallelität, um mehrere Einheiten des Programms, des Algorithmus oder des Problems gleichzeitig auszuführen.

Wenn wir mit dem Beispiel fortlaufender Additionen fortfahren, können wir verschiedene Teile der Summe parallel ausführen:

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

Am Ende summieren wir dann die Ergebnisse der einzelnen Arbeiter, um sie zu erhalten 10 + 35 = 45.

Auch diese Parallelität war nur möglich, weil aufeinanderfolgende Hinzufügungen die Eigenschaft der Parallelität haben.

Parallelität kann jedoch nicht nur durch Parallelität genutzt werden. Berücksichtigen Sie die Prävention auf einem Single-Core-System: Im Laufe der Zeit kann das System Fortschritte bei mehreren laufenden Prozessen erzielen, ohne dass einer von ihnen abgeschlossen wird. In der Tat ist Ihr Beispiel für asynchrone E / A ein häufiges Beispiel für Parallelität, für die keine Parallelität erforderlich ist.


Verwechslung

Das Obige ist relativ einfach. Ich vermute, dass die Leute verwirrt sind, weil die Wörterbuchdefinitionen nicht unbedingt mit den oben beschriebenen übereinstimmen:

  • Concurrent: gleichzeitig oder nebeneinander auftreten oder existieren 5 .
  • Parallelität: die Tatsache, dass zwei oder mehr Ereignisse oder Umstände gleichzeitig eintreten oder existieren. Bei der Suche auf Google: "define: concurrency" .

Das Wörterbuch definiert "Parallelität" als eine Tatsache des Auftretens, während die Definition in der Umgangssprache "Computing" eine latente Eigenschaft eines Programms, einer Eigenschaft oder eines Systems ist. Obwohl verwandt, sind diese Dinge nicht dasselbe.


Persönliche Empfehlungen

Ich empfehle, den Begriff "parallel" zu verwenden, wenn die gleichzeitige Ausführung sichergestellt oder erwartet wird, und den Begriff "gleichzeitig" zu verwenden, wenn es unsicher oder irrelevant ist, ob die gleichzeitige Ausführung verwendet wird.

Ich würde daher die Simulation eines Strahltriebwerks auf mehreren Kernen als parallel bezeichnen.

Ich würde Makefiles als Beispiel für Parallelität beschreiben. Makefiles geben die Abhängigkeiten der einzelnen Ziele an. Wenn Ziele von anderen Zielen abhängen, wird eine Teilreihenfolge erstellt. Wenn die Beziehungen und Rezepte umfassend und korrekt definiert sind, liegt die Eigenschaft der Parallelität vor: Es gibt eine Teilreihenfolge, sodass die Reihenfolge bestimmter Aufgaben neu angeordnet werden kann, ohne das Ergebnis zu beeinflussen. Diese Parallelität kann wiederum genutzt werden, um mehrere Regeln gleichzeitig zu erstellen, aber die Parallelität ist eine Eigenschaft des Makefiles, unabhängig davon, ob Parallelität verwendet wird oder nicht.

Levi Morrison
quelle
6

Die gleichzeitige Ausführung ist die verallgemeinerte Form der parallelen Ausführung. Zum Beispiel kann das parallele Programm auch als gleichzeitig bezeichnet werden, aber das Gegenteil ist nicht der Fall.

  1. Gleichzeitige Ausführung ist auf einem einzelnen Prozessor möglich (mehrere Threads, vom Scheduler verwaltet)
  2. Die parallele Ausführung ist nicht auf einem Prozessor, sondern auf mehreren Prozessoren möglich. (Ein Prozess pro Prozessor)

Weitere Informationen finden Sie in diesem Forschungsbericht Konzepte der parallelen Programmierung


quelle
1
"Parallele Ausführung ist nicht auf einem einzelnen Prozessor, sondern auf mehreren Prozessoren möglich" - außer natürlich, wenn es innerhalb eines Prozessors parallele Ausführungspfade gibt, z Pentium, ARM Cortex und die meisten anderen High-End-Prozessoren) sowie Single Instruction Multiple Data, auch als datenparallele Architekturen (z. B. MMX / SSE / usw.) bezeichnet. Ganz zu schweigen von exotischen Arrangements wie Datenflussprozessoren und so weiter.
Jules
3

Die parallele Verarbeitung ist eine Teilmenge der gleichzeitigen Verarbeitung.

Die gleichzeitige Verarbeitung beschreibt zwei Aufgaben, die asynchron auftreten, dh die Reihenfolge, in der die Aufgaben ausgeführt werden, ist nicht vorbestimmt. Zwei Threads können gleichzeitig auf demselben Prozessorkern ausgeführt werden, indem ausführbare Anweisungen verschachtelt werden. Beispiel: Thread 1 dauert 10 ms, Thread 2 dauert 10 ms usw.

Parallelverarbeitung ist eine Art gleichzeitiger Verarbeitung, bei der mehr als ein Befehlssatz gleichzeitig ausgeführt wird. Dies können mehrere Systeme sein, die an einem gemeinsamen Problem wie beim verteilten Rechnen arbeiten, oder mehrere Kerne auf demselben System.

ConditionRacer
quelle
0

Die Aussage von tdammer kommt nahe, der Rest ist alles andere als der springende Punkt. Er sagt:

"Fazit: Parallelität beschreibt ein Problem (zwei Dinge müssen zusammen passieren), während Parallelität eine Lösung beschreibt (zwei Prozessorkerne werden verwendet, um zwei Dinge gleichzeitig auszuführen)."

Analysieren wir einfach die Wörter.

Aktuell bedeutet, dass es jetzt passiert, aktuell, relevant in diesem Moment. Con bedeutet gegen, kontern, nicht ausrichten.

Parallel bedeutet in die gleiche Richtung ohne sich zu kreuzen, ohne sich gegenseitig im Weg zu sein.

Parallelität bedeutet also, um dieselbe Ressource zu konkurrieren. Parallelität nicht. Bei parallelen Prozessen wird möglicherweise dieselbe Ressource verwendet, dies wird jedoch nicht als Problem angesehen, sondern ist kein Problem. Mit der Parallelität ist es ein Problem, das behandelt werden muss.

Martin Maat
quelle
"Aktuell bedeutet jetzt geschehen, aktuell, relevant in diesem Moment. Con bedeutet dagegen, kontern, nicht angleichen." - Zitat erforderlich. Ich bezweifle stark diese beiden Aussagen. Während "aktuell" die hier auf Englisch erwähnte Bedeutung haben kann, ist dies nicht die Bedeutung, die im Wort "gleichzeitig" verwendet wird
Hulk
1
Ich denke, dass die Übersetzung von Concurrent aus dem Lateinischen "zusammenlaufen" soll. Das Präfix 'con' bedeutet oft zusammen , da bei Verschwörung (Zusammenatmen) Konsequenz (Ergebnisse zusammen oder Folgen) (enger zusammen) usw. geschlossen wird. Es ist eine ärgerliche Facette der Sprache, dass etwas gegensätzliche Bedeutungen haben kann, Sanktion ist mein Lieblingsbeispiel .
@no comprende In diesem Fall (con-current) scheint die zusammenlaufende Bedeutung besser zu passen. Da es kein Pro-Current gibt ... Im Niederländischen ist Concurrent ein Substantiv, das Konkurrent bedeutet. Courant ist weit verbreitet und bewegt sich überall um Sie herum. Es ist auch Zeitung. Etwas, das jetzt aktiv ist. "Rekening courant" ist ein laufender Account. Ich glaube, Parallelität impliziert Konflikt (!). Ein Kampf um die gleiche Ressource. Laufen im selben Raum. Vielleicht wegen der niederländischen Bedeutung (Konkurrent).
Martin Maat
Was würde Dijkstra wohl sagen?
-1

Offensichtlich werden die Begriffe in verschiedenen Kulturen unterschiedlich verwendet.

Mein Verständnis ist das folgende:

Parallelität ist eine Möglichkeit, die Verarbeitung zu beschleunigen. Egal, ob Sie eine Matrixmultiplikation auf einem einzelnen Kern, auf mehreren Kernen oder sogar in der GPU durchführen, das Ergebnis ist dasselbe (oder Ihr Programm ist kaputt). Es fügt keinem Programm neue Funktionen hinzu, nur Geschwindigkeit.

Während es sich bei der Nebenläufigkeit um Dinge handelt, die Sie nicht nacheinander ausführen können. Zum Beispiel 3 verschiedene Webseiten gleichzeitig an 3 Clients liefern, während auf die nächste Anfrage gewartet wird. (Sie können dies jedoch bis zu einem gewissen Grad durch Interleaving simulieren, wie dies in früheren Zeiten der Fall war.) Beachten Sie, dass das Verhalten von gleichzeitigen Programmen nicht deterministisch ist. Es ist beispielsweise nicht klar, welcher der 3 Clients zuerst vollständig bedient wird. Sie könnten einige Tests durchführen und jedes Mal ein anderes Ergebnis in Bezug auf die Bestellung erhalten, wenn die Anfrage abgeschlossen wird. Das Laufzeitsystem sollte sicherstellen, dass a) alle Kunden in angemessener Zeit bedient werden und b).

Normalerweise ist sich das Arbeitspferd einer Parallelberechnung der Parallelität nicht bewusst und kümmert sich auch nicht darum. Bei gleichzeitigen Aufgaben wird häufig explizit die Kommunikation zwischen Prozessen oder Threads verwendet, z. B. das Blockieren von Warteschlangen, die Synchronisierung und Sperrmechanismen.

Ingo
quelle
-1

Meiner Meinung nach gibt es aus Sicht der Anwendungsprogrammierung keinen Unterschied zwischen diesen beiden Konzepten, und es ist verwirrend, zwei Wörter zu haben, um Verwirrung zu stiften. Ich denke, Thread-Interleaving wurde eingeführt, um die Multicore-Verarbeitung zu simulieren, als Multicore noch keine Möglichkeit darstellte. Warum haben wir ein Wort für diese veraltete Denkweise?

Mason Wheeler und Penguin haben die gleiche Antwort gegeben. Ein Core mit Task Switching und / oder Multicore ist gleichzeitig, streng multicore = parallel.

Ich bin der Meinung, dass diese beiden Begriffe in einem zusammengefasst werden sollten, und ich bemühe mich zu vermeiden, "gleichzeitig" zu sagen. Ich denke, auf der OS-Programmierebene ist die Unterscheidung wichtig, aber aus der Sicht des Anwendungsprogrammierers ist es nicht allzu wichtig. Ich habe mapReduce, Spark, MPI, cuda, openCL und multithreaded c ++ geschrieben und musste nie anhalten und überlegen, ob der Job mit verschachtelten Threads oder mit mehreren Kernen ausgeführt wird.

Wenn ich zum Beispiel Multithread-C ++ schreibe, bin ich manchmal nicht sicher, wie viele Kerne ich bekommen werde, obwohl es Möglichkeiten gibt, Anforderungen an die Anzahl der Kerne zu stellen, wie hier beschrieben https://stackoverflow.com/questions/2166425/ wie-man-eine-ac-anwendung-strukturiert-benutzt-einen-multicore-prozessor . Im Funken mache ich einfach Map- und Reduktionsoperationen und habe keine Ahnung, wie der JVM sie auf der Hardware-Ebene handhabt. An GPUs denke ichJeder Thread ist einem eigenen einfachen Prozessor zugeordnet, aber ich synchronisiere meine Threads immer, wenn ein Problem auftritt. Mit MPI wird die Kommunikation zwischen Maschinen explizit spezifiziert, aber wir könnten die Funktionen, die auf mehreren Maschinen ausgeführt werden, auf einem einzigen Kern verschachteln und die Ergebnisse über eine entsprechende Einzelthread-Funktion kombinieren. Und was ist, wenn wir MPI verwenden, um eine Reihe von Single-Core-Maschinen zu koordinieren, jede mit Multithreading? Welchen Unterschied macht es? Ich würde keine sagen. Nenne es alles "parallel" und sei fertig damit.

Julian Cienfuegos
quelle
2
Die Unterscheidung ist bis heute relevant. Sie können nur bis zur Anzahl der CPU-Kerne parallel arbeiten, über die Ihre Hardware verfügt. In vielen Programmen werden jedoch Hunderte von Berechnungen gleichzeitig ausgeführt, viel mehr als in der Hardware. Wenn diese Unterscheidung nicht verstanden wird, können Programmierer möglicherweise nicht verstehen, warum ihre parallelisierten Programme langsamer ausgeführt werden als ihre Single-Thread-Version (oder eine geringe Anzahl von Threads).
Lie Ryan