Software-Threads gegen Hardware-Threads

75

Was ist der Unterschied zwischen Software-Threads, Hardware-Threads und Java-Threads?

Sind Software-Threads, Java-Threads und Hardware-Threads unabhängig oder voneinander abhängig? Ich frage dies, weil ich weiß, dass Java-Threads in einem Prozess mit in jvm (java.exe) erstellt werden.

Stimmt es auch, dass diese unterschiedlichen Prozesse auf unterschiedlichen Hardware-Threads ausgeführt werden?

Bhadri
quelle

Antworten:

65

Software-Threads sind Ausführungsthreads, die vom Betriebssystem verwaltet werden.

Hardware-Threads sind eine Funktion einiger Prozessoren, die unter bestimmten Umständen eine bessere Auslastung des Prozessors ermöglichen. Sie können dem Betriebssystem als zusätzliche Kerne ("Hyperthreading") ausgesetzt sein.

In Java behalten die von Ihnen erstellten Threads die Software-Thread-Abstraktion bei, wobei die JVM das "Betriebssystem" ist. Ob die JVM dann Java-Threads Betriebssystem-Threads zuordnet, ist Sache der JVM (aber mit ziemlicher Sicherheit). Und dann verwendet das Betriebssystem Hardware-Threads, wenn diese verfügbar sind.

Wille
quelle
76

Ein "Hardware-Thread" ist eine physische CPU oder ein Kern. Eine 4-Kern-CPU kann also wirklich 4 Hardware-Threads gleichzeitig unterstützen - die CPU erledigt wirklich 4 Dinge gleichzeitig.

Ein Hardware-Thread kann viele Software-Threads ausführen. In modernen Betriebssystemen erfolgt dies häufig durch Time-Slicing. Jeder Thread muss einige Millisekunden ausgeführt werden, bevor das Betriebssystem einen anderen Thread für die Ausführung auf dieser CPU plant. Da das Betriebssystem schnell zwischen den Threads hin und her wechselt, sieht es so aus, als ob eine CPU mehr als eine Sache gleichzeitig ausführt. In Wirklichkeit führt ein Kern jedoch immer noch nur einen Hardware-Thread aus, der zwischen vielen Software-Threads wechselt.

Moderne JVMs ordnen Java-Threads direkt den vom Betriebssystem bereitgestellten nativen Threads zu, sodass Java-Threads keinen inhärenten Overhead gegenüber nativen Threads verursachen. Bei Hardware-Threads versucht das Betriebssystem, Threads Kernen zuzuordnen, wenn genügend Kerne vorhanden sind. Wenn Sie also ein Java-Programm haben, das 4 Threads startet und 4 oder mehr Kerne hat, besteht eine gute Chance, dass Ihre 4 Threads wirklich parallel auf 4 separaten Kernen ausgeführt werden, wenn die Kerne inaktiv sind.

mdma
quelle
16
Die meisten neuen teuren Chips haben mehrere Hardware-Threads pro Kern. Hyperthreading und so weiter gibt es schon seit einigen Jahren und sind weit verbreitet.
Will
6
Sicher, ich versuche, die Diskussion einfach zu halten und nicht auf Details über die spezifische CPU-Architektur einzugehen, da dies eine Java-Frage war. Unabhängig davon, ob das Hardware-Threading pro Prozessor (wie noch vor nicht allzu langer Zeit), pro Kern oder pro Hyperthread oder einem anderen Architekturmechanismus zur Bereitstellung von Hardware-Parallelität implementiert wird, ist der Hauptunterschied zwischen Software- und Hardware-Threads derselbe.
Mdma
Entschuldigung, aber kann jemand bitte erklären, was "native Threads" im Zusammenhang mit dieser Antwort bedeuten? Beziehen sie sich auf Hardware-Threads oder Software-Threads oder beides?
rgbk21
Ein nativer Thread wird vom Betriebssystem verfügbar gemacht. Im Gegensatz zu grünen Threads, die nur von einem Anwenderprogramm simuliert werden.
Antonio
2

Hardware-Threads können als CPU-Kerne betrachtet werden, obwohl jeder Kern mehrere Threads ausführen kann. Die meisten CPUs geben an, wie viele Threads auf jedem Kern ausgeführt werden können (unter Linux gibt der Befehl lscpu dieses Detail an). Dies ist die Anzahl der Kerne, die parallel verwendet werden können.

Software-Threads sind Abstraktionen zur Hardware, um Multiverarbeitung zu ermöglichen. Wenn Sie mehrere Software-Threads haben, aber nicht mehrere Ressourcen, können Sie mit diesen Software-Threads alle Aufgaben parallel ausführen, indem Sie Ressourcen für eine begrenzte Zeit zuweisen (oder eine andere Strategie verwenden), sodass anscheinend alle Threads parallel ausgeführt werden. Diese werden vom Betriebssystem verwaltet. Java-Thread ist eine Abstraktion auf JVM-Ebene.

Rakesh K.
quelle
-4

Ich denke du liegst falsch. Ich habe noch nie von Hardware-Threads gehört (es sei denn, Sie meinen Hyper-Threading auf bestimmten Intel-Computern). Jeder Prozess ist eine laufende Darstellung eines Programms. Threads sind gleichzeitige Ausführungsabläufe in einem Prozess. Java-Thread-Definitionen werden von JVM System-Threads zugeordnet. Java hatte früher ein Konzept von GreenThreads , was heute nicht mehr der Fall ist.

questzen
quelle
1
Inmos-Transputer unterstützten eine beliebige Anzahl von Threads, der Chip war der Scheduler, kein Betriebssystem beteiligt.
Bazza
Stackover Flow bitte mich, einen Kommentar hinzuzufügen;)
Claude