为啥没有“Thread.sleep”的“while(true)”会在 Linux 上导致 100% 的 CPU 使用率,而在 Windows 上却不会?

Posted

技术标签:

【中文标题】为啥没有“Thread.sleep”的“while(true)”会在 Linux 上导致 100% 的 CPU 使用率,而在 Windows 上却不会?【英文标题】:Why does “while(true)” without “Thread.sleep” cause 100% CPU usage on Linux but not on Windows?为什么没有“Thread.sleep”的“while(true)”会在 Linux 上导致 100% 的 CPU 使用率,而在 Windows 上却不会? 【发布时间】:2013-01-12 19:12:20 【问题描述】:

我在java中创建了一个简单的程序:

public static void main(String[] args) throws InterruptedException 
    while (true) 
        ;

如果我在 Linux 机器上运行它,它会显示 100% 的 CPU 使用率,但不会导致操作系统看起来很慢。但是,如果我在 Windows 上运行完全相同的代码,它只会显示大约 20% 的 CPU 使用率。

我在 Windows 上使用 Oracle JRE,在 Linux 上使用 OpenJDK 6。

我想知道 Windows 的调度程序是否会随机抢占线程而 Linux 不会?

【问题讨论】:

依赖于操作系统任务调度。 你有多少个内核?当所有核心都忙时,Windows 任务管理器报告 100%。您的 linux 工具是否执行类似的操作,或者它是否报告 100% 的 1 个核心的工作价值,并且当所有核心都忙时,它是 100*N cores % 我有 4 个内核,在 linux 上我使用系统监控工具 @Quoi 不是。如果该程序正在运行,那么该线程将在 Windows 和 Linux 上不间断地运行。 【参考方案1】:

默认情况下,Linux 上的top 在所谓的 IRIX 模式下运行,而 Windows 任务管理器则不是。假设您有 4 个核心:

在 IRIX 模式开启时,1 个充分利用的核心为 100%,4 个核心为 400%。

在 IRIX 模式关闭的情况下,1 个充分利用的核心为 25%,4 个核心为 100%。

这意味着默认情况下,Linux 上的top 将无限循环显示为 ~100%,而 Windows 将其显示为 ~25%,这意味着完全相同。

您可以在 top 运行时使用 Shift+i 切换 IRIX 模式。这将使数字匹配。

【讨论】:

是的 - 在“4+4”i7(超线程)上,一个微不足道的 CPU 循环出现在 17-18% 左右。 为什么回答者虽然有 150UPs,但他的分数仍然是 700 的......是这样的错误吗? :-/ @uDaY,因为每天最多有 200 个代表,因此之后的任何赞成票都不会被计算在内,仍然会被接受。 @thatotherguy 什么时候按 shift-I 来切换?当 top 运行时?

以上是关于为啥没有“Thread.sleep”的“while(true)”会在 Linux 上导致 100% 的 CPU 使用率,而在 Windows 上却不会?的主要内容,如果未能解决你的问题,请参考以下文章

添加一个没有 Thread.sleep 的延迟和一个啥都不做的 while 循环

为啥 Thread.sleep 不好用

为啥要放弃使用Thread.Sleep

Thread.sleep() 在 while 循环中

Thread.sleep 没有抛出 InterruptedException

while 循环中的 Thread.sleep() 不能正常工作?