Gleichzeitiges Computer

Gleichzeitiges Computer ist eine Form von Computer in denen mehrere Berechnungen werden ausgeführt gleichzeitig- Überlappende Zeiträume - angeheim von der Reihe nach-mit einem, der vor dem nächsten beginnt.

Dies ist eine Eigenschaft eines Systems - ob a Programm, Computer, oder ein Netzwerk- Wo gibt es für jeden Prozess einen separaten Ausführungspunkt oder "Kontrollfaden". EIN gleichzeitiges System ist eine, bei der eine Berechnung voranschreiten kann, ohne auf alle anderen Berechnungen zu warten.[1]

Concurrent Computing ist eine Form von Modulare Programmierung. In seinem Paradigma Eine Gesamtberechnung ist berücksichtigt in Subcomputationen, die gleichzeitig ausgeführt werden können. Zu den Pionieren im Bereich des gleichzeitigen Computing gehören Edsger Dijkstra, Per Brinch Hansen, und WAGEN. Hoare.[2]

Einführung

Das Konzept des gleichzeitigen Computers ist häufig mit dem verwandten, aber unterschiedlichen Konzept von verwechselt Parallele Computing,[3][4] Obwohl beide als "Mehrere Prozesse ausgeführt werden können Im gleichen Zeitraum". In Parallele Computing tritt die Ausführung im selben physischen Augenblick auf: Zum Beispiel auf separat Prozessoren von a Mehrprozessor Maschine mit dem Ziel, Berechnungen zu beschleunigen - paralleles Computer ist bei a (ist unmöglichEin-Kern) Einzelprozessor, da zu jedem Zeitpunkt nur eine Berechnung auftreten kann (während eines einzelnen Taktzyklus).[a] Im Gegensatz dazu besteht das gleichzeitige Computing aus Prozess Lebensdauer Überlappung, aber die Ausführung muss im selben Moment nicht auftreten. Das Ziel hier ist es, Prozesse in der Außenwelt zu modellieren, die gleichzeitig auftreten, z. B. mehrere Clients, die gleichzeitig auf einen Server zugreifen. Die Strukturierung von Softwaresystemen, die aus mehreren gleichzeitigen gleichzeitigen Teilen bestehen, können nützlich sein, um die Komplexität zu bekämpfen, unabhängig davon, ob die Teile parallel ausgeführt werden können.[5]: 1

Zum Beispiel können gleichzeitige Prozesse auf einem Kern ausgeführt werden Zeitteilung Scheiben: Nur ein Vorgang läuft gleichzeitig, und wenn er während seiner Zeitscheibe nicht abgeschlossen ist, ist dies der Fall. blätternEin weiterer Prozess beginnt oder wird fortgesetzt, und später wird der ursprüngliche Prozess wieder aufgenommen. Auf diese Weise werden mehrere Prozesse in einem einzigen Moment durch Ausführung Teil des Ausgangs durchgeführt, aber zu diesem Zeitpunkt wird nur ein Prozess ausgeführt.

Gleichzeitige Berechnungen kann parallel ausgeführt werden,[3][6] Zum Beispiel, indem jeder Prozess einem separaten Prozessor- oder Prozessorkern zugewiesen wird oder Verbreitung eine Berechnung über ein Netzwerk. Im Allgemeinen sind die Sprachen, Werkzeuge und Techniken für die parallele Programmierung möglicherweise nicht für die gleichzeitige Programmierung geeignet und umgekehrt.

Der genaue Zeitpunkt, an dem Aufgaben in einem gleichzeitigen System ausgeführt werden Planungund Aufgaben müssen nicht immer gleichzeitig ausgeführt werden. Zum Beispiel bei zwei Aufgaben, T1 und T2:

  • T1 kann vor T2 oder vor T2 ausgeführt und fertiggestellt werden und umgekehrt (Serie und sequentiell)
  • T1 und T2 können abwechselnd ausgeführt werden (seriell und gleichzeitig)
  • T1 und T2 können gleichzeitig im selben Zeitpunkt ausgeführt werden (parallel und gleichzeitig)

Das Wort "sequentiell" wird sowohl für "gleichzeitige" als auch als "parallel" als Antonym verwendet. Wenn diese explizit unterschieden werden, gleichzeitig/sequentiell und parallel/seriell werden als gegensätzliche Paare verwendet.[7] Ein Zeitplan, in dem Aufgaben jeweils eine ausführen (seriell, keine Parallelität), ohne zu verschieben Serienplan. Eine Reihe von Aufgaben, die seriell geplant werden können, ist Serialisierbar, was vereinfacht Parallelitätskontrolle.

Koordinierung des Zugriffs auf gemeinsam genutzte Ressourcen

Die größte Herausforderung bei der Gestaltung gleichzeitiger Programme ist Parallelitätskontrolle: Gewährleistung der korrekten Sequenzierung der Interaktionen oder Kommunikation zwischen verschiedenen Rechenausführungen und der Koordinierung des Zugriffs auf Ressourcen, die zwischen Ausführungen geteilt werden.[6] Potenzielle Probleme umfassen Rennbedingungen, Deadlocks, und Ressourcenhunger. Betrachten Sie beispielsweise den folgenden Algorithmus, um Abhebungen von einem Girokonto vorzunehmen, das von der freigegebenen Ressource dargestellt wird Gleichgewicht:

bool abheben(int Rückzug) {   wenn (Gleichgewicht > = Rückzug)   {   Gleichgewicht -= Rückzug;   Rückkehr Stimmt;   }    Rückkehr FALSCH; } 

Vermuten Balance = 500und zwei gleichzeitig Themen tätigen die Anrufe zurückziehen (300) und zurückziehen (350). Wenn Zeile 3 in beiden Vorgängen vor Zeile 5 ausgeführt wird, werden beide Vorgänge feststellen Restbetrag> = Abhebung bewertet Stimmtund die Ausführung subtrahieren den Abhebungsbetrag. Da beide Prozesse jedoch ihre Abhebungen durchführen, wird der zurückgezogene Gesamtbetrag mehr als der ursprüngliche Saldo sein. Diese Art von Problemen mit gemeinsamen Ressourcen profitieren von der Verwendung von Parallelitätskontrolle oder Nicht blockierende Algorithmen.

Vorteile

Die Vorteile des gleichzeitigen Computers umfassen:

  • Erhöhter Programmdurchsatz - Eine parallele Ausführung eines gleichzeitigen Programms ermöglicht die Anzahl der in einem bestimmten Zeit erledigten Aufgaben, um proportional zur Anzahl der Prozessoren zu erhöhen. Gustafsons Gesetz
  • Hohe Reaktionsfähigkeit für Eingabe/Ausgabe-Input/outputinsive Programme warten hauptsächlich auf Eingabe- oder Ausgangsvorgänge abgeschlossen. Die gleichzeitige Programmierung ermöglicht die Zeit, die darauf warten würde, für eine andere Aufgabe verwendet zu werden.
  • Angemessenere Programmstruktur-Einige Probleme und Problembereiche eignen sich gut für die Repräsentation als gleichzeitige Aufgaben oder Prozesse.

Modelle

1962 eingeführt, Petri Nets waren ein frühzeitiger Versuch, die Regeln der gleichzeitigen Ausführung zu kodifizieren. Die Datenflow -Theorie baute später auf diesen auf, und DataFlow -Architekturen wurden geschaffen, um die Ideen der Datenflow -Theorie physisch zu implementieren. Ab Ende der 1970er Jahre, Prozesskalkül wie zum Beispiel Berechnungskalkül der Kommunikationssysteme (CCS) und Kommunizieren von sequentiellen Prozessen (CSP) wurden entwickelt, um ein algebraisches Denken über Systeme aus interagierenden Komponenten zu ermöglichen. Das π-Kalkulus Die Fähigkeit zum Denken zu dynamischen Topologien hinzugefügt.

Eingabe/Ausgangsautomata wurden 1987 eingeführt.

Logik wie Lamports TLA+und mathematische Modelle wie Spuren und Schauspieler -Event -Diagrammewurden auch entwickelt, um das Verhalten gleichzeitiger Systeme zu beschreiben.

Software -Transaktionsspeicher Darlehen aus Datenbanktheorie das Konzept von Atomtransaktionen und wendet sie auf Speicherzugriffe an.

Konsistenzmodelle

Gleichzeitige Programmiersprachen und Multiprozessorprogramme müssen a haben Konsistenzmodell (auch als Speichermodell bekannt). Das Konsistenzmodell definiert Regeln für den Eingang des Vorgangs Computerspeicher treten auf und wie Ergebnisse erzeugt werden.

Eines der ersten Konsistenzmodelle war Leslie Lamport's Sequentielle Konsistenz Modell. Sequentielle Konsistenz ist die Eigenschaft eines Programms, dass seine Ausführung die gleichen Ergebnisse wie ein sequentielles Programm erzielt. Insbesondere ist ein Programm nacheinander konsistent, wenn "die Ergebnisse einer Ausführung die gleichen sind, als ob die Operationen aller Prozessoren in einer sequentiellen Reihenfolge ausgeführt wurden und die Operationen jedes einzelnen Prozessors in dieser Sequenz in der von seinem Programm angegebenen Reihenfolge angezeigt werden ".[8]

Implementierung

Eine Reihe verschiedener Methoden können verwendet werden, um gleichzeitige Programme zu implementieren, z. B. die Implementierung jeder Rechenausführung als Betriebssystemprozess, oder implementieren die Rechenprozesse als Satz von Themen Innerhalb eines einzelnen Betriebssystemprozesses.

Interaktion und Kommunikation

In einigen gleichzeitigen Computersystemen wird die Kommunikation zwischen den gleichzeitigen Komponenten vor dem Programmierer verborgen (z. B. durch Verwendung Futures), während es in anderen Fällen explizit behandelt werden. Explizite Kommunikation kann in zwei Klassen unterteilt werden:

Gemeinsame Gedächtniskommunikation
Gleichzeitige Komponenten kommunizieren durch Änderung des Inhalts von geteilte Erinnerung Standorte (Beispiel veranschaulicht durch Java und C#). Diese Art der gleichzeitigen Programmierung erfordert normalerweise irgendeine Form von Sperren (z. B.,, Mutexes, Semaphoren, oder Monitore) zwischen Threads zu koordinieren. Ein Programm, das eine dieser ordnungsgemäß implementiert Thread-safe.
Nachrichtenübergabe Kommunikation
Gleichzeitige Komponenten kommunizieren durch Austausch von Nachrichten (Beispiel für MPI, gehen, Scala, Erlang und occam). Der Austausch von Nachrichten kann asynchron durchgeführt werden oder einen synchronen "Rendezvous" -Stil verwenden, in dem der Absender blockiert, bis die Nachricht empfangen wird. Eine asynchrone Nachrichtenübergabe kann zuverlässig oder unzuverlässig sein (manchmal als "Senden und Beten" bezeichnet). Die Parallelitätsbilanz ist tendenziell viel einfacher zu argumentieren als mit der Parallelität der gemeinsamen Memory und wird in der Regel als robustere Form der gleichzeitigen Programmierung angesehen. Eine Vielzahl von mathematischen Theorien zum Verständnis und Analyse von Nachrichten-Passing-Systemen sind verfügbar, einschließlich der Schauspielermodellund verschiedene Prozesskalkül. Die Verabschiedung von Nachrichten kann durch effizient implementiert werden Symmetrische Multiprozessierung, mit oder ohne gemeinsames Speicher Cache -Kohärenz.

Shared Memory und Message Passing Parallhency haben unterschiedliche Leistungsmerkmale. Normalerweise (wenn auch nicht immer) ist der Überkopf- und Aufgabenschalter pro Prozess in einem Nachrichtenübergang niedriger, aber der Overhead of Message Passing ist größer als für einen Prozeduraufruf. Diese Unterschiede werden oft von anderen Leistungsfaktoren überwältigt.

Geschichte

Concurrent Computing entwickelte sich aus früheren Arbeiten an Eisenbahnen und Telegrafie, ab dem 19. und frühen 20. Jahrhundert, und einige Begriffe stammen aus dieser Zeit, wie z. B. Semaphoren. Diese entstanden, um die Frage zu beantworten, wie mehrere Züge auf demselben Eisenbahnsystem umgehen (Vermeidung von Kollisionen und Maximierung der Effizienz) und wie mehrere Getriebe über einen bestimmten Satz von Drähten (Verbesserung der Effizienz) wie über via z. Zeitabteilung Multiplexing (1870er Jahre).

Die akademische Studie über gleichzeitige Algorithmen begann in den 1960er Jahren mit Dijkstra (1965) geschrieben, das erste Papier in diesem Bereich zu sein, identifizieren und zu lösen gegenseitiger Ausschluss.[9]

Häufigkeit

Die Parallelität ist bei der Berechnung allgegenwärtig und kommt von Hardware auf niedriger Ebene auf einem einzelnen Chip bis zu weltweiten Netzwerken auf. Beispiele folgen.

Auf der Ebene der Programmiersprache:

Auf Betriebssystemebene:

Auf Netzwerkebene sind vernetzte Systeme im Allgemeinen von Natur aus gleichzeitig gleichzeitig, da sie aus getrennten Geräten bestehen.

Sprachen, die die gleichzeitige Programmierung unterstützen

Gleichzeitige Programmiersprachen sind Programmiersprachen, die Sprachkonstrukte für verwenden Parallelität. Diese Konstrukte können beinhalten Multi-Threading, Unterstützung für verteiltes Computer, Nachrichtenübergang, gemeinsame Ressourcen (einschließlich geteilte Erinnerung) oder Futures und Versprechen. Solche Sprachen werden manchmal als beschrieben als Parallelitätsorientierte Sprachen oder Parallelitätsorientierte Programmiersprachen (COPL).[10]

Heutzutage sind die am häufigsten verwendeten Programmiersprachen mit spezifischen Konstrukten für die Parallelität Java und C#. Beide Sprachen verwenden grundlegend ein Shared-Memory-Parallelitätsmodell, wobei Sperren von zur Verfügung gestellt werden von Monitore (Obwohl Modelle für Nachrichten-Passings oben auf dem zugrunde liegenden Shared-Memory-Modell implementiert werden können). Von den Sprachen, die ein Modell für die Parallelitätsmodell verwenden, Erlang ist derzeit wahrscheinlich die am weitesten verbreitete Industrie.

Viele gleichzeitige Programmiersprachen wurden eher als Forschungssprachen entwickelt (z. Pict) und nicht als Sprachen für die Produktion. Sprachen wie jedoch wie Erlang, Limbo, und occam haben in den letzten 20 Jahren zu verschiedenen Zeiten Industriegebrauch gesehen. Eine nicht exexhustive Liste von Sprachen, die gleichzeitige Programmiermöglichkeiten verwenden oder bereitstellen:

  • Ada- Generalzweck, mit native Unterstützung für das Bestehen und die Überwachung von Nachrichten, die auf der gleichzeitigen Parallelität basieren
  • ALEF- Konzern, mit Threads und Nachrichtenübergang, für die Systemprogrammierung in frühen Versionen von Plan 9 von Bell Labs
  • Alice- Extension an Standard ml, fügt Unterstützung für die Parallelität durch Futures hinzu
  • Ateji px- Extension an Java mit parallelen Primitiven von inspiriert von π-Kalkulus
  • Axum-Domain spezifisch, gleichzeitig, basierend auf Akteurenmodell und .NET Common Language Runtime unter Verwendung einer C-ähnlichen Syntax
  • BMDFM- Binärmodularer Datenflussmaschine
  • C ++- STD :: Thread
  • (C Omega) - Für die Forschung erweitert C#asynchrone Kommunikation
  • C#- Supports gleichzeitiges Computing mit Lock, Ertrag, auch seit Version 5.0 Async und auf Keywords aufgenommen, die eingeführt wurden
  • Clojure-modern, funktional Dialekt von Lispeln auf der Java Plattform
  • Gleichzeitig sauber- Funktionale Programmierung, ähnlich wie Haskell
  • Gleichzeitige Sammlungen .
  • Gleichzeitiger Haskell- Lazy, reine funktionale Sprache, die gleichzeitige Prozesse im gemeinsamen Speicher betreiben
  • Gleichzeitiger ML- Konsumverlängerung von Standard ml
  • Gleichzeitiger Pascal-durch Per Brinch Hansen
  • Curry
  • DMulti-Paradigma Systemprogrammiersprache mit expliziter Unterstützung für die gleichzeitige Programmierung (Schauspielermodell)
  • E- Verspricht, Deadlocks auszuschließen
  • ECMaskript- Versprechende Versprechen für asynchrone Operationen
  • Eiffel-durch seine SCOOP Mechanismus basierend auf den Konzepten des Designs nach Vertrag
  • Elixier-Dynamische und funktionale Metaprogrammierung bewusste Sprache, die auf dem Erlang VM ausgeführt wird.
  • Erlang- endet asynchron
  • Faust-Die Real-Time-Funktion für die Signalverarbeitung bietet Compiler eine automatische Parallelisierung über OpenMP oder eine bestimmte Arbeitsdauer Planer
  • ForranCoarrays und gleichzeitlich tun sind Teil des Standards von Forran 2008
  • gehen- Für Systemprogrammierung mit einem gleichzeitigen Programmiermodell basierend auf CSP
  • Haskell- Konzern- und parallele funktionale Programmiersprache[11]
  • Hume- Funktionale, gleichzeitige, für begrenzte Raum- und Zeitumgebungen, in denen Automatenprozesse durch Synchron -Kanäle -Muster und Nachrichtenübergang beschrieben werden
  • Io-Schauspielbasierte Parallelität
  • Janus- Features unterschiedlich Fragen und Kassierer zu logischen Variablen, Taschenkanäle; ist rein deklarativ
  • Java- Thread -Klasse oder Runnable -Schnittstelle
  • Julia-"Gleichzeitige Programmierprimitive: Aufgaben, Async-Wait, Kanäle."[12]
  • JavaScript-über Webarbeiterin einer Browserumgebung, Versprechen, und Rückrufe.
  • Jocaml- Konsum- und verteilte Kanalbasis, Erweiterung von Ocamlimplementiert die Join-Kalkulus von Prozessen
  • Treten Sie Java bei- Konsum, basierend auf Java Sprache
  • Joule-Dataflow-basiert, kommuniziert durch Nachrichtenübergang
  • Joyce- Konsum, lehren, aufgebaut auf Gleichzeitiger Pascal mit Funktionen von CSP durch Per Brinch Hansen
  • Labor- Grafisch, Datenfluss, Funktionen sind Knoten in einem Diagramm, Daten sind Drähte zwischen den Knoten; Enthält objektorientierte Sprache
  • Limbo- Relativ von ALEFfür Systemprogrammierung in Inferno (Betriebssystem)
  • MultilispPlanen Variante erweitert, um die Parallelität zu unterstützen
  • Modula-2- Für die Systemprogrammierung von N. Wirth als Nachfolger von Pascal mit nationaler Unterstützung für Coroutinen
  • Modula-3- Modernes Mitglied der Algol -Familie mit umfassender Unterstützung für Fäden, Mutexes, Zustandsvariablen
  • Newsqueak-Forschung mit Kanälen als erstklassige Werte; Vorgänger von ALEF
  • occam- stark durch Kommunizieren von sequentiellen Prozessen (CSP)
  • Ork- gleichzeitig gleichzeitig, nicht deterministisch, basierend auf Kleene Algebra
  • Oz-Mozart-Multiparadigm, unterstützt Shared State und Message-Passing-Parallelität und Futures
  • Parasail–Objectoriented, parallel, frei von Zeigern, Rassenbedingungen
  • Pict- im Wesentlichen eine ausführbare Implementierung von Milner π-Kalkulus
  • Raku Enthält standardmäßig Klassen für Themen, Versprechen und Kanäle[13]
  • Python -Verwendet Thread-basierte Parallelität und prozessbasierte Parallelität [14]
  • Reia-asynchrone Nachrichten, die zwischen gemeinsam genutzten Objekten bestehen
  • Rot/System- für Systemprogramme basierend auf Rebol
  • Rost-Für die Systemprogrammierung, Verwendung von Nachrichten-Passing mit Move Semantics, gemeinsamem, unveränderlichem Speicher und gemeinsam genutztem Speicher.[15]
  • Scala-Generalzweck, das gemeinsame Programmiermuster auf prägnante, elegante und typesichere Weise ausdrücken soll
  • Sequencel-Generalzweckfunktional, Hauptdesignziele sind einfache Programmierung, Code-Clarity-Lesbarkeit und automatische Parallelisierung für die Leistung auf Multicore-Hardware und nachweislich frei von Rennbedingungen
  • Sr-für die Forschung
  • Superpascal- Konsument für den Unterricht aufgebaut auf Gleichzeitiger Pascal und Joyce durch Per Brinch Hansen
  • Unicon-für die Forschung
  • Tnsdl- Für die Entwicklung des Telekommunikationsaustauschs verwendet asynchrone Nachrichtenübergang
  • VHSIC -Hardware Beschreibung Sprache (VHDL)-IEEE STD-1076
  • Xc—Concurrency-erweiterte Untergruppe der C-Sprache, die von entwickelt wurde, die von entwickelt wurden von Xmos, bezogen auf Kommunizieren von sequentiellen Prozessen, integrierte Konstrukte für programmierbare E/O.

Viele andere Sprachen unterstützen die Parallelität in Form von Bibliotheken auf Ebenen, die ungefähr mit der obigen Liste vergleichbar sind.

Siehe auch

Anmerkungen

  1. ^ Dies ist die Abzinsung der Parallelität in einem Prozessorkern, wie z. B. Pipelining oder vektorisierte Anweisungen. Ein Ein-Kern-One-Processor Maschine kann zu einer Parallelität in der Lage sein, wie mit a Coprozessor, aber der Prozessor allein ist es nicht.

Verweise

  1. ^ Betriebssystemkonzepte 9. Ausgabe, Abraham Silberschatz. "Kapitel 4: Threads"
  2. ^ Der Ursprung der gleichzeitigen Programmierung. doi:10.1007/978-1-4757-3472-0.
  3. ^ a b Pike, Rob (2012-01-11). "Parallelität ist keine Parallelität". WAZA -Konferenz, 11. Januar 2012. abgerufen von http://talks.golang.org/2012/waza.slide (Folien) und http://vimeo.com/49718712 (Video).
  4. ^ "Parallelität gegen Parallelität". Haskell Wiki.
  5. ^ Schneider, Fred B. (1997-05-06). Bei gleichzeitiger Programmierung. Springer. ISBN 9780387949420.
  6. ^ a b Ben-Ari, Mordechai (2006). Prinzipien der gleichzeitigen und verteilten Programmierung (2. Aufl.). Addison-Wesley. ISBN 978-0-321-31283-9.
  7. ^ Patterson & Hennessy 2013, p. 503.
  8. ^ LaMport, Leslie (1. September 1979). "So erstellen Sie einen Multiprozessor -Computer, der Multiprocess -Programme korrekt ausführt". IEEE -Transaktionen auf Computern. C-28 (9): 690–691. doi:10.1109/tc.1979.1675439. S2CID 5679366.
  9. ^ "PODC Influential Paper Award: 2002", ACM -Symposium über Prinzipien des verteilten Computers, abgerufen 2009-08-24
  10. ^ Armstrong, Joe (2003). "Zuverlässige verteilte Systeme in Anwesenheit von Softwarefehlern machen" (PDF).
  11. ^ Marlow, Simon (2013) Parallele und gleichzeitige Programmierung in Haskell: Techniken für Multicore- und Multithread -Programmierung ISBN9781449335946
  12. ^ https://juliacon.talkfunnel.com/2015/21-concurrent-and-parallelprogramming-in-julia Gleichzeitige und parallele Programmierung in Julia
  13. ^ "Parallelität". docs.perl6.org. Abgerufen 2017-12-24.
  14. ^ Dokumentation »Die Python Standard Library» Gleichzeitige Ausführung
  15. ^ Blum, Ben (2012). "TypeSafe Shared Mutable State". Abgerufen 2012-11-14.

Quellen

  • Patterson, David A.; Hennessy, John L. (2013). Computerorganisation und Design: Die Hardware-/Software -Oberfläche.Die Morgan Kaufmann -Serie in Computerarchitektur und Design (5 ed.).Morgan Kaufmann. ISBN 978-0-12407886-4.

Weitere Lektüre

Externe Links