当前位置: 首页 > 知识库问答 >
问题:

JVM如何在CPU核之间扩展线程?

盖晋
2023-03-14

所以从一开始:当计算机启动时,引导线程(通常是处理器0中核心0中的线程0)就开始从地址0xFFFFFFF0中提取代码。所有剩下的CPU/核都处于特殊的Hibernate状态,称为等待-SIPI(WFS)。

然后,在OS加载后,它开始管理进程,并在CPU/核之间调度它们,通过高级可编程中断控制器(APIC)向WFS中的每个线程发送一个特殊的处理器间中断(IPI)(启动IPI)。SIPI包含该线程应该从其开始获取代码的地址。

因此,例如,OS通过在内存中加载JVM代码并将一个CPU内核指向其地址(使用上面描述的机制)来启动JVM。之后,JVM作为单独的OS进程执行,具有自己的虚拟内存区域,可以启动多个线程。

假设这种涉及其他CPU/核心的任务应该通过OS来管理是不正确的。我们可能会中断在其他内核上并行运行的一些OS进程的执行。因此,如果JVM想在其他CPU/核上启动新的线程,它会进行一些OS调用,并将要执行的任务的地址发送给OS。与其他html" target="_blank">程序一样,OS调度执行,但不同的是,该执行应该发生在相同的进程中,以便能够访问与其余JVM线程相同的地址空间。

怎么做到的?有人能更详细地描述一下吗?

共有1个答案

卢磊
2023-03-14

操作系统在默认情况下管理和调度线程。JVM对OS进行了正确的调用来实现这一点,但没有参与其中。

JVM使用与OS相同的机制吗

JVM使用操作系统,它不知道实际发生了什么。

 类似资料:
  • 问题内容: 我想用Java解决带有多个线程的数学问题。我的数学问题可以分为多个工作单元,我想通过几个线程来解决。 我不希望有固定数量的线程在工作,而是与CPU核心数量匹配的线程数量。我的问题是,为此我在互联网上找不到简单的教程。我发现的只是带有固定线程的示例。 如何才能做到这一点?你能提供例子吗? 问题答案: 你可以通过使用静态运行时方法,确定提供给Java虚拟机的进程数availableProc

  • 基于每个JVM的CPU核数创建线程与在多个JVM上运行的线程在CPU核数上创建线程数,条件是所有JVM运行在共享同一CPU的一个物理系统上有何不同?换句话说,一个并行运行8个线程的多线程Java程序vs在共享同一CPU的8个不同JVM上运行的同一多线程程序? 下面我给出了一些我发现的用线程实现并行处理的方法,但是我不能理解它们之间的本质区别? 方法一:线程周期性地查询数据库更改,并行地启动(长时间

  • 问题内容: 创建一个Today小部件,我用来保留一些数据。在主应用程序中,我正在使用。这不能由扩展读取(或可以?),这就是为什么我使用构造函数。 用户在主应用程序中持久存储的数据需要在扩展程序中可用。 目前,我坚持两者,以便可以共享这些值 问题是我应该将它们放在一起并仅在我的应用程序中使用,还是这种不好的做法? 编辑:我正在使用一个应用程序组容器。为了澄清起见,我问我是否应该在整个项目中用suit

  • 问题内容: 在Linux中,假设线程的pid为[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息。例如,这些proc文件/ proc / [pid] / status,/ proc / [pid] / stat和/ proc / [pid] / schedstat都是有用的。但是,如何获取线程正在运行的CPU核心号?如果线程处于睡眠状态,我如何才能知道线程在再次调度后将在

  • 我目前正在阅读有关通配符的文章,但我不知道它们之间是否有任何区别?扩展了Animal,E扩展了Animal。

  • Active Support 核心扩展 Active Support 作为 Ruby on Rails 的一个组件,可以用来添加 Ruby 语言扩展、工具集以及其他这类事物。 它从语言的层面上进行了强化,既可起效于一般 Rails 程序开发,又能增强 Ruby on Rails 框架自身。 读完本文,你将学到: 核心扩展是什么。 如何加载全部扩展。 如何恰如其分的选出你需要的扩展。 Active