“每个JVM线程都有自己的程序计数器”是什么意思?

时间:2016-11-17 22:50:05

标签: java multithreading process linux-kernel jvm

我试图理解这句话的含义:

  

每个Java虚拟机线程都有自己的pc(程序计数器)   寄存器。在任何时候,每个Java虚拟机线程都在执行   单个方法的代码,即当前方法(第2.6节)   线程。

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

我假设JVM线程的工作方式与任何其他线程一样 - 每次线程被安排运行时(比如说Linux内核),它的“程序计数器”都是从它的task_struct data structure加载的,所以来自CPU的透视,只有一个程序计数器 - 每次操作系统切换线程时,它都会被操作系统更新。

这是对的吗?我很困惑,因为整个页面似乎都在强调每个JVM都有它自己的PC /堆栈/堆等等,但我认为这是任何进程的给定 - JVM在某种程度上是否与其他进程不同?

1 个答案:

答案 0 :(得分:4)

  

假设JVM的工作方式与任何其他线程一样

JVM不是一个线程:它是一个进程,它有很多线程。

  

...所以从CPU的角度来看,只有一个程序计数器

程序计数器只是构成线程的 context 的几个寄存器之一。每个CPU都有一组物理寄存器(或两组,如果它是超线程的,但让我们保持简单并忽略超线程。)因此,每个CPU在任何给定的瞬间都可以运行一个线程。但...

操作系统可以"切换上下文"它可以保存给定CPU上运行的一个线程的所有寄存器,然后从一些加载寄存器和保存的寄存器(包括程序计数器)其他线程。

在典型的桌面操作系统中,调用操作系统调度程序(可能每秒100次或更多次)来决定当时应运行的线程。它将切换当时实际运行的线程,并切换等待运行的线程。

这样,您的计算机可以拥有比CPU更多的活动线程。