JVMのプログラム・カウンタ・レジスタでは、レジスタはCPUのレジスタにちなんで名付けられました。CPUはレジスタにデータをロードして初めて実行できます。
スレッドは、スタック・フレームのセットを含むJVMスタックに対応します。JVMがJavaメソッドを呼び出すと、対応するクラスの型情報からメソッドのローカル変数領域とオペランド・スタックのサイズを取得し、それに応じてスタック・フレームのメモリを割り当て、JVMスタックに押し込みます。
アクティブ・スレッドでは、スタックの一番上にあるスタック・フレームだけが有効で、これをカレント・スタック・フレームと呼び、このスタック・フレームに関連付けられたメソッドをカレント・メソッドと呼びます。
I. プログラム・カウンター・レジスターの役割
PCレジスタは、次の命令を指すアドレス、つまり実行される命令のコードを格納するために使用されます。次の命令は実行エンジンによって読み取られます。
- これはメモリ空間のごく一部で、ほとんど無視できます。また、最も高速に動作する記憶領域でもあります。
- jvmの仕様では、各スレッドは独自のプログラムカウンタを持っており、これはスレッドプライベートで、スレッドのライフサイクルと一致したライフサイクルを持ちます。
- スレッドによって実行されるメソッドは常に1つだけで、いわゆる現在のメソッドです。プログラム・カウンタには、現在のスレッドが実行しているJavaメソッドのJVMディレクティブ・アドレスが格納されます。プログラム・カウンタはネイティブ・メソッドのスタックを担当しないため、実際にネイティブ・メソッドを実行している場合は、指定されていない値が格納されます。
- これはプログラムの制御の流れを示すもので、分岐、ループ、ジャンプ、例外処理、スレッド回復などの基本的な機能は、すべてこのカウンターの完了に依存しています。
- バイトコードインタープリターは、このカウンターの値を変更して、スケアが実行する必要のあるバイトコード命令を選びます。
- JavaのVM仕様の中で唯一OOMケースを規定しておらず、ゴミ収集もありません。
コード例
バイトコード命令のアドレスを格納するためにPCレジスタを使用する用途は何ですか?
- マルチスレッドはマクロ的には並列ですが、実際には同時交互実行です。
- CPUはスレッドを切り替え続ける必要があるため、スレッドが切り替わったときに、どこで再び実行を開始するかを知る必要があります。
- JVMのバイトコード・インタープリターは、次にどのバイトコード命令を実行すべきかを指定するために、PCレジスタの値を変更する必要があります。そのため、多数のスレッドの同時実行中、プロセッサ、またはマルチコア・プロセッサのコアは、任意の瞬間に、指定されたスレッドの単一の命令だけを実行します。このため、必然的に割り込みや再開が頻繁に発生することになります。各スレッドは生成後に独自のプログラム・カウンタとスタック・フレームを生成し、プログラム・カウンタはスレッド間で互いに影響しません。
PCレジスタがスレッドプライベートに設定されているのはなぜですか?
- 我々は、すべての時間の特定の期間で、いわゆるマルチスレッドは、メソッドのスレッドの1つだけで実行されることを知って、CPUは必然的に頻繁に中断または再開につながるタスクの切り替えを行うには、ドロップし続けるだろう、どのようにポイントの間に差がないことを確認するには?
- 各スレッドが実行中のバイトコード命令アドレスを正確に記録できるようにするには、当然、各スレッドがPCレジスタを割り当てて、各スレッドが互いに干渉しないように独立して計算できるようにするのが一番です。





