Was ist der Unterschied zwischen gleichzeitiger und paralleler Programmierung?


346

Was ist der Unterschied zwischen gleichzeitiger und paralleler Programmierung? Ich habe Google gefragt, aber nichts gefunden, was mir geholfen hätte, diesen Unterschied zu verstehen. Können Sie mir ein Beispiel für beide geben?

Im Moment habe ich diese Erklärung gefunden: http://www.linux-mag.com/id/7411 - aber "Parallelität ist eine Eigenschaft des Programms" vs "Parallele Ausführung ist eine Eigenschaft der Maschine" reicht mir nicht aus - Ich kann immer noch nicht sagen, was was ist.


Antworten:


310

Wenn Ihr Programm Threads verwendet (gleichzeitige Programmierung), wird es nicht unbedingt als solches ausgeführt (parallele Ausführung), da dies davon abhängt, ob der Computer mehrere Threads verarbeiten kann.

Hier ist ein visuelles Beispiel. Gewinde auf einer Maschine ohne Gewinde :

        --  --  --
     /              \
>---- --  --  --  -- ---->>

Gewinde auf einer Gewindemaschine :

     ------
    /      \
>-------------->>

Die Bindestriche stehen für ausgeführten Code. Wie Sie sehen können, werden beide getrennt aufgeteilt und ausgeführt, aber die Gewindemaschine kann mehrere separate Teile gleichzeitig ausführen.


34
Parallele Ausführung und parallele Programmierung sind nicht dasselbe. Die Antwort von Jon Harrop ist richtig. Die Frage selbst scheint jedoch die parallele Ausführung und die parallele Programmierung zu verwechseln.
Blaisorblade

3
Die Fähigkeit, Threads parallel auszuführen, hängt nicht nur von der Maschine ab. Beispielsweise führt OCaml (und Python?) Threads gleichzeitig, jedoch nicht parallel aus, da der Garbage Collector global gesperrt ist.
Jon Harrop

1
Parallele Programmierung ist laut diesem Blog keine Teilmenge der gleichzeitigen Programmierung . Ihre Antwort berücksichtigt das nicht. Was halten Sie von dieser Aussage?
Kevin

1
@ Kevin: Ich denke, "allgemeiner" bedeutet Obermenge. Ich stimme zu, dass es falsch ist.
Jon Harrop

1
Diese Antwort ist gut geeignet, um den Unterschied zwischen gleichzeitiger und paralleler Ausführung zu veranschaulichen, nicht jedoch für die ursprüngliche Frage des Posters zur Programmierung .
Reorx

396

Gleichzeitige Programmierungbetrifft Operationen, die sich zu überschneiden scheinen, und befasst sich hauptsächlich mit der Komplexität, die sich aus dem nicht deterministischen Kontrollfluss ergibt. Die quantitativen Kosten, die mit gleichzeitigen Programmen verbunden sind, sind typischerweise sowohl Durchsatz als auch Latenz. Gleichzeitige Programme sind häufig E / A-gebunden, jedoch nicht immer, z. B. befinden sich gleichzeitige Garbage Collectors vollständig auf der CPU. Das pädagogische Beispiel eines gleichzeitigen Programms ist ein Webcrawler. Dieses Programm initiiert Anforderungen für Webseiten und akzeptiert die Antworten gleichzeitig, sobald die Ergebnisse der Downloads verfügbar sind, und sammelt eine Reihe von Seiten, die bereits besucht wurden. Der Kontrollfluss ist nicht deterministisch, da die Antworten nicht jedes Mal, wenn das Programm ausgeführt wird, in derselben Reihenfolge empfangen werden müssen. Diese Eigenschaft kann das Debuggen gleichzeitiger Programme sehr erschweren.Erlang , asynchrone F # -Workflows und die Akka- Bibliothek von Scala sind möglicherweise die vielversprechendsten Ansätze für eine hochkonkurrierende Programmierung.

Multicore-Programmierungist ein Sonderfall der parallelen Programmierung. Die parallele Programmierung betrifft Vorgänge, die sich für das spezifische Ziel der Verbesserung des Durchsatzes überlappen. Die Schwierigkeiten der gleichzeitigen Programmierung werden umgangen, indem der Kontrollfluss deterministisch gemacht wird. In der Regel erzeugen Programme Sätze von untergeordneten Aufgaben, die parallel ausgeführt werden, und die übergeordnete Aufgabe wird erst fortgesetzt, wenn jede Unteraufgabe abgeschlossen ist. Dies macht das Debuggen paralleler Programme viel einfacher als gleichzeitige Programme. Der schwierige Teil der parallelen Programmierung ist die Leistungsoptimierung in Bezug auf Themen wie Granularität und Kommunikation. Letzteres ist im Zusammenhang mit Multicores immer noch ein Problem, da mit der Übertragung von Daten von einem Cache in einen anderen erhebliche Kosten verbunden sind.Cilk ist möglicherweise der vielversprechendste Ansatz für die leistungsstarke parallele Programmierung auf Multicores und wurde sowohl in Intels Threaded Building Blocks als auch in Microsofts Task Parallel Library (in .NET 4) übernommen.


18
"Der schwierige Teil der parallelen Programmierung ... wie Granularität und Kommunikation." Wenn parallele Aufgaben kommunizieren müssen, werden sie dann nicht gleichzeitig ausgeführt?
Justin M. Keyes

13
"Wenn parallele Aufgaben kommunizieren müssen, werden sie dann nicht gleichzeitig ausgeführt?" Wow, tolle Frage! Nicht unbedingt, nein. Supercomputer werden häufig mit Massenparalleloperationen programmiert, gefolgt von einer globalen Umverteilung von Daten und einer größeren Massenparallelität. Es gibt also Parallelität und Kommunikation, aber keine wirkliche Parallelität. In diesem Zusammenhang habe ich mehr an Multicore-Parallelität gedacht, bei der Kommunikation Cache-Komplexität bedeutet, z. B. Kommunikation, die für die Cache-Kohärenz erforderlich ist. Obwohl dies gleichzeitig geschieht, ist es auch nicht direkt sichtbar.
Jon Harrop

43
@BoppityBop Nur weil ich in einer Zeichnung sagen kann, was er in einem Roman gesagt hat, ist meine Antwort nicht weniger richtig. Einfacher zu lesen für diejenigen, die die Antwort eigentlich nicht kennen. Was ich denke, ist der Punkt, hierher zu kommen. Sie können ein Buch in der Sprache schreiben, die in diesem Beitrag verwendet wird, aber das wird für die meisten Leser absolut unangenehm sein, da Sie diese Frage wahrscheinlich nicht googelt haben, wenn Sie bereits die Hälfte von dem wissen, was Jon geschrieben hat.
Tor Valamo

18
Das Bild war sehr hilfreich für mich, jemanden, der ziemlich neu im Thema ist, und die Beschreibung von @JonHarrop war nützlich für mich, jemanden, der die korrekte, wenn auch technische Sprache schätzt. Beide Antworten trugen zu meinem umfassenderen Verständnis bei. Wir alle gewinnen! (obwohl ich die Unterscheidung zwischen paralleler Ausführung und paralleler Programmierung sehr
schätze

3
"Erlang ist vielleicht die vielversprechendste kommende Sprache ...". Interessante Wortwahl, da Erlang ~ 30 Jahre alt ist und 1998 aus offenen
Quellen

151

https://joearms.github.io/published/2013-04-05-concurrent-and-parallel-programming.html

Gleichzeitig = Zwei Warteschlangen und eine Kaffeemaschine.

Parallel = Zwei Warteschlangen und zwei Kaffeemaschinen.


9
Falsch und irreführend. Gleichzeitig = Zulassen einer oder mehrerer Warteschlangen (nicht deterministische Zusammensetzung). Parallel = mehr als eine Warteschlange haben, um eine von ihnen kürzer als die ursprüngliche zu machen, wenn sie nicht leer ist (asymptotische Effizienz).
FrankHB

Gleichzeitiger Code erfordert zwei oder mehr Prozessoren (oder "Kaffeemaschinen"). Somit ist diese Antwort im Wesentlichen falsch.
Geoffrey Anderson

6
@GeoffreyAnderson Nein, tut es nicht. Beispielsweise werden Threads und Prozesse gleichzeitig auf einem einzelnen Kerncomputer ausgeführt.
Jon Harrop

@FrankHB - Bitte schauen Sie sich stackoverflow.com/a/57223044/1406510 an und schauen Sie sich den Quelllink an - auf der Oracle-Website - Es kann also nicht falsch sein, aber unser Verständnis kann es sein. Also Zeit zum Umdenken. Ich habe meine Ansicht geändert, nachdem ich das gelesen hatte.
Nanosoft

@GeoffreyAnderson - Bitte schauen Sie sich stackoverflow.com/a/57223044/1406510 an. Es enthält einen Link von Orakel und gibt klar an, was was ist. Also müssen wir uns darauf ausrichten.
Nanosoft

40

Interpretation der ursprünglichen Frage als parallele / gleichzeitige Berechnung anstelle von Programmierung .

Bei der gleichzeitigen Berechnung werden zwei Berechnungen unabhängig voneinander ausgeführt. Die zweite Berechnung muss nicht warten, bis die erste abgeschlossen ist, um fortzufahren. Es wird jedoch nicht angegeben, wie dies erreicht wird. Beim Single-Core-Setup ist das Anhalten und Wechseln zwischen Threads erforderlich (auch als präventives Multithreading bezeichnet).

Bei der parallelen Berechnung werden zwei Berechnungen gleichzeitig ausgeführt - das heißt buchstäblich gleichzeitig. Dies ist mit einer einzelnen CPU nicht möglich und erfordert stattdessen ein Multi-Core-Setup.

Bilder aus dem Artikel: "Parallel vs Concurrent in Node.js"

suspendieren und abwechseln gegen paralleles Rechnen



21

Ich glaube, dass die gleichzeitige Programmierung sich auf Multithread-Programmierung bezieht, bei der Ihr Programm mehrere Threads ausführen darf, die von Hardwaredetails abstrahiert sind.

Parallele Programmierung bezieht sich auf das spezifische Entwerfen Ihrer Programmalgorithmen, um die verfügbare parallele Ausführung zu nutzen. Beispielsweise können Sie zwei Zweige einiger Algorithmen parallel ausführen, in der Erwartung, dass das Ergebnis früher (im Durchschnitt) erreicht wird, als wenn Sie zuerst den ersten und dann den zweiten Zweig überprüft hätten.


2
Anders ausgedrückt: Wenn Sie zwei Dinge parallel ausführen, können Sie sie doppelt so schnell erledigen. Das gleichzeitige Ausführen von zwei Dingen kann immer noch genauso lange dauern wie das erste und dann das andere, wenn zwischen dem Ausführen eines Teils des ersten und eines Teils des zweiten usw. nur eine CPU-Zeiteinteilung erfolgt.
user189169

14

Ich habe diesen Inhalt in einem Blog gefunden. Ich dachte, es ist nützlich und relevant.

Parallelität und Parallelität sind NICHT dasselbe. Zwei Aufgaben T1 und T2 sind gleichzeitig, wenn die Reihenfolge, in der die beiden Aufgaben rechtzeitig ausgeführt werden, nicht vorbestimmt ist.

T1 kann ausgeführt und beendet werden, bevor T2, T2 kann ausgeführt und beendet werden, bevor T1, T1 und T2 gleichzeitig ausgeführt werden können (Parallelität), T1 und T2 können alternativ ausgeführt werden, ... Wenn zwei Threads gleichzeitig ausgeführt werden Wenn das Betriebssystem die Ausführung auf einem Single-Core-Nicht-SMT-Nicht-CMP-Prozessor plant, erhalten Sie möglicherweise Parallelität, jedoch keine Parallelität. Parallelität ist auf Multi-Core-, Multi-Prozessor- oder verteilten Systemen möglich.

Parallelität wird oft als Eigenschaft eines Programms bezeichnet und ist ein allgemeineres Konzept als Parallelität.

Quelle: https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


9

Es sind zwei Sätze, die dasselbe aus (sehr geringfügig) unterschiedlichen Blickwinkeln beschreiben. Parallele Programmierung beschreibt die Situation aus Sicht der Hardware - es gibt mindestens zwei Prozessoren (möglicherweise innerhalb eines einzelnen physischen Pakets), die parallel an einem Problem arbeiten. Die gleichzeitige Programmierung beschreibt die Dinge aus Sicht der Software genauer - zwei oder mehr Aktionen können genau gleichzeitig (gleichzeitig) ausgeführt werden.

Das Problem hierbei ist, dass die Leute versuchen, die beiden Sätze zu verwenden, um eine klare Unterscheidung zu treffen, wenn keiner wirklich existiert. Die Realität ist, dass die Trennlinie, die sie zu ziehen versuchen, seit Jahrzehnten verschwommen und undeutlich ist und im Laufe der Zeit immer undeutlicher geworden ist.

Was sie zu diskutieren versuchen, ist die Tatsache, dass die meisten Computer einst nur eine einzige CPU hatten. Wenn Sie mehrere Prozesse (oder Threads) auf dieser einzelnen CPU ausgeführt haben, hat die CPU jeweils nur einen Befehl von einem dieser Threads ausgeführt. Das Auftreten von Parallelität war eine Illusion - die CPU wechselte schnell genug zwischen der Ausführung von Anweisungen aus verschiedenen Threads, so dass es für die menschliche Wahrnehmung (für die weniger als 100 ms oder so augenblicklich aussehen) so aussah, als würde sie viele Dinge gleichzeitig tun.

Der offensichtliche Gegensatz dazu ist ein Computer mit mehreren CPUs oder eine CPU mit mehreren Kernen, sodass der Computer Anweisungen von mehreren Threads und / oder Prozessen genau zur gleichen Zeit ausführt. Code, der eines ausführt, kann / hat keinen Einfluss auf den Code, der im anderen ausgeführt wird.

Nun das Problem: Eine so klare Unterscheidung hat es so gut wie nie gegeben. Computerdesigner sind eigentlich ziemlich intelligent, daher haben sie vor langer Zeit festgestellt, dass (zum Beispiel) das Lesen einiger Daten von einem E / A-Gerät wie einer Festplatte (in Bezug auf CPU-Zyklen) lange gedauert hat Fertig. Anstatt die CPU währenddessen im Leerlauf zu lassen, haben sie verschiedene Möglichkeiten gefunden, wie ein Prozess / Thread eine E / A-Anforderung ausführen und Code von einem anderen Prozess / Thread auf der CPU ausführen kann, während die E / A-Anforderung abgeschlossen ist.

Lange bevor Multi-Core-CPUs zur Norm wurden, wurden Operationen von mehreren Threads parallel ausgeführt.

Das ist allerdings nur die Spitze des Eisbergs. Vor Jahrzehnten haben Computer begonnen, auch eine andere Ebene der Parallelität bereitzustellen. Als ziemlich intelligente Leute stellten Computerdesigner wieder fest, dass sie in vielen Fällen Anweisungen hatten, die sich nicht gegenseitig beeinflussten, so dass es möglich war, mehr als eine Anweisung aus demselben Stream gleichzeitig auszuführen. Ein frühes Beispiel, das ziemlich bekannt wurde, war der Control Data 6600. Dies war (mit ziemlich großem Abstand) der schnellste Computer der Welt, als er 1964 eingeführt wurde - und ein Großteil der gleichen grundlegenden Architektur wird heute noch verwendet. Es verfolgte die von jedem Befehl verwendeten Ressourcen und verfügte über eine Reihe von Ausführungseinheiten, die Befehle ausführten, sobald die Ressourcen verfügbar wurden, von denen sie abhingen. Dies war dem Design der neuesten Intel / AMD-Prozessoren sehr ähnlich.

Aber (wie die Werbespots sagten) warten - das ist noch nicht alles. Es gibt noch ein weiteres Designelement, das noch mehr Verwirrung stiftet. Es wurden einige verschiedene Namen vergeben (z. B. "Hyperthreading", "SMT", "CMP"), aber alle beziehen sich auf dieselbe Grundidee: eine CPU, die mehrere Threads gleichzeitig ausführen kann, wobei eine Kombination einiger Ressourcen verwendet wird sind für jeden Thread unabhängig und einige Ressourcen, die von den Threads gemeinsam genutzt werden. In einem typischen Fall wird dies mit der oben beschriebenen Parallelität auf Befehlsebene kombiniert. Dazu haben wir zwei (oder mehr) Sätze von Architekturregistern. Dann haben wir eine Reihe von Ausführungseinheiten, die Anweisungen ausführen können, sobald die erforderlichen Ressourcen verfügbar sind.

Dann kommen wir natürlich zu modernen Systemen mit mehreren Kernen. Hier liegen die Dinge auf der Hand, oder? Wir haben N (im Moment zwischen 2 und 256 oder so) separate Kerne, die alle gleichzeitig Befehle ausführen können. Wir haben also einen eindeutigen Fall von echter Parallelität - das Ausführen von Befehlen in einem Prozess / Thread funktioniert nicht. t Auswirkungen auf die Ausführung von Anweisungen in einem anderen.

Naja, so ungefähr. Selbst hier haben wir einige unabhängige Ressourcen (Register, Ausführungseinheiten, mindestens eine Cache-Ebene) und einige gemeinsam genutzte Ressourcen (normalerweise mindestens die niedrigste Cache-Ebene und definitiv die Speichercontroller und die Bandbreite zum Speicher).

Zusammenfassend lässt sich sagen, dass die einfachen Szenarien, die Menschen gerne zwischen gemeinsam genutzten Ressourcen und unabhängigen Ressourcen kontrastieren, im wirklichen Leben praktisch nie vorkommen. Wenn alle Ressourcen gemeinsam genutzt werden, erhalten wir so etwas wie MS-DOS, bei dem wir jeweils nur ein Programm ausführen können, und wir müssen die Ausführung eines Programms beenden, bevor wir das andere überhaupt ausführen können. Mit völlig unabhängigen Ressourcen haben wir N Computer, auf denen MS-DOS ausgeführt wird (ohne ein Netzwerk, um sie zu verbinden), ohne dass sie überhaupt etwas zwischen ihnen teilen können (denn wenn wir überhaupt eine Datei teilen können, ist das eine gemeinsam genutzte Ressource, a Verletzung der Grundvoraussetzung, dass nichts geteilt wird).

Jeder interessante Fall beinhaltet eine Kombination aus unabhängigen Ressourcen und gemeinsam genutzten Ressourcen. Jeder einigermaßen moderne Computer (und viele, die überhaupt nicht modern sind) hat zumindest die Fähigkeit, mindestens einige unabhängige Operationen gleichzeitig auszuführen, und fast alles, was anspruchsvoller ist als MS-DOS, hat dies zumindest ausgenutzt einem gewissen Grad.

Die schöne, saubere Trennung zwischen "gleichzeitig" und "parallel", die die Leute gerne zeichnen, existiert einfach nicht und hat es fast nie gegeben. Was Menschen gerne als "gleichzeitig" klassifizieren, beinhaltet normalerweise immer noch mindestens eine und oft mehrere verschiedene Arten der parallelen Ausführung. Was sie gerne als "parallel" klassifizieren, besteht häufig darin, Ressourcen gemeinsam zu nutzen und (zum Beispiel) einen Prozess die Ausführung eines anderen zu blockieren, während eine Ressource verwendet wird, die von beiden gemeinsam genutzt wird.

Menschen, die versuchen, klar zwischen "parallel" und "gleichzeitig" zu unterscheiden, leben in einer Fantasie von Computern, die es eigentlich nie gab.


6
  • Concurrent programmingbezieht sich im Allgemeinen auf Umgebungen, in denen die von uns definierten Aufgaben in beliebiger Reihenfolge ausgeführt werden können. Eine Aufgabe kann vor oder nach einer anderen auftreten, und einige oder alle Aufgaben können gleichzeitig ausgeführt werden.

  • Parallel programmingbezieht sich speziell auf die gleichzeitige Ausführung von gleichzeitigen Aufgaben auf verschiedenen Prozessoren. Somit ist jede parallele Programmierung gleichzeitig, aber nicht jede gleichzeitige Programmierung ist parallel.

Quelle: PThreads Programming - Ein POSIX-Standard für eine bessere Mehrfachverarbeitung, Buttlar, Farrell, Nichols


5

Bei der Programmierung ist Parallelität die Zusammensetzung von unabhängig ausgeführten Prozessen, während Parallelität die gleichzeitige Ausführung von (möglicherweise verwandten) Berechnungen ist.
- Andrew Gerrand -

Und

Parallelität ist die Zusammensetzung der unabhängig ausgeführten Berechnungen. Parallelität ist eine Möglichkeit, Software zu strukturieren, insbesondere um sauberen Code zu schreiben, der gut mit der realen Welt interagiert. Es ist keine Parallelität.

Parallelität ist keine Parallelität, obwohl sie Parallelität ermöglicht. Wenn Sie nur einen Prozessor haben, kann Ihr Programm zwar gleichzeitig, aber nicht parallel sein. Andererseits kann ein gut geschriebenes gleichzeitiges Programm auf einem Multiprozessor effizient parallel ausgeführt werden. Diese Eigenschaft könnte wichtig sein ...
- Rob Pike -

Um den Unterschied zu verstehen, empfehle ich dringend, das Video von Rob Pike (einem der Golang-Schöpfer) zu sehen. Parallelität ist keine Parallelität


Der Vimeo-Link funktioniert hier nicht. Der Youtube-Link youtube.com/watch?v=cN_DpYBzKso
Shivprasad Koirala

5

Parallele Programmierung findet statt, wenn Code gleichzeitig ausgeführt wird und jede Ausführung unabhängig von der anderen ist. Daher gibt es normalerweise keine Besorgnis über gemeinsam genutzte Variablen und dergleichen, da dies wahrscheinlich nicht passieren wird.

Die gleichzeitige Programmierung besteht jedoch darin, dass Code von verschiedenen Prozessen / Threads ausgeführt wird, die Variablen gemeinsam nutzen. Daher müssen wir bei der gleichzeitigen Programmierung eine Regel festlegen, um zu entscheiden, welcher Prozess / Thread zuerst ausgeführt wird. Wir möchten dies, damit wir dort sicher sein können wird Konsistenz sein und dass wir mit Sicherheit wissen können, was passieren wird. Wenn es kein Steuerelement gibt und alle Threads gleichzeitig rechnen und Dinge in denselben Variablen speichern, wie würden wir dann wissen, was am Ende zu erwarten ist? Vielleicht ist ein Thread schneller als der andere, vielleicht hat einer der Threads sogar mitten in seiner Ausführung angehalten und ein anderer hat eine andere Berechnung mit einer beschädigten (noch nicht vollständig berechneten) Variablen fortgesetzt. Die Möglichkeiten sind endlos. In diesen Situationen verwenden wir normalerweise die gleichzeitige Programmierung anstelle der parallelen.


5

Die klassische Planung von Aufgaben kann seriell , parallel oder gleichzeitig erfolgen .

  • Seriell : Aufgaben müssen nacheinander in einer bekannten Trickreihenfolge ausgeführt werden, sonst funktioniert es nicht. Leicht genug.

  • Parallel : Aufgaben müssen gleichzeitig ausgeführt werden, sonst funktioniert es nicht.

    • Jeder Ausfall einer der Aufgaben - funktional oder rechtzeitig - führt zu einem vollständigen Systemausfall.
    • Alle Aufgaben müssen ein gemeinsames, zuverlässiges Zeitgefühl haben.

    Versuchen Sie dies zu vermeiden, sonst haben wir Tränen bis zur Teezeit.

  • Gleichzeitig : Es ist uns egal. Wir sind jedoch nicht nachlässig: Wir haben es analysiert und es spielt keine Rolle; Wir können daher jede Aufgabe jederzeit mit jeder verfügbaren Einrichtung ausführen. Glückliche Tage.

Oft ändert sich die verfügbare Zeitplanung bei bekannten Ereignissen, die wir als Statusänderung bezeichnen.

Die Leute denken oft, dass es sich um Software handelt, aber es ist tatsächlich ein Systemdesignkonzept, das vor Computern erstellt wurde. Softwaresysteme haben sich nur langsam durchgesetzt, nur sehr wenige Softwaresprachen versuchen sogar, das Problem zu lösen. Sie könnten versuchen , die Transputer Sprache aufzublicken occam wenn Sie interessiert sind.

Kurz gesagt, das Systemdesign befasst sich mit Folgendem:

  • das Verb - was Sie tun (Operation oder Algorithmus)
  • das Substantiv - was Sie damit machen (Daten oder Schnittstelle)
  • Wann - Initiierung, Zeitplan, Statusänderungen
  • wie - seriell, parallel, gleichzeitig
  • wo - sobald Sie wissen, wann Dinge passieren, können Sie sagen, wo sie passieren können und nicht vorher.
  • warum - ist das der Weg, es zu tun? Gibt es andere und vor allem bessere Wege? Was passiert, wenn Sie es nicht tun?

Viel Glück.


8
Ich sehe überall Kappen
Bruno Penteado

10
Diese Antwort ist komplizierter als die Themen Parallelität und Parallelität zusammen.
Kai Sellgren

3

Ich verstand den Unterschied als:

1) Gleichzeitiges Ausführen zusammen mit gemeinsam genutzten Ressourcen 2) Paralleles Ausführen nebeneinander mit unterschiedlichen Ressourcen

Sie können also zwei Dinge gleichzeitig unabhängig voneinander geschehen lassen, selbst wenn sie an den Punkten (2) zusammenkommen oder wenn zwei Dinge während der ausgeführten Operationen auf dieselben Reserven zurückgreifen (1).


3

Obwohl es keine vollständige Übereinstimmung über die Unterscheidung zwischen den Begriffen parallel und gleichzeitig gibt , machen viele Autoren die folgenden Unterscheidungen:

  • Beim gleichzeitigen Rechnen ist ein Programm eines, bei dem mehrere Aufgaben gleichzeitig ausgeführt werden können.
  • Beim parallelen Rechnen ist ein Programm eines, bei dem mehrere Aufgaben eng zusammenarbeiten, um ein Problem zu lösen.

Parallele Programme sind also gleichzeitig, aber ein Programm wie ein Multitasking-Betriebssystem ist auch gleichzeitig verfügbar, selbst wenn es auf einem Computer mit nur einem Kern ausgeführt wird, da mehrere Aufgaben gleichzeitig ausgeführt werden können.

Quelle : Eine Einführung in die parallele Programmierung, Peter Pacheco


1

Concurrency und Parallelism Quelle

In einem Multithread-Prozess auf einem einzelnen Prozessor kann der Prozessor Ausführungsressourcen zwischen Threads wechseln, was zu einer gleichzeitigen Ausführung führt .

In demselben Multithread-Prozess in einer Multiprozessor-Umgebung mit gemeinsamem Speicher kann jeder Thread im Prozess gleichzeitig auf einem separaten Prozessor ausgeführt werden, was zu einer parallelen Ausführung führt .

Wenn der Prozess weniger oder so viele Threads hat, wie Prozessoren vorhanden sind, stellt das Thread-Unterstützungssystem in Verbindung mit der Betriebsumgebung sicher, dass jeder Thread auf einem anderen Prozessor ausgeführt wird.

Beispielsweise berechnet in einer Matrixmultiplikation mit der gleichen Anzahl von Threads und Prozessoren jeder Thread (und jeder Prozessor) eine Zeile des Ergebnisses.


Diese Quelle zeigt nur einen speziellen Fall der Implementierung - eine spezielle Form des Multithreading. Ja, es wird nicht einmal die ganze Geschichte des Multithreading behandelt, z. B. das M: N-User-Space-Threading-Modell und die Rolle der Thread-Planung. Threading ist nur eine spezielle Art der Implementierung im Sinne der Systemarchitektur (Betriebssystem, VM, CPU mit aktiviertem HT usw.) und / oder der Programmierschnittstelle. Es gibt mehr, wie Parallelität auf Befehlsebene bei der Implementierung einer modernen CPU, die keine Programmierschnittstelle bereitstellt und nichts mit Threads zu tun hat.
FrankHB

@FrankHB: Ich würde mich freuen, wenn Sie authentische Links zu Ihren Inhalten teilen können. Ich würde wirklich gerne erkunden, ob mehr dahinter steckt. Mein derzeitiges Verständnis ist recht simpel: Das Ausführen einer Multithread-App auf einer bestimmten Betriebssystemarchitektur mit einem bestimmten Thread-Planungsmechanismus ist parallel oder gleichzeitig die Frage? Selbst wenn Sie den M: N-Benutzerbereich angegeben haben - Wie erkennen Sie, dass der RUN parallel oder gleichzeitig ausgeführt wird?
Nanosoft

Ich habe eine Antwort geschrieben , um die Probleme in verschiedenen Abstraktionen zu diskutieren.
FrankHB

Das Ausführen einer Multithread-App ist im Vergleich zur grundlegenden Abstraktion recht komplex, da "Ausführen" eine allgemeine Aktion ist, die für viele Abstraktionen geeignet ist. Es gibt viele Details, die durch das Threading-Modell in der Implementierung (normalerweise sowohl die Sprachspezifikation als auch die Sprachlaufzeit-Implementierung, die zum Programmieren der App verwendet wird) für die grundlegende Abstraktion ergänzt wurden.
FrankHB

0

Unterschiedliche Menschen sprechen in vielen verschiedenen Fällen über unterschiedliche Arten von Parallelität und Parallelität. Daher sind einige Abstraktionen erforderlich, um ihre gemeinsame Natur abzudecken.

Die grundlegende Abstraktion erfolgt in der Informatik, wo sowohl Parallelität als auch Parallelität den Eigenschaften von Programmen zugeschrieben werden . Hier sind Programme formalisierte Beschreibungen des Rechnens. Solche Programme müssen nicht in einer bestimmten Sprache oder Codierung vorliegen, die implementierungsspezifisch ist. Die Existenz von API / ABI / ISA / OS ist für eine solche Abstraktionsebene irrelevant. Sicherlich wird man detailliertere implementierungsspezifische Kenntnisse (wie das Threading-Modell) benötigen, um konkrete Programmierarbeiten durchzuführen. Der Geist hinter der grundlegenden Abstraktion wird nicht geändert.

Eine zweite wichtige Tatsache ist, dass Parallelität und Parallelität in vielen verschiedenen Abstraktionen nebeneinander existieren können .

Zur allgemeinen Unterscheidung siehe die entsprechende Antwort für die grundlegende Ansicht von Parallelität gegen Parallelität. (Es gibt auch einige Links, die einige zusätzliche Quellen enthalten.)

Gleichzeitige Programmierung und parallele Programmierung sind Techniken, um solche allgemeinen Eigenschaften bei einigen Systemen zu implementieren, die die Programmierbarkeit offenbaren. Die Systeme sind normalerweise Programmiersprachen und deren Implementierungen.

Eine Programmiersprache kann die beabsichtigten Eigenschaften durch integrierte semantische Regeln verfügbar machen. In den meisten Fällen spezifizieren solche Regeln die Bewertungen bestimmter Sprachstrukturen (z. B. Ausdrücke), wodurch die Berechnung effektiv gleichzeitig oder parallel erfolgt. (Insbesondere können die durch die Bewertungen implizierten Recheneffekte diese Eigenschaften perfekt widerspiegeln.) Die Semantik der gleichzeitigen / parallelen Sprache ist jedoch im Wesentlichen komplex und für praktische Arbeiten nicht erforderlich (um effiziente gleichzeitige / parallele Algorithmen als Lösung realistischer Probleme zu implementieren ). Daher verfolgen die meisten traditionellen Sprachen einen konservativeren und einfacheren Ansatz: Nehmen Sie die Semantik der Bewertung vollständig sequentiell und seriell an und stellen Sie dann optionale Grundelemente bereit, um einige zuzulassender Berechnungen sind gleichzeitig und parallel. Diese Grundelemente können Schlüsselwörter oder prozedurale Konstrukte ("Funktionen") sein, die von der Sprache unterstützt werden. Sie werden basierend auf der Interaktion mit gehosteten Umgebungen (Betriebssystem oder "Bare-Metal" -Hardwareschnittstelle) implementiert, die normalerweise für die Sprache undurchsichtig sind (nicht portabel abgeleitet werden können). Daher ist in dieser speziellen Art von Abstraktionen auf hoher Ebene, die von den Programmierern gesehen werden, nichts gleichzeitig / parallel außer diesen "magischen" Grundelementen und Programmen, die auf diesen Grundelementen beruhen; Die Programmierer können dann weniger fehleranfällige Programmiererfahrungen machen, wenn die Parallelitäts- / Parallelitätseigenschaften nicht so interessiert sind.

Obwohl Primitive den Komplex in den Abstraktionen auf höchster Ebene abstrahieren, weisen die Implementierungen immer noch die zusätzliche Komplexität auf, die durch das Sprachmerkmal nicht offengelegt wird. Daher sind einige Abstraktionen auf mittlerer Ebene erforderlich. Ein typisches Beispiel ist das Einfädeln . Threading ermöglicht einen oder mehrere Ausführungsthreads (oder einfach Threads ; manchmal wird es auch als Prozess bezeichnet , was nicht unbedingt das Konzept einer in einem Betriebssystem geplanten Aufgabe ist), die von der Sprachimplementierung (der Laufzeit) unterstützt werden. Threads werden normalerweise präventiv zur Laufzeit geplant, sodass ein Thread nichts über andere Threads wissen muss. Daher ist es für Threads selbstverständlich, Parallelität zu implementieren, solange sie nichts gemeinsam nutzen (die kritischen Ressourcen)): Zerlegen Sie einfach Berechnungen in verschiedenen Threads. Sobald die zugrunde liegende Implementierung die Überlappung der Berechnungsressourcen während der Ausführung zulässt, funktioniert sie. Threads unterliegen auch gleichzeitigen Zugriffen auf gemeinsam genutzte Ressourcen: Nur der Zugriff auf Ressourcen in beliebiger Reihenfolge erfüllt die vom Algorithmus geforderten Mindestbeschränkungen, und die Implementierung bestimmt schließlich, wann auf sie zugegriffen werden soll. In solchen Fällen können einige Synchronisationsvorgänge erforderlich sein. Einige Sprachen behandeln Threading- und Synchronisationsoperationen als Teile der Abstraktion auf hoher Ebene und machen sie als Grundelemente verfügbar, während andere Sprachen stattdessen nur relativ übergeordnete Grundelemente (wie Futures / Versprechen ) fördern .

Unter der Ebene der sprachspezifischen Threads gibt es Multitasking der zugrunde liegenden Hosting-Umgebung (normalerweise ein Betriebssystem). Präemptives Multitasking auf Betriebssystemebene wird verwendet, um (präemptives) Multithreading zu implementieren. In einigen Umgebungen wie Windows NT sind die grundlegenden Planungseinheiten (die Aufgaben) ebenfalls "Threads". Um sie von der User-Space-Implementierung der oben genannten Threads zu unterscheiden, werden sie als Kernel-Threads bezeichnet, wobei "Kernel" den Kernel des Betriebssystems bedeutet (genau genommen gilt dies jedoch nicht ganz für Windows NT; der "echte" Kernel ist der NT Exekutive) . Kernel-Threads werden nicht immer 1: 1 den Userspace-Threads zugeordnet, obwohl die 1: 1-Zuordnung häufig den größten Aufwand für die Zuordnung reduziert. Da Kernel-Threads (mit Systemaufrufen) schwer zu erstellen / zu zerstören / zu kommunizieren sind,Grüne Threads im Benutzerbereich, um die Overhead-Probleme auf Kosten des Mapping-Overheads zu überwinden. Die Wahl der Zuordnung hängt vom Programmierparadigma ab, das in der Abstraktion auf hoher Ebene erwartet wird. Wenn beispielsweise eine große Anzahl von User-Space-Threads gleichzeitig ausgeführt werden soll (wie Erlang ), ist eine 1: 1-Zuordnung niemals möglich.

Das Betriebssystem-Multitasking basiert auf Multitasking auf ISA-Ebene, das vom logischen Kern des Prozessors bereitgestellt wird. Dies ist normalerweise die niedrigste öffentliche Schnittstelle für Programmierer. Unterhalb dieser Ebene kann SMT vorhanden sein . Dies ist eine Form von Multithreading auf niedrigerer Ebene, das von der Hardware implementiert wird, aber wahrscheinlich noch etwas programmierbar ist - obwohl es normalerweise nur für den Prozessorhersteller zugänglich ist. Beachten Sie, dass das Hardware-Design anscheinend Parallelität widerspiegelt, es jedoch auch einen gleichzeitigen Planungsmechanismus gibt, mit dem die internen Hardwareressourcen effizient genutzt werden können.

In jeder oben erwähnten Ebene des "Threading" sind sowohl Parallelität als auch Parallelität beteiligt. Obwohl sich die Programmierschnittstellen stark unterscheiden, unterliegen sie alle den Eigenschaften, die die grundlegende Abstraktion zu Beginn offenbart.


0

Teilen Sie einfach ein Beispiel, das die Unterscheidung hervorhebt:

Parallele Programmierung: Angenommen, Sie möchten den Merge-Sort-Algorithmus implementieren . Jedes Mal, wenn Sie das Problem in zwei Unterprobleme aufteilen, können Sie zwei Threads haben, die sie lösen. Um den Zusammenführungsschritt auszuführen, müssen Sie jedoch warten, bis diese beiden Threads abgeschlossen sind, da für das Zusammenführen beide Unterlösungen erforderlich sind. Dieses "obligatorische Warten" macht dies zu einem parallelen Programm.

Gleichzeitiges Programm: Angenommen, Sie möchten n Textdateien komprimieren und für jede eine komprimierte Datei erstellen. Sie können aus 2 (bis zu n) Threads bestehen, die jeweils eine Teilmenge der Dateien komprimieren. Wenn jeder Thread fertig ist, ist er einfach fertig, er muss nicht warten oder etwas anderes tun. Da also verschiedene Aufgaben in "beliebiger Reihenfolge" verschachtelt ausgeführt werden, ist das Programm gleichzeitig, aber nicht parallel.

Wie bereits erwähnt, ist jedes parallele Programm gleichzeitig (muss es tatsächlich sein), aber nicht umgekehrt.


0

Ich werde versuchen, es in meinem eigenen Stil zu erklären, es ist vielleicht nicht in Computerform, aber es gibt Ihnen die allgemeine Idee.

Nehmen wir ein Beispiel, sagen wir Hausarbeit: Geschirr putzen, Müll rausbringen, Rasen mähen usw. Wir haben auch 3 Leute (Fäden) A, B, C, die sie erledigen

Gleichzeitig: Die drei Personen starten unabhängig voneinander unterschiedliche Aufgaben, dh

A --> cleaning dishes
B --> taking out trash 
C --> mowing the lawn 

Hier ist die Reihenfolge der Aufgaben unbestimmt und die Antworten hängen vom Arbeitsaufwand ab

Parallel: Hier , wenn wir den Durchsatz können wir zuordnen mehrere Personen auf die einzige Aufgabe, zum Beispiel Reinigung von Geschirr verbessern wollen weisen wir zwei Leute, A Einseifen das Geschirr und B Waschen der Gerichte , die möglicherweise den Durchsatz verbessern.

Geschirr reinigen:

A --> soaping the dishes
B --> washing the dishes

bald

Hoffe das gibt eine Idee! Fahren Sie nun mit den technischen Begriffen fort, die in den anderen Antworten erläutert werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.