2016-11-17 60 views
1

我想明白这是什么表态意味着:“每个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在其他进程中独一无二?

+0

那么,你错误地引用了标题中的摘录:“每个Java虚拟机**线程**都有自己的pc”。然后“JVM **线程**像任何其他线程一样工作”。 –

+0

你是对的 - 这是我混乱的一部分。 – Charlie

回答

3

假设JVM像任何其他线程

JVM是不是一个线程:这是一个过程有多个线程。

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

程序计数器只是几个寄存器构成一个线程的上下文一个。每个CPU有一套物理寄存器(如果它是超线程的,但是让我们把事情简单化并忽略超线程),那么每个CPU可以在任何给定的瞬间完全运行一个线程。但是...

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

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

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

+1

有道理。我的困惑实际上是由什么构成了线程上下文 - 我现在明白这篇文章的意思是每个JVM线程都在pc和堆栈上,但是JVM进程为所有线程共享一个堆。 – Charlie

相关问题