为什么 "while true" 会使用 100% 的 CPU 资源?
Why will "while true" use 100% of CPU resources?
我在 Linux 服务器上 运行 以下 Java 代码:
while (true) {
int a = 1+2;
}
它导致一个 CPU 核心达到 100% 使用率。我对此感到困惑,因为我了解到 CPUs 通过时间分割处理任务,这意味着 CPU 将在一个时间段内完成一项任务(CPU 时间 运行ge 调度器)。如果有 10 个时间段,则 while true 任务最多应该使用 10% CPU 的使用率,因为其他 90% 将分配给其他任务。那为什么是 100%?
如果您的 CPU 使用率未达到 100%,则该进程可以使用任意多的资源(最多 100%),直到其他进程请求使用该资源。 process scheduler 尝试最大化 CPU 使用率,如果没有其他进程需要它,则永远不会让进程缺少 CPU 时间。
因此您的 while
循环将使用 100% 的可用闲置 CPU 资源,并且只会在其他 CPU 密集型进程启动时才开始使用较少的资源。 (如果您正在使用 Linux/Unix,您可以通过启动 while
循环,然后启动另一个 CPU 密集过程并观察 % CPU drop for the process with the loop).
在多任务处理中 OS CPU 时间在执行流(进程、线程)之间分配 - 没错。那么这里发生了什么 - 循环一直执行到时钟中断发生的某个点,OS 使用它来安排来自其他进程或线程的下一次执行 "piece"。但是一旦您的代码没有达到特定点(input/output 或其他可以将进程切换到 "waiting" 状态的系统调用,例如等待同步对象睡眠操作等)进程一直处于 "running" 状态,这告诉调度程序将其保留在执行队列中并在第一个最佳机会重新安排其执行。如果有一些 "competitive" 进程长时间保持其 "running" 状态,那么 CPU 使用将在您和所有这些进程之间共享,否则您的进程执行将立即重新安排无论如何,这将导致持续的高CPU消耗。
我在 Linux 服务器上 运行 以下 Java 代码:
while (true) {
int a = 1+2;
}
它导致一个 CPU 核心达到 100% 使用率。我对此感到困惑,因为我了解到 CPUs 通过时间分割处理任务,这意味着 CPU 将在一个时间段内完成一项任务(CPU 时间 运行ge 调度器)。如果有 10 个时间段,则 while true 任务最多应该使用 10% CPU 的使用率,因为其他 90% 将分配给其他任务。那为什么是 100%?
如果您的 CPU 使用率未达到 100%,则该进程可以使用任意多的资源(最多 100%),直到其他进程请求使用该资源。 process scheduler 尝试最大化 CPU 使用率,如果没有其他进程需要它,则永远不会让进程缺少 CPU 时间。
因此您的 while
循环将使用 100% 的可用闲置 CPU 资源,并且只会在其他 CPU 密集型进程启动时才开始使用较少的资源。 (如果您正在使用 Linux/Unix,您可以通过启动 while
循环,然后启动另一个 CPU 密集过程并观察 % CPU drop for the process with the loop).
在多任务处理中 OS CPU 时间在执行流(进程、线程)之间分配 - 没错。那么这里发生了什么 - 循环一直执行到时钟中断发生的某个点,OS 使用它来安排来自其他进程或线程的下一次执行 "piece"。但是一旦您的代码没有达到特定点(input/output 或其他可以将进程切换到 "waiting" 状态的系统调用,例如等待同步对象睡眠操作等)进程一直处于 "running" 状态,这告诉调度程序将其保留在执行队列中并在第一个最佳机会重新安排其执行。如果有一些 "competitive" 进程长时间保持其 "running" 状态,那么 CPU 使用将在您和所有这些进程之间共享,否则您的进程执行将立即重新安排无论如何,这将导致持续的高CPU消耗。