/ / Kann ich mich darauf verlassen, dass das Betriebssystem Threads "optimal" terminiert (Parallelisierung) - Java, Multithreading, Betriebssystem

Ich kann mich darauf verlassen, dass das Betriebssystem Threads "optimal" (Parallelisierung) einrichtet - Java, Multithreading, Betriebssystem

Afaik: Die optimale Anzahl von Threads für Daten, die für die parallele Verarbeitung geeignet sind, ist die Anzahl der Kerne - da jeder Thread (theoretisch) ein eigener Kern zum Laufen. Bei CPUs, die in der Lage sind, Hyper-Threading durchzuführen, ist dies die doppelte Anzahl von Kernen. Bitte korrigieren Sie mich, wenn ich falsch liege.

Meine Frage ist, ob das zugrunde liegende Betriebssystem (Linux,Winodws OSX) erkennt automatisch meine "Absicht" und z. ordnet jeden Thread einem einzelnen Kern zu, vorausgesetzt, ich habe z. 8 Kerne und dementsprechend 8 Threads, von denen jeder auf einem "Zeitaufwendig"aufgabe?

Oder umgekehrt: Ist es möglich, Kernen Threads zuzuweisen (insbesondere in Java)

Antworten:

2 für die Antwort № 1

So viel ich weiss: Die optimale Anzahl von Threads für Daten, die für die Parallelverarbeitung geeignet sind, ist die Anzahl von Kernen - da jeder Thread (theoretisch) einen eigenen Kern zum Ausführen hat. Bei CPUs, die in der Lage sind, Hyper-Threading durchzuführen, ist dies die doppelte Anzahl von Kernen. Bitte korrigieren Sie mich, wenn ich falsch liege.

Es ist weitaus komplizierter.

Es kommt darauf an, wofür Sie optimieren. Wenn Sie für eine effiziente (d. H. Kostengünstige) Nutzung der verfügbaren Hardware optimieren, ist diese selten optimal. Wenn einer der Threads einige Zeit warten muss aus irgendeinem Grund, dann eine eins zu eins Zuordnung von Threads zuPhysikalische Kerne führen zu einer Unterauslastung der Kerne. Wenn diese Kerne für etwas anderes verwendet werden könnten (z. B. zum Ausführen anderer Programme!), Ist Ihre Verwendung nicht optimal.

Selbst wenn Sie nur auf die Anwendungsgeschwindigkeit hin optimieren, ist eine Eins-zu-Eins-Zuordnung nicht unbedingt die beste Strategie.

  • Jede Anwendung + Workload hat einen "Sweet Spot"Bezug auf die Anzahl der Threads. Dies hängt vom Umfang und der Art der internen Konflikte sowie vom Umfang und der Art der Kommunikation mit externen Systemen (Dateisysteme, Netzwerke usw.) ab.

  • Wenn Sie eine starre Ein-Thread-pro-Kern-Regel haben, können Sie höchstens N Threads auf einem N-Kern-System haben.

  • Wenn dieses N deutlich unter der Anzahl der "Sweet Spot" -Threads liegt, sind die Kerne möglicherweise häufig im Leerlauf.

Nun zum Hyper-Threading.

Hyperthreads geben Ihnen möglicherweise zusätzliche CPUZyklen pro Taktzyklus. Sie geben Ihnen jedoch keine zusätzlichen Zyklen im Speichersystem. Die Leistungsmerkmale eines "virtuellen Kerns" mit Hyperthread unterscheiden sich von denen eines physischen Kerns ... und für reale Anwendungen ist der Unterschied erheblich x Annahme ist ohne Grundlage.

Meine Frage ist, ob das zugrunde liegende Betriebssystem (Linux,Winodws OSX) erkennt automatisch meine "Absicht" und z. ordnet jeden Thread einem einzelnen Kern zu, vorausgesetzt, ich habe z. 8 Kerne und dementsprechend 8 Threads, in denen jeder von ihnen eine "zeitaufwendige" Aufgabe ausführt?

Nicht unbedingt.

  • Das Betriebssystem muss andere Dinge berücksichtigen, diepassieren auf dem System. Andere Anwendungen, die Daemons usw., die Ihren Desktop verwalten, die sich mit Dateisystemen und Netzwerkprotokollen befassen.

  • Das Betriebssystem (und JVM) reagieren in der Regel nur auf dieWas ist bei der Planung von Entscheidungen bereits geschehen? Das Vorhersagen des zukünftigen Verhaltens auf der Grundlage des bisherigen Verhaltens (auf dieser Ebene) ist nicht kosteneffektiv ... und moderne Betriebssysteme versuchen dies nur auf einer sehr groben / heuristischen Ebene. Eine perfekte (optimale) Vorhersage ist unmöglich, und selbst wenn Sie dies tun perfekte Kenntnisse haben, ist das Scheduling-Problem NP-schwer.

Theoretisch könnte ein Anwendungsprogrammierer entwerfeneinen optimalen Zeitplan. In der Praxis sind die meisten Anwendungen dafür zu kompliziert UND es ist schwierig, die anderen "zufälligen" Dinge zu berücksichtigen, die auf dem System geschehen.

Oder umgekehrt: Ist es möglich, Kernen Threads zuzuweisen (insbesondere in Java)?

Es gibt keine praktische Möglichkeit, dies zu tun. (Siehe die Antwort von @ ksmonkey123) Auf jeden Fall nicht portabel.

Und es ist wahrscheinlich unwahrscheinlich, dass es in Java funktioniertsowieso. Java hat das zusätzliche Problem, dass es versteckte Threads gibt, die Dinge hinter dem Hintergrund der Anwendung tun (z. B. die Garbage Collector- und Finalizer-Threads), und die Java-Speicherverwaltung ist schwerer vorherzusagen und schwerer abzustimmen.


2 für die Antwort № 2

Nein, Sie können einem bestimmten Kern in keinen Thread zuweisen Java (Java Multithreading - Weisen Sie den Prozessorkernen Threads zu)

Im Allgemeinen können Sie davon ausgehen, dass das Betriebssystem die Laufzeit der Threads mehr oder weniger optimal verwaltet. Dies schließt z.B. Verhinderung von Hunger.