Bei der gleichzeitigen Programmierung werden üblicherweise zwei Begriffe verwendet, nämlich gleichzeitig und parallel.
Einige Programmiersprachen wie Java fordern Unterstützung für parallele Programmierung .
Bedeutet dies, dass parallele und gleichzeitige Programmierung tatsächlich unterschiedlich sind?
terminology
parallel-computing
concurrency
nish1013
quelle
quelle
Antworten:
Aus "Sophomoric - Einführung in die Parallelität und Parallelität von gemeinsamem Speicher" von Dan Grossman (Version vom 16. November 2013)
quelle
Lassen Sie mich zusätzlich zu Nishs Antwort Simon Marlows Buch über parallele und gleichzeitige Programmierung in Haskell oder sein kürzeres Tutorial empfehlen . Sie beantworten Ihre erste Frage aus der Sicht von Haskell, sodass sie für theoretisch geneigte Leser besser geeignet sind (Haskell ist eine rein funktionale, faule Programmiersprache, die der Mathematik viel näher steht als andere Sprachen).
Zitat von dort:
Ich empfehle, den Rest des Tutorials zu lesen (S. 4), aber lassen Sie mich den Rest dieses Abschnitts zitieren, da er beide Programmierparadigmen mit quantitativen und qualitativen Merkmalen von Programmen wie Effizienz, Modularität und Determinismus verbindet.
quelle
Parallelität und Parallelität unterscheiden sich in den von ihnen gelösten und verursachten Problemen, sind jedoch nicht unabhängig voneinander.
Parallelität
Zwei Tasks gleichzeitig ausführen bedeutet, dass einzelne Schritte beider Tasks verschachtelt ausgeführt werden. Wenn Sie die Parallelität ignorieren, können Sie davon ausgehen, dass zu jedem Zeitpunkt nur eine Anweisung ausgeführt wird, Sie haben jedoch (a priori) keine Garantie, welche Task zum Ausführen des nächsten Schritts berechtigt ist.
Dies ist in gewisser Hinsicht nützlich:
Einige der wichtigsten Herausforderungen sind:
Parallelität
Ausführen von zwei Aufgaben parallel bedeutet , dass Anweisungen ausgeführt werden zur gleichen Zeit . Dies ist hauptsächlich nützlich für:
Zu den wichtigsten Herausforderungen gehören:
Siehe auch diese Frage zur Unterscheidung von parallelem und verteiltem Computing.
quelle
Eine etwas idealisierte Antwort, vielleicht ...
Parallelität ist eine Eigenschaft, wie ein Programm geschrieben wird . Wenn ein Programm mit Konstruktionen wie Forks / Joins, Sperren, Transaktionen, atomaren Compare-and-Swap-Operationen usw. geschrieben wird, erfolgt dies gleichzeitig.
Parallelismus ist eine Eigenschaft , wie ein Programm ausführt . Wenn ein Programm auf mehr als einer Recheneinheit gleichzeitig ausgeführt wird, wird es parallel ausgeführt.
quelle
Es gibt viele Antworten darauf, aber es kann verwirrend sein. Ich mag es so zu denken, und vielleicht hilft es ?:
Gleichzeitige Programmierung ist Code, der sich nicht um die Ausführungsreihenfolge kümmert. Java ist eine schlechte Sprache für die gleichzeitige Programmierung, aber es gibt Bibliotheken und Frameworks, die helfen. JavaScript ist eine hervorragende Sprache für die gleichzeitige Programmierung, und es ist oft schwierig, wenn Sie etwas schreiben möchten, das nicht gleichzeitig abläuft (z. B. wenn Sie die Ausführungsreihenfolge erzwingen möchten). Die gleichzeitige Programmierung eignet sich hervorragend für die ereignisgesteuerte Programmierung (wobei die Ausführungsreihenfolge von Ereignis-Listenern bestimmt wird, z. B. von Code, der in Ihrem Browser ausgeführt wird, wenn Sie auf eine Schaltfläche klicken oder in ein Feld eingeben).
Ein Beispiel wäre das Erstellen von hundert HTTP-Anforderungen. In NodeJS besteht die einfachste Lösung darin, alle 100 Anforderungen gleichzeitig mit einer Rückrufmethode zu öffnen. Wenn die Antworten zurückkommen, wird jedes Mal eine Methode ausgeführt. Das ist gleichzeitige Programmierung. In Ruby besteht die einfachste (häufigste) Lösung darin, eine Anfrage zu öffnen und die Antwort zu verarbeiten, die nächste Anfrage zu öffnen und die Antwort zu verarbeiten usw. Bei vielen Anfragen ist NodeJS schneller zu erledigen, obwohl dies erforderlich ist Vermeiden Sie es, den Server zu hämmern oder Ihre ausgehenden Verbindungen zu maximieren (aus Versehen einfach). Sie können den Ruby gleichzeitig schreiben, aber es ist nicht so, wie der meiste Ruby-Code geschrieben ist, und es tut ein wenig weh, es zu tun.
Parallele Programmierungist Code, der gleichzeitig in mehreren Threads oder Prozessen ausgeführt werden kann. Auf diese Weise können Sie die Leistung optimieren, indem Sie den Code auf mehreren CPUs ausführen (häufig auch auf mehreren Computern, wie Sie es bei Akka tun könnten). Da NodeJS nicht mit mehreren Threads arbeitet und keine parallele Ausführung stattfindet, müssen Sie sich keine Gedanken über das Schreiben von threadsicherem Code machen (und der meiste JavaScript-Code, den ich gesehen habe, ist nicht threadsicher). In Java ist die parallele Programmierung sehr stark integriert, auch wenn die Sprache die gleichzeitige Programmierung nicht zum normalen Muster macht, und Sie müssen sich häufig um die Thread-Sicherheit kümmern. Wenn Sie eine Website in Java schreiben, wird diese normalerweise in einem Container ausgeführt, der jede Anforderung in einem separaten Thread im selben Speicher ausführt.
Einige der oben genannten Punkte hängen vom Umfang und den Grenzen ab, über die Sie sprechen. Ich arbeite an Websites. Der meiste Java-Code, den ich sehe, ist keine gleichzeitige Programmierung. Sicher, wenn Sie ausreichend verkleinern, ist die Reihenfolge, in der die Kundenanforderungen eingehen, nicht wichtig. Wenn Sie jedoch weiter hineinzoomen, wird die Reihenfolge, in der die Dinge ausgeführt werden, durch den Code vorgegeben. Der Code ist jedoch so geschrieben, dass die Anforderungen parallel mit vielen gemeinsam genutzten Objekten ausgeführt werden können, die threadsicher sein müssen.
In der Zwischenzeit ist der meiste JavaScript-Code, den ich sehe, gleichzeitig: Er ist so geschrieben, dass die Ausführungsreihenfolge auf vielen Ebenen unwichtig ist. Es wurde jedoch nicht geschrieben, um die parallele Ausführung im gemeinsam genutzten Speicher zu unterstützen. Natürlich können Sie denselben Code über mehrere Prozesse hinweg parallel ausführen, aber die Objekte werden nicht gemeinsam genutzt, sodass es sich nicht um eine sinnvolle Parallelprogrammierung handelt.
Zum besseren Verständnis gefallen mir die Abbildungen in der oberen Antwort auf diese Frage hier: https://www.quora.com/Was- sind- die- Unterschiede- zwischen- paralleler- gleichzeitiger- und- asynchroner- Programmierung?
quelle