多核处理器是一个单独的计算组件,具有两个或多个独立的实际中央处理单元(称为“核心”),它们是读取和执行程序指令的单元。
如果多线程应用程序在多核处理器上运行,将使用多少个CPU?例如,如果机器能够双核执行,那么如果我的理解是正确的话,将使用2个CPU。在这两个CPU中,将执行多个线程并执行上下文切换。
答案 0 :(得分:9)
如果Mulithreaded应用程序在多核处理器上运行,它将使用多少CPU,例如,如果机器能够执行双核,那么将使用2个CPU是我的理解是正确的,并且在这两个CPU中将执行多个线程并执行上下文切换。
JVM实际上并不直接处理处理器。它使用操作系统的本机线程功能,该功能使用操作系统和硬件公开的处理器。在Java中,有一个Runtime.availableProcessors()
方法,但这只是JVM代码中的几个地方。
对于JVM或计算机上运行的任何其他应用程序,多个核心通常看起来与多个处理器相同,如果这是操作系统公开它们的方式。这意味着单个处理器中物理处理器与多个内核之间的区别对Java程序员来说是完全隐藏的。
存在单核CPU然后存在具有多个核的CPU,其共享某些内部组件但操作系统看到它们并将它们调度为多个处理器。多个内核最有可能作为多个CPU被视为操作系统 - 没有区别。然后,通常称为hyperthreading的虚拟处理器共享相同的处理器核心(和相关的处理电路),但具有多个执行流水线。这些(通常)也被操作系统视为多个处理器。
具体来说,在OP的示例中,您有一个具有两个内核的处理器,在linux中,cat'ing /proc/cpuinfo
将显示2个处理器,而在Java中,Runtime.availableProcessors()
将返回2.它也将返回2如果您有2个物理处理器,如果您拥有一个具有双超线程管道的单核心,则最有可能取决于操作系统内核。
至于JVM将实际使用多少处理器,这又取决于本机线程代码。这就是说,如果JVM在具有两个内核的单个CPU上运行,并且内核未被其他应用程序或操作系统使用,那么JVM的线程很可能会被安排在它们上同时运行。
答案 1 :(得分:2)
默认情况下,您可以使用所有处理器。一个处理器可以同时运行虚拟尽可能多的线程(实际上意味着物理上总是只有一个线程正在运行)。可能的数量取决于操作系统资源限制和使用的线程框架。
从软件的角度来看,如果核心在一个芯片上,并且有一个带有多核CPU的CPU插槽,或者有更多的CPU插槽,则无关紧要。操作系统和JVM将看到核心的集合。 (这带来了一个有趣的方面:同一芯片上的这些内核与不同套接字中的内核之间的数据交换并不统一。)
线程调度程序(谈论操作系统和虚拟机)通常会在调度程序时间内将线程从一个核心移动到另一个核心。这可能会损害性能,有一些技术可以将线程绑定到某个核心(线程关联)。
答案 2 :(得分:1)
您的应用程序(假设长时间运行的任务)将消耗多少CPU资源取决于您需要多少百分比的CPU。应用程序可以是网络,内存,硬盘或cpu绑定以及其他一些应用程序。
如果cpu必须等待内存或网络等任何其他资源,它将保持空闲状态或被分配给其他线程。
示例:强>
如果您的应用程序仅受cpu限制(不会消耗太多内存),并且您运行的任务线程数与核心数相同(物理或虚拟超线程),您将获得几乎100%的免费资源使用率。其他正在运行的线程(os,programms)没有使用。
根据程序的不同,您可以根据cpu /内存/网络消耗判断应用程序的状态,然后分析性能。
答案 3 :(得分:1)
它将使用最多同时拥有繁忙线程的CPU,并且可能只使用一个。
答案 4 :(得分:0)
从程序员的角度来看,核心是处理器。方法Runtime.availableProcessors()显示核心数。但是,从制造商的角度来看,多核处理器与普通处理器类似,因此他们决定将这个名称留给“处理器”,可能会造成营销错误。