【问题标题】: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 上不间断地运行。

标签: java linux windows multithreading cpu-usage


【解决方案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 运行时?
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2019-01-31
  • 2012-11-24
  • 2019-08-03
  • 2015-10-27
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多