【问题标题】:How Java multi-threaded program is able to use multiple CPU cores?Java多线程程序如何能够使用多个CPU内核?
【发布时间】:2011-08-03 02:28:30
【问题描述】:

当JVM在Linux上只是一个进程时,有人可以解释一下Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有内核吗?有没有好的深入的文章详细描述了这个主题?

编辑#1:我不是在寻找如何在 Java 中实现多线程程序的建议。我正在寻找有关 JVM 如何在内部设法在 linux/windows 上使用多个内核同时仍然是操作系统上的单个进程的解释。

EDIT #2:我设法找到的最佳解释是 Hotspot (Sun/Oracle JVM) 使用 NPTL 在 Linux 上将线程实现为本机线程。所以更不用说Java中的每个线程都是Linux上的轻量级进程(本机线程)。使用ps -eLf 命令可以清楚地看到它不仅打印出进程ID(PPID),还打印出本机线程ID(LWP)。

更多细节也可以在这里找到:

编辑#3:维基百科在 NPTL 上有简短但不错的条目,并有一些进一步的参考 http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library

【问题讨论】:

  • 我想你可能对“绿色线程”感到困惑,这是一种旧的黑客技术,用于支持没有操作系统线程支持的线程。虽然今天可能有类似的黑客攻击,但大多数操作系统都很好地支持线程。
  • 操作系统做真正的工作,Java 只是以与大多数其他多线程应用程序相同的方式使用它。

标签: java multithreading jvm


【解决方案1】:

Linux 内核支持线程作为一等公民。事实上,对于内核来说,线程与进程并没有太大区别,只是它与另一个线程/进程共享一个地址空间。

一些旧版本的ps 甚至默认为每个线程显示一个单独的进程,而新版本可以使用-m 标志启用此行为。

【讨论】:

  • 我认为值得一提的是,Hotspot (Sun/Oracle JVM) 将线程作为 Linux 上的本机线程(轻量级进程)实现
  • 虽然这个问题专门询问了 JVM,但值得注意的是,并非所有的 java 虚拟机都支持本机线程(在某些情况下本机线程甚至不可用)——这在嵌入式系统。
【解决方案2】:

JVM 是具有多个线程的单个进程。每个线程都可以安排在不同的 CPU 内核上。一个进程可以有多个线程。

当在 JVM 中运行的 Java 软件请求另一个线程时,JVM 会启动另一个线程。

这就是 JVM 管理使用多个内核的方式。

【讨论】:

    【解决方案3】:

    如果您使用并发库并尽可能多地拆分工作,则 JVM 应该处理其余部分。

    看看这个http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/

    【讨论】:

      【解决方案4】:

      我会先阅读Concurrency Tutorial

      特别解释了processes and threads之间的区别(和关系)。

      在我熟悉的架构中,线程(包括 JVM 创建的线程)由操作系统管理。 JVM 只是使用操作系统提供的线程工具。

      【讨论】:

      • 我想说 OP 知道这一点。问题更确切地说是为什么 JVM 显示为单个进程但仍然使用多个内核,Joachim 已经解释了这一点。
      • 我很抱歉不清楚,但我不是在寻求如何在 Java 中实现多线程程序的建议。我正在寻找 JVM 如何在内部设法在 linux/windows 上使用多个内核同时仍然是操作系统上的单个进程的解释。
      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-03-02
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多