Maximale Anzahl von threads gleichzeitig ausführen kann in java auf einer CPU
Bitte ich verwirrt über etwas.
Was ich weiß ist, dass die maximale Anzahl der threads, die gleichzeitig ausgeführt werden können auf einer normalen CPU von einem modernen computer reicht von 8 bis zu 16 threads.
Auf der anderen Seite, mit GPUs Tausende von threads gleichzeitig ausführen kann, ohne die scheduler unterbricht alle Threads zu planen eine andere.
Auf mehrere Beiträge, wie:
Java virtual machine - die maximale Anzahl von threads https://community.oracle.com/message/10312772
Menschen sind die besagt, dass Sie laufen Tausende von java-threads, die gleichzeitig auf normalen CPUs.
Wie kann das sein ??
Und wie kann ich wissen, die maximale Anzahl der threads, die gleichzeitig ausgeführt werden können, so dass mein code passt es selbst dynamisch, entsprechend der zugrunde liegenden Architektur.
- In der Theorie können Sie so viele wie Sie möchten, aber Sie stoßen werden zunehmende Mengen von overhead für die JVM-Kämpfe zu verfolgen die Terminplanung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Threads sind nicht gebunden oder begrenzt durch die Anzahl der verfügbaren Prozessoren/Kernen. Der Betriebssystem-scheduler kann hin-und herschalten zwischen einer beliebigen Anzahl von threads auf einer single CPU. Dies ist die Bedeutung von "präemptiven multitasking."
Natürlich, wenn du mehr threads als Kerne, die nicht alle threads ausgeführt werden gleichzeitig. Einige werden auf halten, warten auf ein Zeitfenster.
In der Praxis, die Anzahl der threads, die Sie haben können, ist begrenzt durch die scheduler - aber diese Zahl ist in der Regel sehr hoch (Tausende und mehr). Es variiert von OS zu OS und mit den einzelnen Versionen.
Soweit wie viele threads sind nützlich vom performance-Standpunkt aus, als Sie sagte, es hängt von der Anzahl der verfügbaren Prozessoren und ob die Aufgabe von IO-oder CPU-gebunden. Experimentieren, um die optimale Anzahl und die machen es dann konfigurierbar, wenn möglich.
STACK_SIZE_PARAM_IS_A_RESERVATION
um sicherzustellen, dass nur die minimale Arbeitsspeicher ist eigentlich verpflichtet ist, über 72k mit 8gb Speicher.Gibt es hardware-und software-Parallelität. Die 8 bis 16 threads bezieht sich auf die hardware, die Sie haben -, der eine oder mehrere CPUs mit hardware zum ausführen von 8 zu 16 threads parallel zu einander. Die Tausende von threads bezieht sich auf die Anzahl der software-threads, dem scheduler werden müssen, tauschen Sie Sie so, dass jeder software-thread bekommt seine Zeitscheibe zur Ausführung auf der hardware.
Um die Anzahl der hardware-threads können Sie versuchen
Runtime.availableProcessors()
.Jederzeit einen Prozessor ausgeführt wird, die Anzahl der threads gleich der Anzahl der Kerne enthielt. Dies bedeutet, dass auf einem einprozessorsystem nur ein thread (oder kein Gewinde) ausgeführt wird, in jedem gegebenen moment.
Jedoch, Prozessoren laufen nicht in jeden thread einer nach dem anderen, sondern Sie wechseln zwischen mehreren threads schnell zu simulieren gleichzeitige Ausführung. Wenn dies nicht der Fall, geschweige denn das erstellen mehrerer threads, die Sie nicht selbst in der Lage zu starten mehrerer Anwendungen.
Einen java-thread (im Vergleich zu Prozessor-Anweisungen) ist eine sehr hohe Ebene der Abstraktion, eine Reihe von Anweisungen für die CPU zu verarbeiten. Wenn Sie ruft nach unten auf die Prozessor-Ebene, gibt es keine Garantie die threads ausgeführt wird, auf dem Kern zu einem bestimmten Zeitpunkt. Aber angesichts der Tatsache, dass die Prozessoren schnell wechseln zwischen diesen threads, es ist theoretisch möglich, eine unendliche Menge von threads wenn auch auf Kosten der Leistung.
Wenn Sie darüber nachdenken, einen modernen computer hat Tausende von threads gleichzeitig ausgeführt werden (eine Kombination aller Anwendungen), während nur mit 1 ~ 16 (typischer Fall) Anzahl der Kerne. Ohne diesen task-switching, nichts würde das jemals getan.
Wenn Sie die Optimierung Ihrer Anwendung sollten Sie die Menge der threads, die Sie benötigen durch die Arbeit in der hand, und nicht durch die zugrunde liegende Architektur. Performance-Gewinne von Parallelität sollte abgewogen werden gegen die Erhöhung der Gemeinkosten der thread die Ausführung. Da jede Maschine ist anders, jede runtime-Umgebung ist anders, es ist unpraktisch, zu arbeiten, eine golden thread-Anzahl (jedoch eine grobe Schätzung vorgenommen werden kann, durch benchmarking und betrachten die Anzahl der Kerne).