【问题标题】:What is meant by "each JVM thread has its own program counter?"“每个 JVM 线程都有自己的程序计数器”是什么意思?
【发布时间】:2017-04-01 16:17:56
【问题描述】:

我试图理解这句话的意思:

每个 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 在某种程度上不同于其他进程吗?

【问题讨论】:

  • 好吧,您错误地引用了标题中的摘录:“每个 Java 虚拟机 线程 都有自己的 pc”。然后“JVM 线程像任何其他线程一样工作”。
  • 你是对的 - 这种区别是我困惑的一部分。

标签: java multithreading process linux-kernel jvm


【解决方案1】:

假设 JVM 像任何其他线程一样工作

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

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

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

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

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

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

【讨论】:

  • 有道理。我的困惑实际上是关于线程上下文的构成 - 我现在明白这篇文章是说每个 JVM 线程都在 pc 和堆栈上,但 JVM 进程对所有线程都有一个共享堆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2013-08-23
  • 1970-01-01
  • 2011-10-06
  • 2018-08-16
  • 2014-05-19
  • 2015-06-02
相关资源
最近更新 更多