2009-09-29 32 views
2

我想知道在使用g ++編譯爲unix時,在main()函數中只有while(1);函數的程序中會發生什麼情況。當我運行該程序時,我看到0%的CPU使用率。爲什麼是這樣?難道它不應該佔用CPU嗎?unix process infinite

編譯器是否在某種程度上優化了它?通過放置一個類似於系統調用的yield_processor來切換上下文?

的代碼被編譯使用g ++使用默認的優化(只編譯爲g++ source.cpp

int main() 
{ 
    while(1); 
} 

謝謝!

+0

你正在使用什麼優化級別? (「-O」,「-O2」,「-O3」?) – 2009-09-29 20:56:26

+0

帶編譯器標誌的後置代碼示例。 – Steven 2009-09-29 20:56:29

+0

你如何測量CPU使用率? – derobert 2009-10-01 06:31:27

回答

1

由於在while()主體中不顯示依賴關係,所以gcc爲這段代碼生成一個空的三字符。現在,取決於你實際使用的標準標誌(同樣,如果在* nix環境中,檢查env。變量CFLAGS和CXXFLAGS),編譯器不會生成asm「hogging」代碼。

只要在做了g++ -S source.cpp source.s文件(包含ASM代碼)後檢查,如果循環已經產生或沒有。

這裏是我與G無優化標誌輸出++(GCC)4.5.0 20090910(實驗):

.text 
.globl _main 
_main: 
LFB0: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
L2: 
    jmp L2 
LFE0: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zPR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x6 
    .byte 0x9b 
    .long [email protected] 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB0-. 
    .set L$set$2,LFE0-LFB0 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB0 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .constructor 
    .destructor 
    .align 1 
    .subsections_via_symbols 

此代碼豬我的CPU如預期(在Mac OSX 10.6.1)。

+0

看起來像我從編譯器在O0和O3。 – rsinha 2009-09-30 21:30:30

+0

發佈您的.s文件差異,主要是「標籤:jmp標籤」部分 – ZZambia 2009-10-02 07:02:10

0

您在代碼中存在一個錯誤,太多優化(不太可能),或者誤讀了您的cpu使用情況。

無論如何,你是對的。它應該「佔用cpu」。

0

這不是嚴格違反你的編譯器的規則來做這個代碼聰明的事情。在「彷彿」規則下,程序無法判斷它是否真的在循環中旋轉,或者只是在睡覺。

我想知道更多關於您正在運行的GCC版本以及操作系統的信息。 Mac OS X上的GCC-4對此代碼不做任何特殊處理。

當然,您的操作系統可能會爲一個進程設置CPU使用限制。不過,我認爲這個過程在這種情況下會停止。

+0

st = i486-linux-gnu --target = i486-linux-gnu gcc版本4.3.3(Ubuntu 4.3.3-5ubuntu4) – rsinha 2009-09-30 01:37:58