unix进程无限

时间:2009-09-29 20:53:05

标签: unix process

我想知道在unix上使用g ++编译时,while(1);函数中只有main()的程序会发生什么。当我运行程序时,我看到0%的CPU使用率。为什么是这样?它应该不会占用CPU吗?

编译器是否以某种方式优化了这个?通过像上下文切换出的系统调用一样使用yield_processor吗?

使用默认优化(仅编译为g++ source.cpp

,使用g ++编译代码
int main()
{
  while(1);
}

谢谢!

3 个答案:

答案 0 :(得分:1)

由于while()体中没有显示任何dependecies,gcc会为这段代码生成一个空的三字符。现在,根据您实际使用的标准标志(同样,检查环境变量CFLAGS和CXXFLAGS,如果在* nix环境中),编译器不会生成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   ___gxx_personality_v0+4@GOTPCREL
    .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上)。

答案 1 :(得分:0)

您的代码中存在错误,优化过多(不太可能),或者误读了您的cpu使用情况。

无论如何,你是对的。它应该“占用cpu。”

答案 2 :(得分:0)

严格遵守编译器使用此代码做一些聪明的事情的规则。在“似乎”规则下,你的程序无法判断它是在循环中旋转,还是只是在睡觉。

我想了解更多关于您正在运行的GCC版本以及操作系统的更多信息。 Mac OS X上的GCC-4对此代码没有任何特殊之处。

当然,您的操作系统可能会为一个进程设置CPU使用限制。不过,我认为这个过程会停止。