2009-09-29 3 views
2

유닉스에서 g ++로 컴파일했을 때 이 main() 함수에있는 프로그램에서 어떻게되는지 궁금합니다. 프로그램을 실행할 때 CPU 사용률이 0 %입니다. 왜 이런거야? CPU를 먹어서는 안 되는가?유닉스 프로세스 무한

어떻게 든 이것을 최적화하는 컴파일러가 있습니까? 컨텍스트가 전환되는 시스템 호출과 같은 yield_processor를 둠으로써?

이 코드는 (단지 g++ source.cpp로 컴파일) 기본 최적화

int main() 
{ 
    while(1); 
} 

감사를 사용 ++ g로 컴파일!

+0

어떤 최적화 수준을 사용하고 있습니까? ("-O", "-O2", "-O3"?) –

+0

컴파일러 플래그가있는 코드 예를 게시하십시오. – Steven

+0

어떻게 CPU 사용량을 측정하고 있습니까? – derobert

답변

1

while() 본문에 의존성이 표시되지 않으므로 gcc는이 코드에 대해 빈 trigraph를 생성합니다. 이제 실제로 사용하고있는 표준 플래그에 따라 (* nix 환경에있는 경우 환경 변수 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 

이 코드는 (맥 OSX 10.6.1)에 예상대로 내 CPU를 독차지.

+0

O0과 O0에서 컴파일러에서 루프를 얻는 것처럼 보입니다. O3. – rsinha

+0

.s 파일의 차이점은 주로 "label : jmp label"섹션에 게시하십시오. – ZZambia

0

코드에 버그가 있거나, 최적화되지 않았거나, CPU 사용이 잘못되었습니다.

어쨌든, 당신 말이 맞습니다. 그것은 "CPU를 먹어 치워야한다."

0

컴파일러가이 코드를 사용하여 영리한 작업을 수행하는 것은 엄격한 규정이 아닙니다. "있는 그대로"규칙 하에서는 루프에서 실제로 돌아가고 있는지 아니면 잠자고 있는지를 프로그램이 알 수있는 방법이 없습니다.

실행중인 GCC의 버전과 어떤 OS에 대해 더 알고 싶습니다. Mac OS X의 GCC-4는이 코드에서 특별한 것을하지 않습니다.

당연히 OS에는 한 프로세스에서 CPU 사용량에 대한 제한이 설정되어있을 수 있습니다. 나는 그 과정이 그 경우에 멈출 것이라고 생각한다.

+0

st = i486-linux-gnu - 대상 = i486-linux-gnu gcc 버전 4.3.3 (Ubuntu 4.3.3-5ubuntu4) – rsinha