2016-11-17 11 views
1

私はこの文が何を意味するのか理解しようとしています:「各JVMスレッドには独自のプログラムカウンタがありますか?

各Java仮想マシンのスレッドは、自身のPC(プログラムカウンタ) レジスタを持っています。いずれの時点でも、各Java Virtual Machineスレッドは、 という1つのメソッドのコード、つまりその スレッドの現在のメソッド(§2.6)を実行しています。

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1

私は、JVMのスレッドが他のスレッドと同じように動作することを前提と - それはtask_struct data structureだから、そのスレッドが、それは「プログラムカウンタ」だという(Linuxカーネルを言うことで)実行するようにスケジュールされるたびにロードされていることしたがって、CPUの観点から見ると、プログラムカウンタは1つだけです.OSがスレッドを切り替えるたびに、OSによって更新されます。

これは間違いありませんか?そのページ全体が、各JVMが自分自身のPC /スタック/ヒープなどを取得していることを強調し続けているようだが、私はそれがどのプロセスにも与えられていると思った。

+0

「各Java仮想マシン**スレッド**には独自のpcがあります」というタイトルの抜粋を誤って引用しました。そして、 "JVM **スレッド**は他のスレッドと同じように動作します"。 –

+0

あなたは正しいです - その区別は私の混乱の一部でした。 – Charlie

答えて

3

は、JVMは、他のスレッド

と同じように動作することを前提とJVMはスレッドではありません:それは、多くのスレッドを持っていプロセスです。

...ので、CPUの観点から単一のプログラム・カウンタがあります

プログラム・カウンタは、ただ一つのスレッドのコンテキストを構成するいくつかのレジスタのです。各CPUには1セットの物理レジスタ(またはハイパースレッディングの場合は2つのセット)がありますが、単純にしてハイパースレッディングを無視します。したがって、各CPUは任意の瞬時に正確に1つのスレッドを実行できます。しかし...

オペレーティングシステムは、特定のCPU上で実行されている1つのスレッドのすべてのレジスタを保存してから、いくつかのレジスタ(プログラムカウンタを含む)をロードすることができます他のスレッド。

一般的なデスクトップオペレーティングシステムでは、オペレーティングシステムスケジューラが起動されます。その時点で実行するスレッドを決定するには、100回/秒以上が必要です。その時点で実際に実行されていたスレッドを切り替えて、実行待ちのスレッドを切り替えます。

このようにして、コンピュータにはCPUより多くのライブスレッドが存在することがあります。

+1

意味があります。私の混乱は実際にスレッドコンテキストを構成していたものを超えていました。記事では、各JVMスレッドにはPCとスタックがありますが、JVMプロセスにはすべてのスレッドに対して共有ヒープがあると言われています。 – Charlie

関連する問題