Macht es Sinn, mehr als einen Thread pro Prozessor zu erzeugen?

8

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.

    
Trap 02.02.2009, 15:17
quelle

9 Antworten

24

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.

    
benjismith 02.02.2009, 15:21
quelle
12

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:

  • Ihre Threads machen CPU-gebundene Arbeit

und

  • die Threads, die jeweils eine Menge (d. h. signifikant im Vergleich zur Cachegröße) Speicher verwenden möchten, der sich nicht überschneidet

In diesem Fall besteht die Möglichkeit, unnötige Cache-Fehler zu verursachen.

    
dmckee 02.02.2009 15:28
quelle
6

Dies kann sinnvoll sein, wenn

  1. Ihr Programmdesign profitiert davon, dass Sie parallele Aufgaben haben, die am besten in Threads implementiert sind, oder

  2. Einige Ihrer Threads sind I / O-gebunden, sodass sie die Prozessoren / Kerne nicht selbst verwenden.

mghie 02.02.2009 15:21
quelle
4

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

    
Axelle Ziegler 02.02.2009 15:20
quelle
3

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.

    
Boris Pavlović 02.02.2009 15:19
quelle
3

Einer der Vorteile ist, wenn Sie Ihre Hardware aktualisieren, die wahrscheinlich mehr Prozessoren / Kerne bekommen wird.

    
mouviciel 02.02.2009 15:20
quelle
2

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.

    
Sesh 02.02.2009 15:20
quelle
1

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.

    
jparanich 26.03.2009 22:11
quelle
1

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.

    
Daniel Lidström 15.10.2010 14:35
quelle

Tags und Links