Bitte ich habe mich über etwas verwirrt. Was ich weiß ist, dass die maximale Anzahl von Threads, die gleichzeitig auf einer normalen CPU eines modernen Computers laufen können, von 8 bis 16 Threads reicht. Auf der anderen Seite können Tausende von Threads unter Verwendung von GPUs gleichzeitig ausgeführt werden, ohne dass der Scheduler einen Thread unterbricht, um einen anderen zu planen. Auf mehreren Posts als: Java virtuelle Maschine - maximale Anzahl von Threads Ссылка Leute sagen, dass sie Tausende von Java-Threads gleichzeitig auf normalen CPUs ausführen. Wie konnte das sein ?? Und wie kann ich die maximale Anzahl von Threads kennen, die gleichzeitig ausgeführt werden können, damit mein Code sie selbst dynamisch entsprechend der zugrundeliegenden Architektur anpasst.
Threads sind nicht an die Anzahl der verfügbaren Prozessoren / Kerne gebunden oder durch diese begrenzt. Der Betriebssystem-Scheduler kann zwischen einer beliebigen Anzahl von Threads auf einer einzelnen CPU hin und her wechseln. Dies ist die Bedeutung von "präemptivem Multitasking".
Wenn Sie mehr Threads als Kerne haben, werden nicht alle Threads gleichzeitig ausgeführt. Einige werden in der Warteschleife stehen und auf ein Zeitfenster warten.
In der Praxis ist die Anzahl der Threads, die Sie haben können, vom Scheduler begrenzt - aber diese Anzahl ist normalerweise sehr hoch (Tausende oder mehr). Es wird von Betriebssystem zu Betriebssystem und mit einzelnen Versionen variieren.
Wie viele Threads nützlich sind, hängt vom Leistungsstandpunkt ab, wie Sie sagten, es hängt von der Anzahl der verfügbaren Prozessoren ab und davon, ob die Task IO- oder CPU-gebunden ist. Experimentieren Sie, um die optimale Anzahl zu finden und wenn möglich konfigurierbar zu machen.
Es gibt Hardware- und Software-Parallelität. Die 8 bis 16 Threads beziehen sich auf die Hardware, die Sie haben - das sind eine oder mehrere CPUs mit Hardware, um 8 bis 16 Threads parallel zueinander auszuführen. Die Tausende von Threads beziehen sich auf die Anzahl der Software-Threads, der Scheduler muss sie austauschen, so dass jeder Software-Thread seine Zeitscheibe auf der Hardware ausführen lässt.
Um die Anzahl der Hardware-Threads zu erhalten, können Sie Runtime.availableProcessors()
ausprobieren.
Zu jedem gegebenen Zeitpunkt führt ein Prozessor die Anzahl der Threads aus, die der Anzahl der enthaltenen Kerne entspricht. Dies bedeutet, dass auf einem Einprozessorsystem nur ein Thread (oder kein Thread) zu einem bestimmten Zeitpunkt ausgeführt wird.
Prozessoren führen jedoch nicht jeden Thread nacheinander aus, sondern wechseln schnell zwischen mehreren Threads, um die gleichzeitige Ausführung zu simulieren. Wenn dies nicht der Fall wäre, geschweige denn mehrere Threads erstellen, könnten Sie nicht einmal mehrere Anwendungen starten.
Ein Java-Thread (im Vergleich zu Prozessoranweisungen) ist eine sehr hohe Abstraktion einer Menge von Anweisungen, die die CPU verarbeiten soll. Wenn es auf die Prozessorebene kommt, gibt es keine Garantie, welche Threads zu welchem Zeitpunkt auf welchem Kern laufen. Aber da Prozessoren schnell zwischen diesen Threads wechseln, ist es theoretisch möglich, eine unendliche Menge an Threads zu erstellen, allerdings auf Kosten der Performance.
Wenn Sie darüber nachdenken, werden auf einem modernen Computer Tausende von Threads gleichzeitig ausgeführt (alle Anwendungen werden kombiniert), während nur 1 bis 16 (typische Fallzahl) Kerne vorhanden sind. Ohne diese Aufgabenumschaltung würde nichts passieren.
Wenn Sie Ihre Anwendung optimieren, sollten Sie die Anzahl der Threads berücksichtigen, die Sie für Ihre Arbeit benötigen, und nicht die zugrunde liegende Architektur. Leistungsgewinne durch Parallelität sollten gegen steigende Gemeinkosten der Thread-Ausführung gewichtet werden. Da jede Maschine anders ist, ist jede Laufzeitumgebung anders, es ist unpraktisch, eine bestimmte Anzahl von Threads zu berechnen (es kann jedoch durch Benchmarking und Betrachtung der Anzahl der Cores eine Schätzung vorgenommen werden).
Tags und Links java multithreading gpu cpu