Die Bedeutung von asynchron vs synchron [closed]


46

Was bedeuten die Wörter asynchron und synchron in der Informatik?

Wenn Sie die Bedeutung der Wörter googeln, erhalten Sie Folgendes:

Aber es scheint, als würden sie verwendet, um die entgegengesetzte Bedeutung in der Programmierung oder in der Informatik zu vermitteln:

Das Attribut "HTML async" bedeutet, dass das Skript ausgeführt wird, sobald es heruntergeladen wurde, auch wenn das HTML noch analysiert oder heruntergeladen wird. Dies bedeutet, dass beide Prozesse, das Skript und das HTML, vorhanden sind und gleichzeitig ausgeführt werden.

Werden diese Begriffe verwendet, um die entgegengesetzte Bedeutung in der Informatik zu vermitteln, oder verpasse ich den Punkt?


47
Ich finde es einfach zu sagen: Wenn ich nicht verstehe, wie der Code funktioniert, und wenn Fehler plötzlich verschwinden, wenn ich nach ihnen suche, ist der Code wahrscheinlich asynchron. :)
Eric Duminil

4
Die traurige Wahrheit ist, dass diese Wörter im Bereich der Programmierung im Laufe der Zeit das Gegenteil von dem bedeuten, was sie sonst bedeuten. Es mag historische Gründe für ihre aktuelle Bedeutung geben, aber es gibt keine gute Begründung.
Solomonoffs Geheimnis

3
Zur gleichen Zeit wie , was ist der Schlüssel :)
Leichtheit Rennen mit Monica

5
Die eigentliche Operation nicht (unbedingt) tritt in der gleichen Zeit wie die Funktion gegen die Operation aufgerufen wird , nicht zur gleichen Zeit auftreten , die Funktion aufgerufen wird ... scheint nicht rückwärts zu mir? Wenn ich eine Funktion als asynchron beschreibe, sage ich, dass das, was auch immer sie tut, nicht garantiert gleichzeitig mit Ihrem Aufruf geschieht.
Affe

2
"sequentiell" und "nicht-sequentiell" waren semantisch vielleicht bessere Entscheidungen, aber dieses Schiff hat schon viel zu viel gesegelt.
Jared Smith

Antworten:


47

Ich möchte Ihnen eine Antwort geben, die in direktem Zusammenhang mit den von Ihnen gefundenen Definitionen steht. Wenn eine Task T1 eine zweite Task T2 startet, kann dies folgendermaßen geschehen:

Synchron: vorhanden oder gleichzeitig vorkommend.

Somit wird garantiert, dass T2 innerhalb der Zeitscheibe von T1 gestartet und ausgeführt wird . T1 "wartet" auf das Ende von T2 und kann anschließend weiterarbeiten. In diesem Sinne treten T1 und T2 "gleichzeitig" auf (nicht "parallel", sondern in einem zusammenhängenden Zeitintervall).

Asynchron: nicht vorhanden oder gleichzeitig vorhanden.

Die Ausführungszeit von T2 hat also nichts mehr mit T1 zu tun. Es kann parallel ausgeführt werden, es kann eine Sekunde, eine Minute oder mehrere Stunden später geschehen, und T2 kann noch ausgeführt werden, wenn T1 beendet ist (um ein Ergebnis von T2 zu verarbeiten, kann eine neue Task T3 erforderlich sein). In diesem Sinne treten T1 und T2 nicht "gleichzeitig (Intervall) auf".

Natürlich stimme ich zu, dass die wörtlichen Definitionen nicht eindeutig sind, wenn man bedenkt, dass asynchrone Operationen heutzutage häufig zur Erstellung paralleler Ausführungen verwendet werden.


4
Es ist schade, dass dies so viele positive Stimmen hat, weil ich denke, dass es falsch ist. Synchrone Methoden werden direkt nacheinander ausgeführt, da die zweite Methode auf den Abschluss der ersten (blockierenden) Methode warten muss. Diese beiden Methoden werden entschieden nicht gleichzeitig ausgeführt.
Robert Harvey

6
Nein, ich glaube nicht. Synchronität und Gleichzeitigkeit sind nicht dasselbe.
Robert Harvey

1
Ich bin bereit zu behaupten, dass die Wörterbuchdefinitionen für Softwareentwickler nicht von großem Nutzen sind. Der Versuch, die Wörterbuchdefinitionen den von uns verwendeten Fachbegriffen zuzuordnen, ist wahrscheinlich nicht sinnvoll.
Robert Harvey

1
In jedem Fall verbessert Ihre Bearbeitung die Dinge, aber die Wörter "vorhanden oder gleichzeitig vorkommend" verwechseln Ihre Beschreibungen. Synchrone Methoden werden nicht "zur gleichen Zeit" ausgeführt. Sie werden in einer geordneten Reihenfolge ausgeführt , wodurch sie synchron sind.
Robert Harvey

1
@RobertHarvey Die Wörterbuchdefinitionen funktionieren einwandfrei, wenn Sie die richtige Perspektive verwenden. Sie sind alle von der Hinrichtungszeit besessen. Anweisungen haben eine Lebensdauer außerhalb des Ausführungszeitpunkts. Sequentielle Befehle bewegen sich synchron, genauso wie sich Kugeln in einem Revolver synchron bewegen. In ähnlicher Weise können sich Anweisungen synchron durch Anweisungspipelines bewegen. Hören Sie auf, von der Ausführungsperspektive besessen zu sein. Eine Menge Mist passiert mit Anweisungen, bevor sie ausgeführt werden.
candied_orange

20

Ich finde, dass der beste Weg, dies zu verstehen, der folgende ist:

  • Synchron: Wir wissen, wann es passieren wird (es passiert, wenn dieser andere Code endet).
  • Asynchron: Wir wissen nicht, wann es passieren wird.

Hinweis: Während wir die Ausführung von Code für eine bestimmte Uhrzeit planen können, wissen wir in der Praxis nicht, wann dies geschehen wird, da es zu Verzögerungen kommen kann - selbst wenn wir die Systemuhr ignorieren -, weil das System gerade etwas anderes ausführt. Selbst wenn wir die Garantie hätten, dass dies genau zu einem bestimmten Zeitpunkt geschieht, sind wir uns nicht sicher, wo die Ausführung unseres Programms zu diesem Zeitpunkt stattfinden würde. Nein, der für die Uhrzeit geplante Code ist nicht synchron.


Bitte beachten Sie, dass wir in der Softwareentwicklung zum Beispiel sagen werden, dass eine Aufgabe asynchron ist, um die Aufgabe zu isolieren. Wenn Sie es jedoch in Bezug auf das gleichzeitige Auftreten definieren möchten oder nicht möchten, müssen Sie mindestens etwas anderes haben, mit dem Sie die Aufgabe vergleichen können.

Viele Plattformen können sowohl Parallelität als auch Taskwechsel ausführen, einige weisen eine eingeschränkte Parallelität auf, andere können überhaupt keine Parallelität auf und verlassen sich nur auf Taskwechsel. Außerdem können manche Plattformen eine Task nicht unterbrechen und müssen diese abschließen, bevor eine andere ausgeführt werden kann ... Asynchrone Tasks sind eine Abstraktion über all das, sodass das System entscheiden kann, wie die Tasks für die angegebene Plattform ausgeführt werden sollen, ohne dass sich der Entwickler darüber Gedanken macht (zu viel).

Es ist auch erwähnenswert, dass wir uns vorstellen können und normalerweise abstrahieren, externe Eingaben als asynchrone Aufgabe zu erhalten. Beispiel: Abrufen von Text aus Benutzereingaben. Wir wissen nicht, wann der Benutzer tippen wird. Dies gilt auch für das Lesen aus dem permanenten Speicher, das Abrufen von Daten über das Netzwerk oder ein anderes externes System.


Übrigens, obwohl einige Dinge grundsätzlich asynchron sind, können wir normalerweise so tun, als ob dies nicht der Fall wäre. Wir tun dies, indem die Software die aktuelle Ausführung blockiert - und nichts anderes tut -, bis sie abgeschlossen ist. Das heißt, wir können etwas Asynchrones nehmen und es in eine synchrone API einbinden.

Eine asynchrone API ermöglicht es Ihnen, die Ausführung fortzusetzen, obwohl der angeforderte Vorgang nicht abgeschlossen ist, ein synchroner Vorgang jedoch nicht. Und von dort kommt man auf die Idee, asynchron - in der Software - gleichzeitig (gleichzeitig) vorzukommen.

Es ist erwähnenswert, dass asynchron nicht gleichzeitig bedeutet. In einigen Fällen kann die Plattform die asynchrone Aufgabe erst ausführen, nachdem die aktuelle Aufgabe abgeschlossen wurde. Dies wäre sequentiell (obwohl die Ausführungsreihenfolge der asynchronen Task nicht unbedingt garantiert ist), nicht gleichzeitig (es gibt keine Überlappung in den Ausführungsperioden) und dennoch asynchron.

Übrigens, auf einigen Plattformen kann das System entscheiden, die asynchrone Aufgabe inline auszuführen, und sie daher genau dort als synchrone Operation ausführen (vorausgesetzt, dies ist nicht für jede Aufgabe durchführbar).

Auch hier bedeutet asynchron nur, dass Sie nicht wissen, wann es passieren wird.


Sie könnten auch interessiert sein an Der Unterschied zwischen "gleichzeitiger" und "paralleler" Ausführung? .


Genau. Die vom OP gefundene Beschreibung handelt viel mehr von Parallelität als von Synchronität (wenn das ein Wort ist ...). asynch vs synch handelt davon, wann die Aktion startet (im Moment, wenn ich sie aufrufe, oder später, wenn der Scheduler entscheidet), während parallel bedeutet, dass sie zur gleichen Zeit stattfinden und sequentiell.
Giacomo Alzetta

1
@ GiacomoAlzetta Ich denke, das Wort ist Synchronität. Ich habe auch diese ähnlichen Wörter gefunden: Synchronisation, Synchronität und Synchronizität. Wahrscheinlich eine eigene Frage wert.
Theraot

12

Asynchron: nicht vorhanden oder gleichzeitig vorhanden.

Synchron: vorhanden oder gleichzeitig vorkommend.

Das Attribut async bedeutet, dass das Skript ausgeführt wird, sobald es heruntergeladen wurde, auch wenn der HTML-Code noch analysiert wird. Das bedeutet, dass für mich beide Prozesse gleichzeitig vorhanden sind.

Das ist in der Tat verwirrend!

Betrachten Sie stattdessen die Bedeutungen von synchronisiert und unsynchronisiert . Zwei Dinge werden synchronisiert, wenn das Timing des einen vom anderen abhängt, und nicht synchronisiert, wenn ihre Timings nicht zusammenhängen.

In Ihrem asynchronen Beispielworkflow passieren zwei Dinge: Skriptausführung und HTML-Analyse. Diese beiden Dinge sind nicht synchronisiert . Der Zeitpunkt der Ausführungsoperation und der Zeitpunkt der Analyseoperation hängen nicht voneinander ab. Wenn wir den Workflow synchronisieren würden , würden die Vorgänge synchronisiert . Angenommen, die Ausführung beginnt erst, wenn das Parsen definitiv beendet ist.

Es ist jedoch wichtig zu wissen, dass es hier tatsächlich drei Möglichkeiten gibt:

  • Ausführung und Analyse sind wirklich nicht synchronisiert. Sie können jederzeit und in beliebiger Reihenfolge durchgeführt werden, unabhängig davon, was am effizientesten ist.
  • Ausführung und Analyse werden synchronisiert; Angenommen, die CPU tut nichts, während sie auf den Abschluss der E / A wartet.
  • Ausführung und Parsing sind synchronisiert, aber während wir auf den Abschluss der E / A warten, kann die CPU andere Arbeiten ausführen und nach Abschluss des Downloads zurückkehren und das Parsing durchführen .

Sobald Sie dies verstanden haben, wird der Zweck von asynchronen Workflows in gängigen Programmiersprachen klarer:

  • Asynchrone Workflows helfen uns bei der effizienten Implementierung von Operationen mit hoher Latenz, da wir nicht gezwungen sind, nicht zusammenhängende Dinge rechtzeitig zu ordnen. Wenn das Parsen eine hohe Latenz und E / A-Bindung aufweist und die Skriptausführung eine hohe Latenz und CPU-Bindung aufweist, können wir einen Gewinn erzielen, indem wir diese Vorgänge vollständig oder teilweise unsynchronisieren.

  • Der awaitOperator in Sprachen wie C # ist der Bestellvorgang für asynchrone Workflows. Ein Warten ist ein asynchrones Warten . es ist ein Punkt , an dem wir eine Ordnungsbeziehung zwischen zwei Teilen eines asynchronen Workflow ausdrücken, und sagen , dass es ist eine Beziehung zwischen dem Code vor dem await und den Code nach dem await „vor geschieht“. So setzen wir die dritte Option um .

Wenn das zu abstrakt ist, denken Sie an einige Beispiele aus der Praxis. Wenn Sie einen Brief senden - eine E / A-gebundene Operation mit hoher Latenz -, können Sie immer noch CPU-intensive Arbeit leisten - zum Beispiel Mathe-Hausaufgaben -, während Sie darauf warten, eine Antwort auf Ihren Brief zu erhalten. Die Vorgänge, bei denen Sie Ihre mathematischen Hausaufgaben machen und Ihre E-Mails lesen, sind nicht synchronisiert.

Angenommen, Sie senden jetzt einen Brief und die Antwort enthält eine Zahl, die Sie für Ihre Steuern benötigen. Jetzt können Sie die CPU-Arbeit - die Berechnung Ihrer Steuern - erst erledigen, wenn die E / A-Operation abgeschlossen ist. Sie können den Rasen aber trotzdem mähen, während Sie warten . Dies ist ein asynchroner Workflow, der eine zeitliche Beziehung zwischen seinen Teilen zum Ausdruck gebracht hat.


6

Ich bin ein Elektrotechniker, und wir haben uns mit synchronen und asynchronen Logikschaltungen (Logikgattern) befasst.

Angenommen, Sie haben ein UND-Gatter (oder ein beliebiges Gatter) mit zwei Eingängen und einem Ausgang.

Wenn es asynchron ist, aktualisiert es seine Ausgabe, sobald sich eine der Eingaben so ändert, dass sich die Ausgabe ändert. So hat Ihr Beispiel funktioniert - das von Ihnen erwähnte Programm.

Wenn diesem Gatter jedoch auch eine Uhr (z. B. eine Rechteckwelle mit einer Periode von 1 Sekunde) zugeordnet ist, bei der der Takt jeder Sekunde aktualisiert wird, wenn die Rechteckwelle von niedrig nach hoch wechselt, ist sie synchron. Es ist an die Frequenz der Uhr gebunden. Es ist also synchron. Sie könnten diese Uhr an viele Schaltkreise anschließen, und sie würden im Rhythmus miteinander arbeiten - synchronisiert. Wenn Ihr Programm nur prüft, ob es gelesen wurde, um jede Sekunde ausgeführt zu werden, wird es auch synchronisiert.


1
Wie eine asynchrone / synchrone serielle Schnittstelle.
Jiwopene

2

Stellen Sie sich zwei Satelliten vor, die die Erde umkreisen.

  • Satellit A hat eine Rotationsperiode um die Erde, so dass der Satellit bei jeder vollen Rotation des Planeten mehr oder weniger als einmal um die Erde gefahren ist .
  • Satellit B hat eine Rotationsperiode um die Erde, so dass der Satellit bei jeder vollen Rotation des Planeten genau einmal um die Erde gefahren ist .

Der Satellit B im obigen Beispiel befindet sich in einer geosynchronen Umlaufbahn, wie durch definiert

mit einer Rotationsperiode synchron mit der der Erdrotation.

Man argumentiert nicht, dass Satellit A geosynchron ist, nur weil er "zur gleichen Zeit existiert oder auftritt" wie der Planet. Tatsächlich ist der Satellit B selbst auch nicht relevant - relevant ist die Rotationsperiode, die mit der Rotationsperiode der Erde synchronisiert ist. Es geht nicht um die gleichzeitige Existenz der Objekte; Es geht um die Beziehung zwischen den Objekten. Halte diesen Gedanken fest.

Angenommen, ich sage Ihnen, dass zwei Threads auf einem System gleichzeitig ausgeführt werden. Thread A (TA) ruft Daten für Prozess A ab und Thread B (TB) ruft Daten für Prozess B ab. Ich frage Sie: "Sind TA und TB asynchron?". Ihre Antwort wäre: "Woher soll ich das wissen? Ich muss den Code sehen, der sie in ihren jeweiligen Prozessen aufrief." Worauf ich bei meinem Versuch, knifflig zu sein, antworten würde: "Aber ich sage Ihnen, dass TA und TB auf jeden Fall gleichzeitig laufen."

Und Sie, als ziemlich kluges Individuum, würden antworten: "Wieder - sie werden möglicherweise gleichzeitig ausgeführt, aber ich habe keine Ahnung, ob sie asynchron in Bezug auf ihre jeweiligen Prozesse ausgeführt werden, die sie aufgerufen haben. TA und TB, die asynchron zueinander ausgeführt werden, machen das wirklich Es macht keinen Sinn, weil sie nicht aus demselben Prozess hervorgegangen sind. "

Inzwischen sollten wir uns also ein Bild davon machen, dass das Bestehen einer Beziehung hier von Bedeutung ist und nicht nur das Bestehen dieser beiden Fäden. Wenn eine Methode asynchron ausgeführt wird, heißt es, dass die Ausführung dieser Methode " NICHT zur gleichen Zeit vorhanden sein oder stattfinden muss" wie die Ausführung der Methode, die sie aufgerufen hat. Nehmen Sie das folgende Beispiel:

func Invoker() {
    DoThis();
    DoThatAsync();

    var foo = CheckThis();
    ... do some work ...
    CheckThat(foo);

    await DoThatAsync();

    CheckThat();
}

Aus unserer Diskussion über Satelliten weiter oben: "Es geht nicht um die gleichzeitige Existenz der Objekte, sondern um die Beziehung zwischen den Objekten." Es geht nicht um die Existenz einer aufrufenden Methode und der aufgerufenen Methode. Es geht um die Existenz einer Beziehung zwischen der Ausführung des Aufrufers und der Ausführung des aufgerufenen. Wenn wir uns unsere System-Threads angesehen haben und festgestellt haben, dass sie DoThatAsync()aufgerufen wurden, aber nicht ausgeführt wurden, dass sie möglicherweise auf den Scheduler oder eine andere E / A warten, bedeutet dies nicht unbedingt, dass die aufrufende Methode Invoker()nicht ausgeführt wird - es gibt Arbeit, die ausgeführt werden könnte tun. Sicher, es ist vielleicht kurz awaitbevor DoThatAsync(), aber das ist nicht garantiert. Dies gilt nicht für die anderen Funktionen, sobald sie aufgerufen wurden - wenn sie anhalten,Invoker()hält an - egal was. Dies ist garantiert. Die Ausführung zwischen der Invoker()und der aufgerufenen synchronen Methode "existiert oder findet gleichzeitig statt".


Ich mag das eigentlich. Im Allgemeinen ist es der wilde Westen der willkürlichen Ausführung als "asynchron"
Cruncher

Ich denke auch, dass dies die beste Antwort ist.
Barmar

2

Konkrete Beispiele

Ich möchte einige Beispiele aus der Praxis hinzufügen und sie mit der Welt der Softwareentwicklung verbinden. Betrachten Sie zunächst etwas, von dem ich hoffe, dass es Ihrer intuitiven Definition von "synchron" entspricht: das Aufblitzen von Glühwürmchen unter bestimmten Umständen. Zweitens betrachten Sie die 4x100 Olympischen Relais Frauenrennen . Drittens, denken Sie an den alten Trumpf aus Militärfilmen: "Männer, synchronisieren Sie Ihre Uhren!"

Überlegen wir uns jetzt, was los ist. Beginnen wir mit der Beobachtung, dass all diese Dinge Prozesse oder zeitlich verlängerte Entitäten sind . Es macht keinen Sinn zu sagen, dass eine Schüssel "synchron" und Rock "asynchron" ist. Zweitens braucht man zwei für den Tango . Man kann nicht sagen, dass "ein Läufer synchron ist". Mit was synchronisieren? Damit zwei Prozesse gleichzeitig etwas tun können, muss einer oder beide warten , es sei denn, sie haben bereits genau dieselbe Frequenz und Phase .

Analyse

Wenn die Wörterbuchdefinition besagt, dass zwei Entitäten gleichzeitig auftreten oder existieren, passt dies sehr gut zum Konzept des Lichts von Glühwürmchen. Unglücklicherweise kann man schlampig sagen, dass das Licht "synchron" ist, wenn man sagt, dass die Beleuchtungsprozesse der Glühwürmchen synchronisiert sind.

Wie kann es also einer Gruppe von Glühwürmchen, die vermutlich nicht über Apple SmartWatch und NTP verfügen, gelingen, ihre hinteren Enden gleichzeitig zu blitzen? Nun, es ist ziemlich einfach, wenn sie die Möglichkeit haben, ein einheitliches Tempo einzustellen und kleine Anpassungen vorzunehmen. Sie blinken nur, und wenn mehr Leute direkt nach ihnen blinken, verlangsamen sie sich (erhöhen Sie die Verzögerung), während sie sich beschleunigen (verringern Sie die Verzögerung), wenn sie direkt vor ihnen blinken. So können sie mit einem einfachen Feedback-Prozess im Wesentlichen dasselbe Tempo und dieselbe Phase erreichen. Die wichtige Beobachtung hierbei ist, dass sie Synchronität erreichen, indem sie auf den richtigen Moment warten, um zu blinken .

Das 4x100-Rennen ist interessant, weil Sie beide Formen des Prozess-Timings in Aktion sehen: Die Läufer in einem Team sind synchronisiert, während die Läufer in verschiedenen Teams "asynchron" sind. Der zweite Läufer im Relais muss warten, bis der erste Läufer die Transferzone betritt . Die Übergabe ist ein synchrones Ereignis zwischen diesen beiden Läufern. Den Läufern auf verschiedenen Fahrspuren ist es jedoch egal, was auf einer anderen Fahrspur passiert , und sie verlangsamen mit Sicherheit nicht und geben ihre Handoffs synchron ab. Jede Spur von Läufern ist in Bezug aufeinander asynchron. Wiederum sehen wir, dass die Synchronisation das Warten erfordert, während die Asynchronität dies nicht tut.

Schließlich werden die Soldaten in einem Unternehmen (Zug, Feuerteam usw.) müssen ihre Uhren synchronisieren , so dass sie den Feind angreifen kann zugleich . Es kann sein, dass einige Soldaten ihre Positionen vor anderen erreichen oder die Gelegenheit haben, früher auf den Feind zu schießen. Ein gleichzeitiger Angriff ist jedoch aufgrund des Überraschungsmoments im Allgemeinen effektiver als ein willkürlicher Angriff. Um eine Synchronität zu erreichen, müssen viele Soldaten auf die festgelegte Zeit warten, um zu handeln.

Merkmal definieren

Warum diese Betonung auf das Warten? Das liegt daran, dass das Warten das bestimmende Merkmal ist, das synchrone von asynchronen Prozessen unterscheidet. Wenn Sie zwei Prozesse haben, von denen Sie nichts wissen, sollten Sie standardmäßig davon ausgehen, dass sie asynchron sind. Beispielsweise sind eine Paketzustellung und ein vorbeifahrender Krankenwagen höchstwahrscheinlich nicht synchronisiert. Um zu demonstrieren, dass zwei Prozesse tatsächlich synchronisiert sind, müssen Sie einen ganz besonderen Zeitpunkt finden: den Synchronisationspunkt .

Ein Zusteller, der ein Paket abgibt, und ein Krankenwagen, der jemanden ins Krankenhaus bringt, teilen im Allgemeinen keine Zeitpunkte, die wir als "Synchronisationspunkt" identifizieren. Auf der anderen Seite haben Glühwürmchen, die gleichzeitig blinken, jedes Mal einen Synchronisationspunkt, wenn sie blinken, Staffelläufer haben jedes Mal einen Synchronisationspunkt, wenn sie den Staffelstab abgeben, und Soldaten haben einen Synchronisationspunkt, wenn sie ihren Angriff starten. Wenn Sie einen oder mehrere Synchronisationspunkte identifizieren können, werden die Prozesse synchronisiert . Dies sollte leicht zu verstehen sein, da "syn-" ein griechisches Präfix ist, das "mit" oder "zusammen" bedeutet, und "chrono" die griechische Wurzel für "Zeit" ist. "Synchronisiert" bedeutet wörtlich "zur gleichen Zeit",

Grenzen

Beachten Sie, dass "Synchronisation" nicht unbedingt für die gesamte Lebensdauer eines oder beider Prozesse gilt. Ich würde argumentieren, dass es nur für "die Wartezeit bis einschließlich der Synchronisationspunkte" gilt. Somit können zwei Prozesse asynchron arbeiten, bis sie einen Zustand erreichen, in dem sie kommunizieren müssen. Dann werden sie synchronisiert, tauschen Informationen aus und fahren anschließend asynchron fort. Ein einfaches Beispiel ist, jemanden zum Kaffee zu treffen. Offensichtlich ist das Meeting ein Synchronisationspunkt (oder vielmehr viele), und die Tatsache, dass zwei Personen an diesem Punkt ankommen, zeigt die Synchronität. Wir würden das jedoch nicht sagen, weil sich zwei Menschen zum Kaffee trafen, diese beiden menschlichen Lebensind "synchronisiert". Vielleicht war dies der einzige Moment in ihrem Leben, den sie getroffen haben, und alles andere, was sie tun, ist ansonsten unabhängig.

Es ist auch nicht der Fall, dass zufällige Begegnungen Synchronität demonstrieren. Wenn sich zwei Fremde auf der Straße begegnen, ist die Tatsache, dass sie sich zu einem bestimmten Zeitpunkt an einem bestimmten Ort befinden, keine Synchronität. Auch nicht die Tatsache, dass eine Person auf einer Bank sitzt und auf den Bus wartet und eine andere zufällig vorbeigeht. Prozesse sind nur dann synchron, wenn sie sich zu einem bestimmten Zweck treffen .

Software-Verbindung

Lassen Sie uns nun über eine sehr grundlegende Aufgabe in der Software nachdenken: das Lesen aus einer Datei. Wie Sie wahrscheinlich wissen, ist der Massenspeicher normalerweise tausend- bis millionenfach langsamer als der Cache oder der Hauptspeicher. Aus diesem Grund bieten Betriebssysteme und Programmiersprachenbibliotheken im Allgemeinen sowohl synchrone als auch asynchrone E / A-Operationen an. Auch wenn Ihr Programm nur einen einzigen Thread hat, sollten Sie sich das Betriebssystem für die Zwecke dieser Diskussion als "separaten Prozess" vorstellen.

Synchronisieren

Wenn Sie einen "synchronen E / A-Lesevorgang" durchführen, muss Ihr Thread warten, bis die Daten verfügbar sind. An diesem Punkt wird der Vorgang fortgesetzt. Dies ähnelt einem Staffelläufer, der den Staffelstab an den nächsten Läufer abgibt. Stellen Sie sich stattdessen einen Staffellauf vor, bei dem nur zwei Läufer um die Strecke laufen und der zweite Läufer ebenfalls an den ersten Läufer zurückgibt.

In diesem Fall "passieren" der Programmthread und der OS-E / A-Prozess nicht gleichzeitig, weshalb es seltsam erscheint, zu sagen, dass diese Prozesse "synchronisiert" sind. Aber das ist die falsche Sichtweise! Das ist so, als würde man sagen: "Die Läufer eines Staffelteams laufen nicht zur gleichen Zeit, daher sind sie nicht synchronisiert." Tatsächlich sind beide Aussagen falsch! Die Läufer eines Staffelteams müssen und müssen zur gleichen Zeit laufen, aber nur zu einem ganz bestimmten Zeitpunkt: der Übergabe des Staffelstabs. Tatsächlich ist es nur dieser besondere Moment während des Rennens, der uns überzeugt, dass die Staffelteams von Anfang an synchronisiert sind! Wenn wir die E / A-Anforderung und die Antwort als "Taktstock" betrachten,

Wenn wir andererseits an etwas wie die Finite-Elemente-Analyse auf einem Supercomputer denken, müssen Tausende von Prozessen im Gleichschritt arbeiten, um einen massiven globalen Zustand zu aktualisieren. Selbst wenn einige der Knoten ihre Arbeit für einen bestimmten Zeitschritt vor anderen erledigen, müssen sie alle auf den Abschluss des Zeitschritts warten, da sich die Ergebnisse an die Nachbarn im Weltraum ausbreiten. Diese Art der Synchronisation ist wie bei den Glühwürmchen: Alle Akteure erledigen die gleiche Aufgabe.

Prozessvielfalt

Aus diesem Grund können wir einige Begriffe erfinden, um zu erkennen, dass drei Arten von Dingen vor sich gehen: "homogene Synchronität", "heterogene Synchronität" und "sequentielle Synchronität". Wenn also die Schauspieler dieselbe Aufgabe gleichzeitig ausführen (FEA, Glühwürmchen), sind sie "homogen". Wenn sie gleichzeitig verschiedene Aufgaben ausführen (Soldaten rennen oder kriechen oder schwimmen zu ihren Zielen, Physik oder Sound oder KI-Fäden in einem Spiel), sind sie "heterogen". Wenn sie Aufgaben einzeln ausführen, sind sie "sequentiell" (Relais-Läufer, blockierende E / A). Sie mögen sehr unterschiedlich aussehen, haben aber eine wesentliche Eigenschaft gemeinsam: Alle Arten von Akteuren führen einige Wartevorgänge durch, um sicherzustellen, dass alle zur gleichen Zeit am Synchronisationspunkt ankommen. zwischen Synchronisationspunkten oder "Ausführen der gleichen Aktion" ist für die Eigenschaft der Synchronität irrelevant.

Die Render-Pipelines in einer GPU sind synchron, da alle den Frame gemeinsam beenden und einen neuen Frame gemeinsam starten müssen. Sie sind homogen, weil sie die gleiche Arbeit leisten und alle gemeinsam aktiv sind. Die Hauptspielschleife eines Servers und die blockierenden E / A-Threads, die Remote-Eingaben verarbeiten, sind jedoch heterogen, da sie sehr unterschiedliche Aufgaben ausführen, und einige der E / A-Threads werden überhaupt nichts tun, weil nicht alle Die Verbindungen werden verwendet. Trotzdem sind sie synchronisiert, da sie den Status atomar teilen müssen (ein Spieler darf weder ein teilweises Update der Spielwelt sehen, noch darf der Server nur ein Fragment der Spielereingaben sehen).

Async

Betrachten wir nun einen "asynchronen E / A-Lesevorgang". Wenn Ihr Programm eine Anforderung an das Betriebssystem sendet, Daten aus dem Speicher zu lesen, wird der Aufruf sofort zurückgegeben . Lassen Sie uns Rückrufe ignorieren und uns auf das Polling konzentrieren. Im Allgemeinen entspricht der Moment, in dem Daten für Ihr Programm verfügbar sind, für den Thread Ihres Programms keinem bestimmten Zeitpunkt. Wenn Ihr Programm nicht explizit auf die Daten wartet, weiß der Thread nicht einmal genau, wann dieser Moment eintritt. Es wird nur festgestellt, dass die Daten bei der nächsten Überprüfung warten.

Es gibt keine spezielle Besprechungszeit, zu der das Betriebssystem und der Programmthread die Übergabe der Daten vereinbaren. Sie sind wie zwei Schiffe, die in der Nacht vorbeifahren. Die Asynchronität ist durch diese Abwesenheit von Wartezeiten gekennzeichnet. Natürlich wartet der Programmthread oft auf die E / A-Operation, aber das muss nicht sein. Während der E / A-Abruf ausgeführt wird, kann er problemlos weitere Berechnungen durchführen und erst später prüfen, ob noch etwas Zeit übrig ist. Sobald das Betriebssystem mit dem Abrufen von Daten fertig ist, wartet es natürlich auch nicht mehr. Es legt die Daten einfach an einem geeigneten Ort ab und erledigt das Geschäft. In diesem Fall gibt das Programm den Taktstock an das Betriebssystem weiter und das Betriebssystem kommt später wieder, wirft den Taktstock zusammen mit den Daten auf den Boden und verlässt die Spur. Das Programm kann warten oder nicht warten, um die Übergabe zu erhalten.

Parallelität

Wenn wir eine Funktion in Software als "asynchron" markieren, bedeutet dies oft, dass wir Parallelität wünschen . Denken Sie jedoch daran, dass Parallelität keine Synchronität impliziert . Die Glühwürmchen sind ein gutes Beispiel, weil auch sie synchrones und asynchrones Verhalten zeigten. Während die meisten Fliegen im Gleichschritt blitzten, stimmten viele offensichtlich nicht mit dem Rest der Gruppe überein und blitzten eher zufällig. Die Fliegen haben vielleicht gleichzeitig gewirkt , aber sie waren nicht alle synchronisiert .

Wenn wir nun einen Code als "asynchron" markieren, sieht das lustig aus, weil der Rest des Codes, der nicht so markiert ist, "synchron" ist. Was bedeutet das überhaupt? Bestanden wir nicht darauf, dass "Synchronisation" zwei zum Tango erforderte? Aber was ist, wenn es sich um Code handelt, der in einem einzelnen Thread ausgeführt wird? In diesem Fall müssen wir einen Schritt zurücktreten und uns ein Programm als eine Folge von Zuständen und Übergängen zwischen diesen Zuständen vorstellen. Eine Anweisung in einem Programm bewirkt einen Zustandsübergang. Wir können es uns als einen "Mikroprozess" vorstellen, der mit der Aussage beginnt und endet. Die durch die Sprache definierten Sequenzpunkte sind tatsächlich die Synchronisationspunkte dieser "Mikroprozesse". Und so können wir einen Single-Threaded anzeigen,

Die Integrität der Programmiersprache garantiert, dass Statusaktualisierungen nicht über Anweisungen hinweg stören, und die Sequenzpunkte definieren Grenzen, über die der Compiler keine beobachtbaren Optimierungen vornehmen darf. Beispielsweise kann die Reihenfolge der Auswertung von Ausdrücken in einer Anweisung undefiniert oder unterbestimmt sein, sodass der Compiler die Möglichkeit hat, die Anweisung auf verschiedene Arten zu optimieren. Zu Beginn der nächsten Anweisung sollte sich das Programm jedoch in einem genau definierten Zustand befinden, wenn der PL selbst einwandfrei ist.

Inzwischen sollte klar sein, was wir unter "asynchron" verstehen. Dies bedeutet genau, dass der implizite Synchronisationsvertrag innerhalb eines Codeblocks für den asynchronen Block ausgenommen ist. Es ist zulässig, den Programmstatus unabhängig zu aktualisieren, ohne die Sicherheitsgarantien zu erfüllen, die normalerweise durch das sequentielle (konsistente, synchrone) Rechenmodell impliziert werden. Das bedeutet natürlich, dass wir besonders darauf achten müssen, dass wir den Programmstatus nicht inkonsistent zerstören. Dies bedeutet normalerweise, dass wir eine eingeschränkte, explizite Synchronisation einführen, um mit dem asynchronen Block zu koordinieren. Beachten Sie, dass dies bedeutet, dass der asynchrone Block zu verschiedenen Zeiten sowohl asynchron als auch synchron sein kann! Wenn wir uns jedoch daran erinnern, dass die Synchronisation lediglich das Vorhandensein eines Synchronisationspunkts anzeigt, sollten wir keine Probleme haben, diesen Begriff zu akzeptieren.


Sie könnten alle Ihre Beispiele hier entfernen, mit Ausnahme des Staffellaufs (der Software-Begriffe von Synchronität und Asynchronität deutlich veranschaulicht, während die anderen dies nicht tun), und Ihre Antwort würde sich erheblich verbessern.
Robert Harvey

Ich denke, die anderen Beispiele zeigen gleichzeitiges Handeln im Vergleich zu heterogenem Handeln, von dem ich glaube, dass es einen großen Teil der Verwirrung im OP verursacht hat.
Rasenmäher Man

1

Eine Möglichkeit, darüber nachzudenken, sind SIMD- Anweisungen wie AVX . Hier sind einige Beispiele, wie sie verwendet werden.

Mit synchronen SIMD-Befehlen können Sie mehrere Berechnungen gleichzeitig im selben Thread ausführen, indem Sie einen einzelnen Befehl für mehrere Daten ausführen.

Während asynchrones Multithreading es Ihnen ermöglicht, mehrere Berechnungen zu "wahrscheinlich" "etwas" "ähnlichen" Zeiten durchzuführen.

Kombinieren Sie dies mit den folgenden Definitionen:

synchron Adjektiv syn · chro · nous | \ ˈSiŋ-krə-nəs, ˈsin-

1: geschieht, bestehende oder zu entstehen genau gleichzeitig [Hervorhebung von mir]

asynchron Adjektiv asyn · chro · nous | \ (ˌ) ā-ˈsiŋ-krə-nəs, -ˈsin- \

1: [...]: nicht synchron


1

Eine Analogie, die mir den Unterschied zwischen Synchronisieren und Asynchronisieren und Multithreading verdeutlicht hat, ist die eines Kochs in der Küche.

Stellen Sie sich vor, Sie machen Pasta. Sie haben drei Schritte:

  1. Die Nudeln kochen und abtropfen lassen
  2. Sauce zubereiten
  3. Kombinieren Sie Pasta und Sauce

Synchrone Methode. Im synchronen Szenario erledigt nur eine Person (Thread) die gesamte Arbeit nacheinander. Zuerst kochst du die Nudeln und stehst da und siehst zu, wie sie kochen. Dann lassen Sie es ab und legen es beiseite. Dann bereiten Sie die Sauce. Wenn die Sauce fertig ist, nehmen Sie die Nudeln, mischen Sie sie mit der Sauce und Ihr Gericht ist fertig. Das Problem hier ist, dass es ineffizient ist. Da Sie nacheinander synchron arbeiteten, konnten Sie nicht an der Sauce arbeiten, während die Nudeln kochten. So hast du Zeit verschwendet und deine Nudeln wurden kalt, während die Sauce zubereitet wurde.

Asynchrone Methode. In diesem Szenario gibt es immer noch nur einen Koch (Faden), aber während die Nudeln kochen, gehen Sie und machen Sie Ihre Sauce. Wenn die Nudeln gekocht sind, müssen Sie erst die called-backSauce zubereiten, um sie abzusaugen, und dann müssen Sie called-backdie Sauce wieder zu Ende bringen. Das ist jetzt effizienter, weil Sie Zeit gespart haben und Ihre Pasta nicht so lange auf die Sauce warten musste.

Multithread-Methode. Stellen Sie sich vor, Sie stellen einen neuen Koch ein. Jetzt hast du zwei Köche (Threads). Während ein Koch Nudeln macht, macht der zweite Koch Sauce. Ist es in diesem Szenario notwendig? Nein, denn die Herstellung von Nudeln ist einfach genug, um mit asynchronen Methoden effizient zu sein. Die Verwaltung mehrerer Köche ist ein zusätzlicher Aufwand. Wenn Sie jedoch ein komplizierteres Gericht oder mehrere Gerichte gleichzeitig zubereiten, sind mehrere Köche nützlich.


Dies ist eigentlich eine ziemlich gute Analogie.
Robert Harvey

0

Eine gute Frage und Begriffe, die oft unterschiedlich verwendet werden und zu Verwirrung führen.

Meine Antwort ist, dass diese Begriffe relativ sind - und was sie relativ sind, ist das Hauptprogramm, das ausgeführt wird (oder manchmal zu einem Thread).

Diese Begriffe geben einen Hinweis auf den internen Betrieb und das Timing eines Programms, ob Nachrichten blockierend (synchron) oder nicht blockierend (asynchron) gesendet oder empfangen werden. Wenn ein (der Haupt-) Thread durch Senden oder Empfangen blockiert wird, ist dies "synchron" und wenn er irgendwie unterbrochen werden kann, ist er "asynchron". In diesen Begriffen geht es um Implementierungen, die sowohl (regulär) funktionieren als auch Ereignisse verarbeiten.

(IMHO, natürlich) Sobald eine Nachricht auf der Leitung ist, gibt es keine Synchronisierung oder Asynchronisierung mehr. Bei der Nachrichtenübermittlung gibt es einen Absender und einen Empfänger, von denen jeder unabhängig von den anderen eine Synchronisierungs- oder Asynchronisierungsimplementierung haben kann. Sobald jedoch eine Nachricht in der Leitung ist, handelt es sich lediglich um eine Nachricht, die nicht mehr synchronisiert oder asynchronisiert ist. Wir können eine Nachricht als Anforderung, Antwort oder Einwegnachricht klassifizieren, aber dies ist orthogonal zu Synchronisierung und Asynchronisierung (was darauf verweist, ob die Implementierung das Warten blockiert oder auf irgendeine Weise unterbrochen werden kann).


Non-Blocking unterscheidet sich von asynchron,
User207421

1
@ user207421 bitte näher erläutern, da ich sie in diesem Zusammenhang als Synonyme bezeichnen würde
Jacob Raihle

0

"synchron" bedeutet, dass zwei Ereignisse gleichzeitig auftreten - aber welche Ereignisse?

Wenn wir "synchrone Ausführung" sagen, meinen wir, dass der Aufrufer und der Angerufene gleichzeitig ausgeführt werden (dh auf einem Stapel). Das ist wahrscheinlich die Bedeutung, die Sie suchen.

Wenn wir "synchrones Logikgatter" sagen, meinen wir, dass das Logikgatter mit dem CPU-Takt synchronisiert ist.

Wenn wir im Kontext verteilter Systeme "synchrones Modell" sagen, meinen wir, dass alle Knoten ihre Programme in Sperrschritten ausführen und die in Schritt n gesendeten Nachrichten garantiert am Anfang von Schritt n + 1 ankommen.

Wenn die Java-Sprachspezifikation besagt, dass ein Thread mit einem anderen "synchronisiert", bedeutet dies, dass die Aktionen in den verschiedenen Threads "zur gleichen Zeit" (in Bezug auf das Ereignis vor der Beziehung) stattfinden. Und wenn sie sagen, dass zwei Threads den Zugriff auf ein Objekt synchronisieren, bedeuten sie tatsächlich, dass die Threads miteinander synchronisiert werden, um sicherzustellen, dass sie niemals gleichzeitig am Objekt arbeiten.

... und ich bin mir ziemlich sicher, dass Sie das Wort in noch mehr Zusammenhängen anwenden können, denn "Dinge passieren zur gleichen Zeit" ist eine ziemlich allgemeine Idee :-)


0

Ich denke, der Schlüssel Ihrer Verwirrung kann folgendermaßen zusammengefasst werden:

Das Attribut async bedeutet, dass das Skript ausgeführt wird, sobald es heruntergeladen wurde, auch wenn der HTML-Code noch analysiert wird

Zu erkennen ist, dass dieser Satz keinen Sinn ergibt, weil er eine unmögliche Situation beschreibt. Wenn der HTML-Code noch analysiert wird, wird der Skript-Download-Prozess nicht einmal gestartet, wenn er asynchron ist.

Synchron bedeutet in der Programmierung:

Alle Daten, die Sie interessieren, sind zum Zeitpunkt der Ausführung Ihrer Logik bereits im Speicher vorhanden

Während asynchron bedeutet:

Einige der Daten, an denen Sie interessiert sind, existieren noch nicht und erst zu einem späteren Zeitpunkt

In der Tat ist es dieser nicht aktuelle Aspekt der asynchronen Programmierung, der normalerweise die Menschen verwirrt.

Wie Skripte normalerweise geladen werden, wird die HTML-Analyse angehalten, dann wird das Skript heruntergeladen, wenn der Skript-Download abgeschlossen ist, wird es ausgeführt und dann wird die HTML-Analyse fortgesetzt. Die HTML-Analyse und die Skriptausführung erfolgen zur "gleichen" Zeit (die gleiche Zeit bedeutet zusammen, nicht gleichzeitig).

Wie asyncSkripte geladen werden, zeigt der HTML-Code das Skript-Tag an und erinnert sich dann daran, das Skript in der Zukunft herunterzuladen , analysiert es jedoch weiterhin. Die HTML-Analyse wird für das Herunterladen von Skripten nicht angehalten. Später , nachdem das HTML-Parsing abgeschlossen ist, werden alle asynchronen Skripte heruntergeladen und ausgeführt. Die HTML-Analyse und die Skriptausführung finden nicht zur gleichen Zeit statt (in diesem Fall werden sie getrennt ausgeführt, dh zur gleichen Zeit zusammen).

Um es zusammenzufassen:

  • Synchrone Skripte werden zusammen mit dem HTML-Code analysiert.

  • Asynchrone Skripte werden in Zukunft separat analysiert.

Die Definition der asyncEigenschaft ist also nicht, dass das Skript ausgeführt wird, sobald es heruntergeladen wurde - dies gilt sowohl für synchrone als auch für asynchrone Skripte. Die Definition von async ist, dass die HTML-Analyse nicht auf das Herunterladen des Skripts wartet .

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.