我在C++運行一個簡單的無限循環:爲什麼一個空的無限循環使用我的整個CPU?
int main() {
for (;;) {}
}
,當我編譯並運行它,程序佔用我的CPU的100%。爲什麼會發生?我在Macbook Pro上使用g ++ 4.7。
我在C++運行一個簡單的無限循環:爲什麼一個空的無限循環使用我的整個CPU?
int main() {
for (;;) {}
}
,當我編譯並運行它,程序佔用我的CPU的100%。爲什麼會發生?我在Macbook Pro上使用g ++ 4.7。
CPU以儘可能快的速度運行代碼。如果沒有什麼其他興趣在發生,操作系統會盡可能多地爲需要它的進程提供CPU時間。如果您同時運行這兩個進程的兩個,則它們每個都將獲得大約50%的CPU時間。 (請注意,如果您擁有多個核心,那麼用於描述CPU使用情況的術語會有點模糊,因爲幾乎所有現代CPU都會這樣做;如果您有四核心繫統,則上述環路將佔用一個核心的100%,即25 )
不計算I/O(或以其他方式等待外部任何事情)的計算綁定程序的行爲方式都是相同的。
謝謝!我預計CPU不會浪費CPU運行這樣一個簡單的程序(沒有內存分配,計算等),但似乎我錯了! – Jeffrey
CPU完全按照你告訴他們做的事情做,只不過是一點點。 :) –
如果CPU足夠聰明,不會執行沒有輔助效果的代碼,那麼您就可以解決停機問題。 –
如果你快速瀏覽一下在裝配您將看到:
.L2:
jmp .L2
.cfi_endproc
所以編譯器生成一個跳轉指令。 CPU只是按照指示執行:跳轉。 你可以問爲什麼編譯器生成這個代碼。
攝製:
gcc -S test.c -o test.s; more test.s
你明白這個程序做什麼? – tenfour
你期望什麼? – Blorgbeard
你是否在最優化級別編譯過? GCC實際上*可以*將無限循環變成有限循環,但除非您也告訴它,否則不會這樣做。 (另外,我認爲這可能是特定於G ++的。您的代碼在C中也是有效的,但C沒有針對無限循環IIRC的明確規則) – MSalters