2012-08-26 18 views
2

我在C++運行一個簡單的無限循環:爲什麼一個空的無限循環使用我的整個CPU?

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

,當我編譯並運行它,程序佔用我的CPU的100%。爲什麼會發生?我在Macbook Pro上使用g ++ 4.7。

+3

你明白這個程序做什麼? – tenfour

+7

你期望什麼? – Blorgbeard

+0

你是否在最優化級別編譯過? GCC實際上*可以*將無限循環變成有限循環,但除非您也告訴它,否則不會這樣做。 (另外,我認爲這可能是特定於G ++的。您的代碼在C中也是有效的,但C沒有針對無限循環IIRC的明確規則) – MSalters

回答

10

CPU以儘可能快的速度運行代碼。如果沒有什麼其他興趣在發生,操作系統會盡可能多地爲需要它的進程提供CPU時間。如果您同時運行這兩個進程的兩個,則它們每個都將獲得大約50%的CPU時間。 (請注意,如果您擁有多個核心,那麼用於描述CPU使用情況的術語會有點模糊,因爲幾乎所有現代CPU都會這樣做;如果您有四核心繫統,則上述環路將佔用一個核心的100%,即25 )

不計算I/O(或以其他方式等待外部任何事情)的計算綁定程序的行爲方式都是相同的。

+0

謝謝!我預計CPU不會浪費CPU運行這樣一個簡單的程序(沒有內存分配,計算等),但似乎我錯了! – Jeffrey

+8

CPU完全按照你告訴他們做的事情做,只不過是一點點。 :) –

+3

如果CPU足夠聰明,不會執行沒有輔助效果的代碼,那麼您就可以解決停機問題。 –

1

如果你快速瀏覽一下在裝配您將看到:

.L2: 
    jmp  .L2 
    .cfi_endproc 

所以編譯器生成一個跳轉指令。 CPU只是按照指示執行:跳轉。 你可以問爲什麼編譯器生成這個代碼。

攝製:

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