Aus logischer Sicht kann eine Anwendung Dutzende oder Hunderte von Threads benötigen, von denen einige die meiste Zeit schlafen werden, aber sehr wenige werden immer gleichzeitig ausgeführt. Die Frage ist: Macht es Sinn, mehr gleichzeitige Threads zu erzeugen als die Prozessoren in einem System, oder ist es eine Verschwendung?
Ich habe einige Server-Anwendungen gesehen, die einen Scheduler zur logischen Verwaltung von Aufgaben (oft als Jobs bezeichnet) implementieren, aber auch viele Threads erzeugen, so dass ich nicht sehe, wo der Vorteil liegt.
Vielen Dank im Voraus.
Sicher. Wenn Ihre Software häufig Festplatten- oder Netzwerk-IO verwendet, können Sie den Durchsatz oft durch Hinzufügen weiterer Threads verbessern. Diese zusätzlichen Threads werden wach und tun Dinge, während die anderen Threads auf IO blockieren.
Andere haben über Situationen gesprochen, in denen es fast sicher Sinn ergibt (wenn Sie irgendeine Art von langsamem IO machen).
Es könnte nicht eine gute Idee sein, wenn:
und
In diesem Fall besteht die Möglichkeit, unnötige Cache-Fehler zu verursachen.
Kurze Antwort ist "Ja".
Selbst wenn Sie mehr Multithreading auf einer Multiprozessor-Umgebung nutzen könnten, ist es immer noch eine nützliche Technologie auf einem einzelnen Prozessor, hauptsächlich weil Sie dem Prozess-Scheduler etwas Arbeit zuweisen, der viel bessere Informationen als Sie haben sollte haben.
Wenn Sie nicht multithread sind, werden Sie am Ende den Planungsjob selbst erledigen, was eine gute Sache sein könnte, wenn Sie das brauchen, aber höchstwahrscheinlich sowohl mühsam als auch ineffizient sein wird
Immer wenn eine Aufgabe auf eine E / A-Operation wartet, ist es sinnvoll, sie in einen Thread einzufügen und hochzufahren. Es ist sehr wahrscheinlich, dass Ihr Thread ausgesetzt wird, während Sie darauf warten, dass der E / A-Vorgang beendet wird. Wenn es aufgeweckt wird, wartet das Ergebnis darauf.
Da alle modernen Betriebssysteme Multi-Tasking sind, bekommt jeder Thread einen Zeitanteil vom Prozessor. Es ist keine tatsächlich gleichzeitige Ausführung, aber da der Prozessor Tausende von Anfragen pro Sekunde verarbeiten kann, ist es eine "scheinbare" gleichzeitige Ausführung.
Also, wenn es der Fall braucht, macht es Sinn, Multi-Thread auf einem einzigen Prozessor zu betreiben.
Ich habe festgestellt, dass beim Schreiben von Datenparsern, die größere Datenmengen über ein Netzwerk verarbeiten, es am besten ist, einen Thread für jeden Buchstaben des Alphabets zu erstellen und das Programm CPU- und Speichergebundener zu machen. Die E / A-Begrenzung, die durch Netzwerk- und Plattenoperationen ererbt wird, ist ein großer Engpass, so dass Sie auch mit den anderen Datendateien beginnen können, anstatt die Arbeit sequenziell zu erledigen.
Auf einem Quadcore wäre es sicherlich sinnvoll, mehr als vier Threads zu starten. Es ist unwahrscheinlich, dass diese 4 Threads auf mehr als einen der Kerne verteilt sind, insbesondere bei den heutigen Prozessorgeschwindigkeiten.
Laut Herb Sutter (einer der führenden Experten für Nebenläufigkeit), einer der Säulen der Parallelität ist Reaktionsfähigkeit und Isolation über asynchrone Agenten . Die Zusammenfassung ist:
Reagieren Sie, indem Sie Aufgaben unabhängig ausführen und Aufgaben asynchron ausführen und über Nachrichten kommunizieren.
Toller Artikel (und die Serie als Ganzes!). Ich warte immer noch auf das Buch.
Tags und Links multithreading concurrency