为什么空的无限循环会占用整个CPU?

3

我在C ++中运行一个简单的无限循环:

int main() {
  for (;;) {}
}

当我编译并运行它时,程序占用了我的CPU的100%。为什么会这样?我正在使用Macbook Pro上的g ++ 4.7。


3
你理解这个程序的作用吗? - tenfour
7
你期望什么? - Blorgbeard
你以最高优化级别编译了吗?事实上,GCC可以将无限循环转换为有限循环,但除非你告诉它这样做,否则它不会这样做。(此外,我认为这可能是特定于G++的。你的代码在C中也是有效的,但是如果我没记错,C没有明确的无限循环规则) - MSalters
2个回答

11

CPU会尽可能快地运行它们被赋予的代码。如果没有其他有趣的事情发生,操作系统将尽可能多地将CPU时间分配给想要它的进程。如果同时运行两个此类进程,它们将各自获得大约50%的CPU时间。 (请注意,如果您有多个核心(几乎所有现代CPU都是如此),则用于描述CPU使用情况的术语会变得有些模糊。如果您有一个四核系统,则上面的循环将占用一个核心的100%,或者总体上占用25%。)

不进行I/O(或以其他方式等待任何外部事件)的计算密集型程序都会以同样的方式表现。


1
谢谢!我本以为CPU不会浪费时间运行这么简单的程序(没有内存分配、计算等),但看来我错了! - Jeffrey
10
CPU会严格按照你的指令执行,不多也不少。 :) - Greg Hewgill
4
如果CPU足够智能,能够不执行没有副作用的代码,那么你将解决停机问题。 - Raymond Chen

1
如果您快速查看装配,您会看到:
.L2:
    jmp     .L2
    .cfi_endproc

因此编译器生成了一条跳转指令。 CPU只是按照指令执行:跳来跳去。 你可能会问为什么编译器会生成这段代码。

复现:

gcc -S test.c -o test.s; more test.s

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