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

7

可能是重复问题:
一个多线程的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);
    }

我原本期望它只使用一个CPU以充分利用高速缓存(因为在循环中我们一直使用本地变量j,因此一个CPU的利用率将达到100%,而另一个CPU则几乎空闲)。令我惊讶的是,在线程启动后,两个CPU的利用率都在40%~60%左右,并且一个CPU的利用率略高于另一个CPU。
我的问题是,是否有任何操作系统负载平衡机制会在检测到不平衡时启动?在我的情况下,Windows操作系统是否发现一个CPU接近100%,而另一个CPU几乎空闲,因此定期重新安排线程到另一个CPU上?

enter image description here

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


是的,操作系统会在不同线程之间进行切换。 - Mysticial
我认为这个问题已经得到了解答:http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well - Griffin
请注意,大多数Java程序都会尝试使用一个核心并保持在一个核心上,这是我在玩Minecraft时发现的。这里有一个故事,是一个人在他的新电脑上发现这一点的 http://mlee888.wordpress.com/2006/03/31/java-performance-in-dual-coremultiprocessor-environment/ - Griffin
4
@parioscreations之前的问题是关于多线程应用程序的。这个问题是关于单线程应用程序的。 - Rogel Garcia
@parioscreations 是的,这是一个单线程场景。 - njzhxf
这可能会有所帮助:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686253.aspx和http://msdn.microsoft.com/en-us/library/windows/desktop/ms684251.aspx - user541686
3个回答

3
当操作系统执行线程时,它会运行每个线程一段时间(例如10-20毫秒),然后保存线程的状态,并寻找其他要运行的线程。尽管从CPU利用率图表中看起来似乎只有程序中的线程在运行,但实际上操作系统运行的线程比这还要多。有正在运行UI循环的线程,正在等待I/O的线程,正在运行后台服务的线程等等。大部分线程大部分时间都在等待某些东西。
我之所以谈论这个问题是为了解释从操作系统的角度来看,情况比看起来更加复杂。有许多线程在做许多事情,操作系统正在试图在它们之间切换。假设你想要实现一个启发式算法,如果一个线程上次使用完整的量子,则操作系统将努力安排它到相同的核心。操作系统需要跟踪并考虑更多信息,优化的成功可能取决于许多难以预测的因素。
此外,在实践中,将线程与核心关联的好处通常微不足道,因此操作系统不会自动尝试这样做。相反,它们提供了一种功能,允许开发人员明确表示特定线程应与核心关联,然后操作系统将尊重这个决定。
这似乎是一个合理的折衷:如果您的线程在与核心关联时表现更好,只需要求操作系统这样做。但是,操作系统不会费心为您解决这个问题。

1

如您所述,操作系统会在不同线程之间切换。以下本地代码也与您所描述的相同。

int main( int argc, char** argv )
{
    while( true );
    return 0;
}

如果您查看进程,它会不断保持在25%(使用四核),但来自Windows 7的资源监视器显示4个内核都没有恒定地达到100%,即使0号内核的使用率高于其他内核。

CPU可能会共享缓存,因此这种行为并不意味着未使用缓存。


1
有没有官方/记录的解释,说明操作系统为什么以及如何在线程之间进行切换? - njzhxf
@StephenC 想要更深入地了解它。 - njzhxf
@njzhxf - 那你为什么需要一个“官方”的解释呢?(不过我不期望你能在微软的网站上找到任何相关信息……那才是你需要查找的地方。) - Stephen C


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接