单核Java线程运行时的双核CPU利用率

njz*_*hxf 7 java multithreading operating-system utilization

可能重复:
多线程Java应用程序是否会很好地利用多核机器?

我有一个简单而简单的Java线程在我的双核机器上运行(Windows XP 32位环境)

public static void main(String[] strs) {

    long j  = 0;
    for(long i = 0; i<Long.MAX_VALUE; i++)
        j++;

    System.out.println(j);
    }
Run Code Online (Sandbox Code Playgroud)

我的期望是它会坚持使用单个CPU来充分利用高速缓存(因为在循环中我们继续使用本地变量j运行,因此一个CPU工具将是100%而另一个将非常闲置.令人惊讶的是,在线程启动后,两个CPU的使用率都在40%~60%左右,而一个CPU的利用率略高于另一个CPU.

我的问题是,是否有任何操作系统负载均衡机制在检测到不平衡时启动?在我的情况下,Windows操作系统可能发现一个CPU几乎达到100%而另一个几乎处于空闲状态,因此它会定期将线程重新安排到另一个CPU?

在此输入图像描述

#EDIT1 我发现了一个可能的解释:http: //siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

Igo*_*sky 3

当操作系统执行线程时,它会运行每个线程一段时间(比如10-20ms),然后保存线程的状态,并寻找其他线程来运行。

现在,不管您通过查看 CPU 利用率图可能会想到什么,操作系统实际上运行的线程比您程序中的线程多得多。有运行 UI 循环的线程、等待 I/O 的线程、运行后台服务的线程等。大多数线程大部分时间都在阻塞等待某些事情。

我之所以谈论这个,是为了解释从操作系统的角度来看,情况比看起来更复杂。有一大堆线程在做一大堆事情,操作系统正在尝试在它们之间切换。假设您想要实现一种启发式方法,即如果线程上次用完其整个量程,则操作系统将努力将其调度到同一核心。操作系统需要跟踪和考虑更多的信息,优化的成功可能取决于很多难以预测的因素。

此外,将线程关联到核心的好处在实践中通常可以忽略不计,因此操作系统不会尝试自动执行此操作。相反,它们公开了一项功能,允许开发人员明确表示特定线程应该与核心关联,然后操作系统将尊重该决定。

这似乎是一个合理的权衡:如果您的线程在关联到核心时性能更好,只需要求操作系统这样做即可。但是,操作系统不会费心尝试为您解决这个问题。