为什么使用 "while true" 会占用100%的CPU资源?

8

我在Linux服务器上运行了以下Java代码:

while (true) {
   int a = 1+2;
}

它导致了一个CPU核心达到了100%的使用率。我对此感到困惑,因为我学过CPU通过时间分割来处理任务,这意味着CPU将在一个时间段内执行一个任务(CPU时间范围调度器)。如果有10个时间段,那么while true任务最多应该使用10%的CPU使用率,因为其他90%将被分配给其他任务。那么为什么是100%呢?

2个回答

10
如果您的CPU使用率不是100%,那么该进程可以使用尽可能多的资源(最多100%),直到其他进程请求使用该资源。 进程调度程序 尝试最大化CPU使用率,并且如果没有其他需要它的进程,则永远不会使进程失去CPU时间。
因此,您的while循环将使用所有可用的空闲CPU资源的100%,并且只有在启动其他CPU密集型进程时才会开始使用更少。(如果您正在使用Linux / Unix,则可以通过启动while循环,然后启动另一个CPU密集型进程并观察具有循环的进程的%CPU下降来观察此情况)。

还有一点不太清楚。如果我们有大量的停滞周期(前端或后端),它是否仍将被视为100%的CPU使用率? - Some Name
1
不幸的是,在“top”和许多其他工具中,停滞周期包括在CPU%指标中(这些工具认为%CPU是CPU不处于空闲周期的时间%)。因此,您必须使用其他工具(如“perf”)来测量由于实际指令正在处理而不是停滞周期(等待内存等)导致的CPU使用率的%。请参见:http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html - J. Taylor
2
CPU%与CPU周期无关,它只是进程实际量子与分配量子的长度差异。进程可以通过很多隐式方式让出CPU,缩短其量子。这个测量仅仅是一个估计值,远远不能与CPU周期相比较。虽然在每个调度节拍中使用PMC可以计算周期,但这将是一个无用的指标(系统管理员不关心未经优化的软件),只会浪费PM资源。当“umonitor”指令广泛可用时(如果有的话),情况可能会改变(或更清晰)。 - Margaret Bloom

3
在一个多任务操作系统中,CPU时间被分配给执行流程(进程、线程)-这是真的。所以在这里会发生什么-循环会一直执行,直到时钟中断发生,操作系统用它来调度来自其他进程或线程的下一个执行"片段"。但是,只要您的代码没有达到特定点(输入/输出或其他系统调用,可以将进程切换到“等待”状态,例如等待同步对象的睡眠操作等),进程就会保持“运行”状态,告诉调度程序将其保留在执行队列中,并在第一个最佳机会重新安排其执行。如果有一些“竞争性”进程也保持其“运行”状态长时间使用CPU,那么CPU使用率将在你和所有这些进程之间共享,否则你的进程执行将立即被重新安排,这将导致持续高CPU消耗。

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