【问题标题】:Why infinity loop does not take cpu usage to 100为什么无限循环不会将 cpu 使用率提高到 100
【发布时间】:2023-03-16 22:50:01
【问题描述】:

当我运行一个带有空 while 循环的简单 c# 程序时,我的 cpu 使用率从 8-12% 上升到 24-20%,并且核心使用模式几乎相同。

    static void Main(string[] args)
    {
        bool flag = true;
        while(flag)
        {

        }
    }

谁能解释一下这种行为。我预计此时一个核心使用率会达到 100%。

更新:我使用的是八核机器,总 cpu 使用率(总和所有核心使用率)达到 25%。每个核心(除了第一个)显示出相似的使用模式(大约 25%)

【问题讨论】:

  • 你确定你使用的是八核吗?如果是八核,那就是 8,你只显示 4 个 CPU。你确定你没有超线程的 4 核机器吗?
  • 是的,它是八核机器。在图片上,我只拍到了其中的 4 个。
  • 所有核心都得到了公平的份额。大部分负载可能是切换。
  • @TaW 操作系统会即时将单线程应用程序从一个内核切换到另一个内核吗?这不会造成不合理的缓存问题,尤其是当它切换到完全不同套接字上的核心时?

标签: c#


【解决方案1】:

因为它是单线程的。您可能有一个四核 CPU。您可能会用尽单核。

要充分利用现代多核 CPU,您需要多线程工作负载。此外,如果您的代码过于可爱,您将不得不避免优化。

【讨论】:

  • 有道理。但是为什么负载在所有内核之间共享,并且 CPU 使用模式几乎相同?理想情况下,当负载为一个核心 1 时,所有其他核心不应显示任何 cpu 峰值?
  • 我有程序可以将单核 100% 固定,我认为编写一个简单的 while 循环来做同样的事情会很容易。但是 OP 的代码并没有这样做,也没有在 while 循环中添加“实际”工作(并在其他地方引用它,因此它不会被优化掉);我的意思是一些 sqrt 之类的东西。我同意你的直觉,但对于 OP 或我来说,while (true) 甚至不会与单个核心挂钩。
  • 如果我创建 8 个不同的线程并在每个线程中运行此代码,我的 cpu 确实达到 100%。但问题是当它在单线程上运行时,所有核心的使用模式都相同吗?为什么操作系统会同时将此分配从一个内核切换到另一个内核?
  • 是的。操作系统(可能是 Windows)协同调度线程并管理哪个线程在何时、在哪个内核上获得时间。通常,除非另有要求,否则应用程序线程会停留在一个内核上。这是为了程序建立的状态的效率。
  • 但是我的测试应用程序并没有停留在一个核心上。它不断地从一个核心转移到另一个核心。这就是为什么一个核心没有达到100,而是分布在所有核心之间的原因?
【解决方案2】:

由于您的应用程序是单线程的,您将只使用一个内核。如果最高为 25%,我可以猜测运行环境配备了四码处理器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2011-02-20
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多