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:
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.
quelle
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.
quelle
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.
quelle
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"
gegen
quelle
In der Ansicht von einem Prozessor kann es durch dieses Bild beschrieben werden
In der Ansicht von einem Prozessor kann es durch dieses Bild beschrieben werden
quelle
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.
quelle
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
quelle
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.
quelle
Quelle: PThreads Programming - Ein POSIX-Standard für eine bessere Mehrfachverarbeitung, Buttlar, Farrell, Nichols
quelle
Und
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
quelle
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.
quelle
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.
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:
Viel Glück.
quelle
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).
quelle
Obwohl es keine vollständige Übereinstimmung über die Unterscheidung zwischen den Begriffen parallel und gleichzeitig gibt , machen viele Autoren die folgenden Unterscheidungen:
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
quelle
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.
quelle
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.
quelle
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.
quelle
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
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:
bald
Hoffe das gibt eine Idee! Fahren Sie nun mit den technischen Begriffen fort, die in den anderen Antworten erläutert werden.
quelle