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.
- Ein asynchrones Programm übertrifft einfach ein Synchronisierungsprogramm, indem es bei jeder E / A zwischen Aufgaben wechselt.
- 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?
Antworten:
quelle
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
quelle
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.
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 model
und auch, wann usw. zu verwenden ist: https://www.youtube.com/watch?v=kdzL3r-yJZYHoffe das ist hilfreich.
quelle
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.
quelle
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.
quelle
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.
quelle