2

多核处理器是具有两个或多个独立的实际中央处理单元(称为“核心”)的单个计算组件,这些单元是读取和执行程序指令的单元。

如果多线程应用程序在多核处理器上运行,将使用多少个 CPU?例如,如果机器能够执行双核,那么如果我的理解是正确的,那么将使用 2 个 CPU。在这两个 CPU 中,将执行多个线程并进行上下文切换。

4

5 回答 5

9

如果多线程应用程序在多核处理器上运行,它将使用多少 CPU,例如如果机器能够做双核,那么将使用 2 个 CPU 是我的理解是正确的,并且在这两个 CPU 内多线程将被执行并进行上下文切换。

JVM 实际上并不直接与处理器打交道。它使用操作系统的本机线程功能,该功能使用操作系统和硬件公开的处理器。在 Java 中有一个Runtime.availableProcessors()方法,但在 JVM 代码中只有少数几个地方有这种方法。

对于 JVM 或在计算机上运行的任何其他应用程序,如果操作系统是这样公开它们的,那么多核通常看起来与多处理器相同。这意味着物理处理器与单个处理器中的多个内核之间的区别对 Java 程序员来说是完全隐藏的。

有单核 CPU,然后有多核 CPU,它们共享某些内部组件,但操作系统会看到它们并将它们调度为多个处理器。多核最有可能被操作系统视为多个 CPU——没有区别。然后是通常称为超线程的虚拟处理器,它们共享相同的处理器内核(和相关的处理电路)但具有多个执行管道。这些也(通常)被操作系统视为多个处理器。

具体来说,在 OP 的示例中,您有一个具有两个内核的处理器,在 linux cat'ing/proc/cpuinfo中将显示 2 个处理器,在 JavaRuntime.availableProcessors()中将返回 2。如果您有 2 个物理处理器,它也将返回 2,如果您也很可能根据操作系统内核,有一个带有双超线程管道的单核。

至于 JVM 将实际使用多少个处理器,这又取决于本机线程代码。这就是说,如果 JVM 运行在具有两个内核的单个 CPU 上,并且这些内核没有被其他应用程序或操作系统使用,那么 JVM 的线程很可能会被安排在它们上同时运行。

于 2013-09-01T18:11:18.757 回答
2

默认情况下,您可以使用所有处理器。一个处理器可以同时运行尽可能多的线程(实际上意味着物理上总是只有一个线程在运行)有多少可能取决于操作系统资源限制和使用的线程框架。

从软件的角度来看,如果核心在一个芯片上,并且有一个带有多核 CPU 的 CPU 插槽,或者有更多的 CPU 插槽,这并不重要。操作系统和 JVM 将看到内核的集合。(但这带来了一个有趣的方面:​​位于同一裸片上的内核与位于不同插槽中的内核之间的数据交换并不统一)。

线程调度程序(同时涉及操作系统和虚拟机)通常倾向于在整个调度程序时间内将线程从一个核心移动到另一个核心。这可能会损害性能,有一些技术可以将线程绑定到某个核心(线程亲和性)。

于 2013-09-01T18:13:57.627 回答
1

您的应用程序(假设长时间运行的任务)将真正消耗多少 cpu 资源取决于您需要 cpu 的百分比。应用程序可以是网络、内存、硬盘或 cpu 绑定以及其他一些。

如果 cpu 必须等待任何其他资源,例如内存或网络,它将保持空闲或分配给其他线程。

例子:

如果您的应用程序仅受 cpu 限制(不会消耗太多内存),并且您运行的任务与内核数量一样多(物理或虚拟超线程),那么您将几乎 100% 使用未使用的免费资源其他正在运行的线程(操作系统、程序)。

根据程序,您可以从 CPU/内存/网络消耗中判断您的应用程序处于哪个状态,并且您可以分析性能。

于 2013-09-01T18:17:51.563 回答
1

它最多可以使用与同时繁忙的线程一样多的 CPU,并且可能少至一个。

于 2013-09-01T18:19:09.037 回答
0

从程序员的角度来看,内核就是处理器。方法Runtime.availableProcessors()显示核心数。但是,从厂商的角度来看,多核处理器与普通处理器类似,所以他们决定保留“处理器”这个名称,可能是在营销上犯了错误。

于 2013-09-03T11:50:35.347 回答