Threads vs. Async

81

Ich habe in diesem wirklich guten Artikel über das Threaded-Modell der Programmierung im Vergleich zum asynchronen Modell gelesen. http://krondo.com/blog/?p=1209

Der Artikel erwähnt jedoch die folgenden Punkte.

  1. Ein asynchrones Programm übertrifft einfach ein Synchronisierungsprogramm, indem es bei jeder E / A zwischen Aufgaben wechselt.
  2. Threads werden vom Betriebssystem verwaltet.

Ich erinnere mich, dass ich gelesen habe, dass Threads vom Betriebssystem verwaltet werden, indem TCBs zwischen der Ready-Queue und der Waiting-Queue (unter anderem) verschoben werden. In diesem Fall verschwenden Threads auch keine Zeit mit Warten, oder?

Was sind angesichts der oben genannten Vorteile von asynchronen Programmen gegenüber Thread-Programmen?


quelle
5
Nein, ich meinte Threaded vs. Async. Ich habe Punkt eins nur erwähnt, weil ich ihn aus dem Artikel verstanden habe.

Antworten:

78
  1. Es ist sehr schwierig, threadsicheren Code zu schreiben. Mit asynchronem Code wissen Sie genau, wo sich der Code von einer Aufgabe zur nächsten verschiebt, und die Rennbedingungen sind daher viel schwieriger zu finden.
  2. Threads verbrauchen eine angemessene Datenmenge, da jeder Thread einen eigenen Stapel haben muss. Bei asynchronem Code teilt sich der gesamte Code denselben Stapel, und der Stapel wird klein gehalten, da der Stapel zwischen den Aufgaben kontinuierlich abgewickelt wird.
  3. Threads sind Betriebssystemstrukturen und bieten daher mehr Speicherplatz für die Plattform. Bei asynchronen Aufgaben gibt es kein solches Problem.
Doron
quelle
12
Um etwas näher darauf einzugehen: 1. Der E / A-Teil des Thread-Codes ist relativ einfach, aber die Verwaltung des gemeinsamen Status zwischen Threads (mithilfe von Sperren / Warteschlangen / usw.) ohne Race-Bedingungen macht es schwierig. Die Verwendung eines asynchronen Modells bedeutet, dass Sie gleichzeitig weniger los sind, sodass Rennen leicht vermieden werden können. 2/3. Jeder Thread belegt mindestens eine Speicherseite des Stapels (normalerweise 4 KB oder 8 KB) sowie eine unbekannte Speichermenge für andere Datenstrukturen, die sich auf den Status dieses Threads beziehen.
Dobes Vandermeer
12

Es gibt zwei Möglichkeiten, Threads zu erstellen:

Synchrones Threading - Der übergeordnete Thread erstellt einen (oder mehrere) untergeordnete Threads und muss dann warten, bis jedes untergeordnete Thread beendet ist. Synchrones Threading wird häufig als Fork-Join-Modell bezeichnet .

asynchrones Threading - Eltern und Kind werden gleichzeitig / unabhängig voneinander ausgeführt. Multithread-Server folgen normalerweise diesem Modell.

Ressource - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

Aidan Melen
quelle
7
  1. Angenommen, Sie haben zwei Aufgaben, für die keine E / A erforderlich sind (auf einem Multiprozessor-Computer). In diesem Fall übertreffen Threads Async. Weil Async wie ein einzelnes Thread-Programm Ihre Aufgaben der Reihe nach ausführt. Threads können jedoch beide Aufgaben gleichzeitig ausführen.

  2. Angenommen, Sie haben zwei Aufgaben, die E / A (auf einem Multiprozessor-Computer) umfassen. In diesem Fall sind sowohl Async als auch Threads mehr oder weniger gleich (die Leistung kann je nach Anzahl der Kerne, Zeitplanung, Prozessintensität der Aufgabe usw. variieren). Außerdem benötigt Async weniger Ressourcen, ist wenig aufwendig und weniger komplex für das Programmieren über Multithread-Programme.

Wie es funktioniert? Thread 1 führt Task 1 aus, da er auf E / A wartet und in die Warteschlange für wartende E / A verschoben wird. In ähnlicher Weise führt Thread 2 Task 2 aus, da er auch E / A umfasst und in die Warteschlange für E / A-Wartezeiten verschoben wird. Sobald die E / A-Anforderung gelöst ist, wird sie in die Bereitschaftswarteschlange verschoben, damit der Scheduler den Thread für die Ausführung planen kann.

Async führt Task 1 aus und ohne auf den Abschluss der E / A zu warten, wird es mit Task 2 fortgesetzt. Anschließend wird darauf gewartet, dass die E / A beider Aufgaben abgeschlossen sind. Die Aufgaben werden in der Reihenfolge des E / A-Abschlusses ausgeführt.

Async eignet sich am besten für Aufgaben wie Webdienstaufrufe, Datenbankabfrageaufrufe usw., Threads für prozessintensive Aufgaben.

Das folgende Video erklärt Async vs Threaded modelund auch, wann usw. zu verwenden ist: https://www.youtube.com/watch?v=kdzL3r-yJZY

Hoffe das ist hilfreich.

Lakshmipathi
quelle
2
Ein Link zu einer möglichen Lösung ist immer willkommen. Fügen Sie jedoch einen Kontext um den Link hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist. Zitieren Sie immer den relevantesten Teil eines wichtigen Links, falls die Zielwebsite nicht erreichbar ist oder dauerhaft offline geht. Berücksichtigen Sie, dass kaum mehr als ein Link zu einer externen Website ein möglicher Grund dafür ist, warum und wie einige Antworten gelöscht werden. .
Machavity
4

Beachten Sie zunächst, dass viele Details zur Implementierung und Planung von Threads sehr betriebssystemspezifisch sind. Im Allgemeinen sollten Sie sich keine Gedanken über Threads machen müssen, die aufeinander warten, da das Betriebssystem und die Hardware versuchen, eine effiziente Ausführung zu gewährleisten, sei es asynchron auf einem Einzelprozessorsystem oder parallel auf mehreren Prozessoren.

Sobald ein Thread auf etwas gewartet hat, z. B. E / A, kann er als lauffähig angesehen werden. Threads, die ausgeführt werden können, werden bald für die Ausführung geplant. Ob dies als einfache Warteschlange oder als etwas Anspruchsvolleres implementiert ist, ist wiederum betriebssystem- und hardwarespezifisch. Sie können sich den Satz blockierter Threads eher als einen Satz als als eine streng geordnete Warteschlange vorstellen.

Beachten Sie, dass auf einem Einzelprozessorsystem die hier definierten asynchronen Programme Thread-Programmen entsprechen.

Joe Kearney
quelle
0

Asynchrone E / A bedeutet, dass der Treiber bereits einen Thread enthält, der die Aufgabe erledigt. Sie duplizieren also die Funktionalität und verursachen einen gewissen Overhead. Andererseits ist häufig nicht dokumentiert, wie genau sich der Treiber-Thread verhält. In komplexen Szenarien ist es sinnvoll, einen eigenen Thread zu implementieren, wenn Sie das Timeout- / Abbruch- / Start- / Stopp-Verhalten und die Synchronisierung mit anderen Threads steuern möchten. Manchmal ist es auch einfacher, synchron zu argumentieren.

Boris Geller
quelle
5
So funktioniert asynchrone E / A überhaupt nicht. Grundsätzlich ist die E / A ereignisgesteuert (Sie initiieren eine E / A für ein Gerät, später schließt das Gerät sie ab und teilt Ihnen dies hoffentlich mit einem Interrupt mit). Es gibt einige Arten von E / A (wie Festplatten-E / A), bei denen der Treiber aus etwas unklaren Gründen einen Kernel-Thread verwendet. Bei Netzwerken handelt es sich jedoch um asynchrone Vorgänge.
Glyphe
0

sehen http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

Die Verwendung des Blockierens von Systemaufrufen in Benutzer-Threads (im Gegensatz zu Kernel-Threads) oder Fasern kann jedoch problematisch sein. Wenn ein Benutzer-Thread oder eine Glasfaser einen Systemaufruf ausführt, der blockiert, können die anderen Benutzer-Threads und -Fasern im Prozess erst ausgeführt werden, wenn der Systemaufruf zurückgegeben wird. Ein typisches Beispiel für dieses Problem ist die Ausführung von E / A: Die meisten Programme sind so geschrieben, dass sie E / A synchron ausführen. Wenn eine E / A-Operation eingeleitet wird, wird ein Systemaufruf ausgeführt, der erst nach Abschluss der E / A-Operation zurückgegeben wird. In der Zwischenzeit wird der gesamte Prozess vom Kernel "blockiert" und kann nicht ausgeführt werden, wodurch andere Benutzer-Threads und -Fasern im selben Prozess nicht mehr ausgeführt werden können.

Demnach wird Ihr gesamter Prozess möglicherweise blockiert, und es wird kein Thread geplant, wenn ein Thread in IO blockiert wird. Ich denke, dies ist os-spezifisch und wird nicht immer gehalten.

gleery
quelle