4

Linuxスレッドの場合、Javaでマルチスレッドプログラミングを最近開始しました。カーネルがそれらをスケジュールすることを知っています(スケジュールされているユニットエンティティであるため)が、私のシステム(RHEL 6.1)ではJavaプログラムがJVMで実行されますユーザー空間インスタンスとして実行されるプログラムとして実装されます。では、カーネルが Java スレッドを認識しないと、JVM でプリエンプティブ マルチタスクが行われるのはなぜでしょうか? このことを行う際の JVM とカーネルの相互作用のメカニズム全体が示されていると役に立ちます。

可能な情報源を引用してください

4

4 に答える 4

3

Java/JVM プロセスのスレッドはネイティブ スレッドにマップされ、スレッド スタック トレース ダンプで Java スレッド ID とネイティブ スレッド ID の両方を確認できます。お気に入りのツールを使用して、すべての Java スレッドのスレッド スタックを取得します。

  • java プログラムが実行されているコンソールでの ctrl+break (Windows) または ctrl+\ linux) のようなコマンド ライン シグナル
  • コマンド ライン ツール (jdk から -QUIT または jstack を強制終了)
  • jdkおよび/またはjmxなどのビジュアルVM

このようなスレッド ダンプの最初の行から抽出した例: ... tid=0x0000002adaba9c00 nid=0x754c ...

  • tid = Java スレッド ID

  • nid = ネイティブ ID (OS スレッド ID)

オペレーティング システムのツールを使用して、ネイティブ ID (16 進数) を使用してスレッドの詳細を確認します。

http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.htmlが必要な場合は、Javaコード内にThreadMXBeanがあり、プログラムでより多くのスレッド情報を取得できます

于 2012-03-27T14:24:16.880 に答える
2

Java スレッドと OS スレッドを区別しますか?を参照してください。 コメントで述べたように、Java スレッドは JVM コードを実行するだけの通常の OS スレッドです。

于 2012-03-27T13:56:33.747 に答える
1

jvm は、1 つのスレッドから開始され、後で好きなだけスレッドを生成できる通常のプロセスです。スケジューリングは、プロセス間とプロセス内のスレッド間の 2 つのレベルで行われます。これはすべてOSによって(libsを介して)行われます-jvmはフックするだけです。詳細についてはGoogle posixスレッド-jvmに公開されているもの(API)です。

これは詳細に少し入ります: http://www.ibm.com/developerworks/java/library/j-rtj3/

于 2012-03-27T14:23:53.960 に答える
0

「しかし、Java プログラムは、私のシステム (RHEL 6.1) ではユーザー空間インスタンスとして実行されるプログラムとして実装されている JVM で実行されます。そのため、カーネルが Java スレッドを認識することなく ...」

このステートメントは、ネイティブ スレッドを使用する最新のすべての JVM では正しくありません。それがJava 1.2以降のデフォルトだと思います。JVM によるネイティブ スレッドの実装とは、スレッドが Java コードでスレッドをインスタンス化/実行するたびに、JVM が OS にスレッドの作成を要求することを意味します。これらはネイティブ スレッドであるため、カーネルはそれらを認識し、それに応じて処理します。さらに、Linux は POSIX スレッドをサポート/実装しているため、Linux ベースのシステムでは、Java アプリのスレッドに対して pthread の動作が得られます。

于 2012-06-25T07:16:24.907 に答える