为啥意外的无限循环会增加 CPU 使用率?

Posted

技术标签:

【中文标题】为啥意外的无限循环会增加 CPU 使用率?【英文标题】:why does an infinite loop of the unintended kind increase the CPU use?为什么意外的无限循环会增加 CPU 使用率? 【发布时间】:2011-02-20 05:30:49 【问题描述】:

我知道意外循环的无限循环通常会导致 CPU 使用率很高。但是,我不太明白为什么。谁能给我解释一下?

【问题讨论】:

【参考方案1】:

CPU 在执行该循环时不能做任何其他事情(它永远不会结束)。即使您使用的是抢先式多任务系统(这样无限循环只会永远阻塞它自己的进程或线程),每次操作系统的抢先式调度程序交给它时,循环都会“吃掉”它的时间片下一个切片的 CPU —— 什么都不做,但每次都会占用一个切片的 CPU 时间,因此所有其他线程都会丢失大量 CPU,这些线程可能否则会做有用的工作。

【讨论】:

这个答案虽然可能是正确的,但看起来太难了,因此对提出此类问题的人没有多大帮助。除了大量使用技术术语之外,作为段落大部分内容的第二句特别长,无法解析。【参考方案2】:

无限循环与运行的任何其他代码没有什么不同。计算机不知道无限循环并不是一个需要大量迭代的复杂计算。

除非无限循环包含调用某些系统函数的代码,这些函数将时间返回给操作系统,否则操作系统会将其视为一个正在积极处理某事并为其提供时间执行的进程。如果没有其他进程在运行,它将占用 100% 的 CPU(在单核系统上)。

【讨论】:

实际上在现代通用 O/S 中,任何正常的代码都会进入可中断的等待状态,这会阻止内核在该线程上执行任何操作,直到它需要为止。 同意,但我的比较是通过密集计算,例如为学术研究所做的计算。【参考方案3】:

无限循环本身根本不是问题。大多数与用户交互的应用程序都是无限循环。他们反复等待用户,对其采取行动,然后再次执行循环。操作系统本身就是一个无限循环。这种无限循环被称为“富有成效”,因为尽管会无限重复某些内容,但它们会定期输出对用户有用的内容。

我猜你担心的是非生产性的无限循环。但很清楚为什么这些是一个问题。它们具有生产循环的所有缺点(消耗功率、使用 CPU 时间等)而没有任何优点,即。它们不会产生任何有用的东西。

【讨论】:

尽管您的第一段内容丰富且有帮助,但第二段是循环的。问题是,为什么这种无意识的无限循环会“消耗电力、使用 CPU 时间等等”? 如今,您几乎不需要无限循环来等待用户交互。您通常使用阻塞式操作系统或框架 API 并接收用户输入作为事件/回调。【参考方案4】:

您可能指的是Halt and Catch Fire instruction

【讨论】:

以上是关于为啥意外的无限循环会增加 CPU 使用率?的主要内容,如果未能解决你的问题,请参考以下文章

无限循环的线程是不是会导致 CPU 过多

为啥这段代码会进入无限循环? [复制]

为啥以 char 作为索引的循环会无限循环?

为啥这个回调会产生无限循环

有人能告诉我为啥这个方法会进入无限循环吗?

为啥计算内部的异步会产生无限循环(vue)?