41 Stimmen

Native Threads von Java und den JVM verstehen

Ich verstehe, dass der JVM selbst eine Anwendung ist, die den Bytecode der ausführbaren Java-Datei in nativen Maschinencode umwandelt, aber bei der Verwendung nativer Threads habe ich einige Fragen, die ich einfach nicht beantworten kann.

  • Erzeugt jeder Thread seine eigene Instanz des JVM, um seine spezielle spezielle Ausführung?
  • Wenn nicht dann hat die Jvm haben eine Möglichkeit zu planen, welche Thread es als nächstes behandeln wird, wenn so nicht dies die Multi-Thread-Natur von Java nutzlos machen würde, da nur ein Thread zu einem Zeitpunkt ausgeführt werden kann?

0 Stimmen

Die JVM ist ein Prozess. Threads existieren innerhalb von Prozessen. Nicht andersherum. Native Threads werden vom Betriebssystem geplant, nicht von der JVM. Das ist die Bedeutung von "nativ".

42voto

Stephen C Punkte 665668

Erzeugt jeder Thread seine eigene Instanz der JVM, um seine spezielle Ausführung zu bewältigen?

Nein. Sie werden in derselben JVM ausgeführt, so dass sie (zum Beispiel) Objekte und Klassenattribute gemeinsam nutzen können.


Wenn nicht, dann muss die JVM eine Möglichkeit haben, zu planen, welchen Thread sie als nächstes bearbeiten wird

In Java gibt es zwei Arten der Thread-Implementierung. Native Threads werden auf eine Thread-Abstraktion abgebildet, die durch das Host-Betriebssystem implementiert wird. Das Betriebssystem kümmert sich um die Planung der nativen Threads und die Zeitaufteilung.

Die zweite Art von Threads sind "grüne Threads". Diese werden von der JVM selbst implementiert und verwaltet, wobei die JVM die Thread-Planung übernimmt. Java Green-Thread-Implementierungen werden von Sun/Oracle JVMs seit Java 1.2 nicht mehr unterstützt (siehe Grüne Fäden vs. nicht grüne Fäden )


Wenn ja, würde dies nicht die Multithreading-Natur von Java nutzlos machen, da nur ein Thread zur gleichen Zeit ausgeführt werden kann?

Wir sprechen jetzt über grüne Fäden, und dies ist (nur) aus der Java-Perspektive von historischem Interesse.

  • Grüne Threads haben den Vorteil, dass Scheduling und Kontextwechsel im Nicht-I/O-Fall schneller sind. (Basierend auf Messungen, die mit Java unter Linux 2.2 durchgeführt wurden; http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238 )

  • Bei reinen grünen Threads werden N Programmiersprachen-Threads auf einen einzigen nativen Thread abgebildet. Bei diesem Modell gibt es keine echte parallele Ausführung, wie Sie festgestellt haben.

  • Bei einer hybriden Thread-Implementierung werden N Threads der Programmiersprache auf M native Threads abgebildet (wobei N > M). In diesem Modell ist der prozessinterne Thread-Scheduler für die Zuordnung von grünen Threads zu nativen Threads zuständig UND Sie erhalten eine echte parallele Ausführung (wenn M > 1); siehe https://stackoverflow.com/a/16965741/139985 .

Aber auch mit den reinen grünen Threads gibt es noch Gleichzeitigkeit. Die Kontrolle wird auf einen anderen Thread umgeschaltet, ein Thread blockiert eine E/A-Operation, der Thread erhält eine Sperre und so weiter. Darüber hinaus könnte die Laufzeit der JVM eine periodische Thread-Preemption implementieren, so dass ein rechenintensiver Thread den (einzigen) Kern nicht unter Ausschluss anderer Threads monopolisiert

8voto

Bill the Lizard Punkte 384619

Erzeugt jeder Thread seine eigene Instanz der JVM, um seine spezielle Ausführung zu handhaben?

Nein, Ihre in der JVM laufende Anwendung kann viele Threads haben, die alle innerhalb dieser Instanz der JVM existieren.

Wenn nicht, dann muss der JVM eine Möglichkeit haben, zu planen, welcher Thread es als nächstes behandeln wird...

Ja, die JVM hat einen Thread-Scheduler. Es gibt viele verschiedene Algorithmen für das Thread-Scheduling, und welcher davon verwendet wird, hängt vom JVM-Hersteller ab. ( Terminplanung im Allgemeinen ist ein interessantes Thema).

...wenn ja, würde dies nicht die Multi-Thread-Natur von Java nutzlos machen, da nur ein Thread zu einer Zeit ausgeführt werden kann?

Ich bin mir nicht sicher, ob ich diesen Teil Ihrer Frage verstehe. Das ist sozusagen der Sinn des Threading. Normalerweise hat man mehr Threads als CPUs, und man möchte mehr als eine Sache gleichzeitig ausführen. Mit Threading können Sie Ihre CPU voll ausnutzen, indem Sie sicherstellen, dass sie mit der Verarbeitung eines Threads beschäftigt ist, während ein anderer auf E/A wartet oder aus einem anderen Grund nicht beschäftigt ist.

3 Stimmen

"Ja, die JVM hat einen Thread-Scheduler. Es gibt viele verschiedene Algorithmen für das Thread-Scheduling, und welcher verwendet wird, hängt vom JVM-Anbieter ab." Ich glaube, hier liegt eine Irreführung vor, denn wenn Java-Threads einen nativen Thread erstellen (keine grünen Threads), dann braucht die JVM keinen Scheduler oder plant nicht, weil das Betriebssystem dies über Kontextwechsel erledigt. Liege ich da richtig? Bitte korrigieren Sie mich, wenn ich falsch liege.

7voto

muh Punkte 61

Ein Java-Thread kann eins-zu-eins auf einen Kernel-Thread abgebildet werden. Das muss aber nicht so sein. Es könnte n Kernel-Threads geben, die m Java-Threads ausführen, wobei m viel größer als n sein kann und n größer als die Anzahl der Prozessoren sein sollte. Die JVM selbst startet die n Kernel-Threads, und jeder von ihnen wählt einen Java-Thread aus und lässt ihn eine Zeit lang laufen, dann wechselt er zu einem anderen Java-Thread. Das Betriebssystem wählt Kernel-Threads aus und ordnet sie einer CPU zu. Es kann also eine Thread-Planung auf mehreren Ebenen geben. Vielleicht interessieren Sie sich für die Programmiersprache GO, in der Tausende von so genannten "Goroutines" von Dutzenden von Threads ausgeführt werden.

1 Stimmen

AFAIK ist dies nicht korrekt. JVM-Threads werden 1:1 auf das native Betriebssystem abgebildet. Können Sie ein Beispiel zeigen, um m:n Mapping zu erreichen?

1 Stimmen

@PiyushKatariya - Ich denke, es ist plattformspezifisch. Zum Beispiel unterstützten alle Versionen vor Java 9 von Sun/Oracle Java für Solaris die Zuordnung von N zu M Threads: reins.altervista.org/java/Java_und_Solaris_Threading.htm

0 Stimmen

"Das darf nicht sein". Sie meinen Mai nicht so sein.

3voto

Bozhidar Batsov Punkte 54038

Java-Threads werden auf native OS-Threads abgebildet. Sie haben wenig mit der JVM selbst zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X