unix进程无限

unix进程无限,unix,process,Unix,Process,我想知道在一个只有while(1)的程序中会发生什么。当我运行程序时,我看到0%的cpu使用率。为什么会这样?它不应该占用cpu吗 编译器是否以某种方式对此进行了优化?通过放置一个类似于处理器的系统调用,上下文会自动切换吗 代码是使用默认优化使用g++编译的(只是编译为g++source.cpp) 谢谢 您的代码中可能存在错误,或者进行了太多优化(不太可能),或者误读了cpu使用情况 无论如何,你是对的。它应该“占用cpu。”编译器使用此代码进行一些巧妙的操作并不严格违反规则。根据“仿佛”规则,

我想知道在一个只有
while(1)的程序中会发生什么main()
函数中的code>。当我运行程序时,我看到0%的cpu使用率。为什么会这样?它不应该占用cpu吗

编译器是否以某种方式对此进行了优化?通过放置一个类似于处理器的系统调用,上下文会自动切换吗

代码是使用默认优化使用g++编译的(只是编译为
g++source.cpp


谢谢

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


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

编译器使用此代码进行一些巧妙的操作并不严格违反规则。根据“仿佛”规则,程序无法判断它是在循环中旋转,还是只是在睡觉

我想了解更多关于您正在运行的GCC版本和操作系统的信息。MacOSX上的GCC-4没有对这段代码做任何特殊的处理


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

由于while()主体中没有显示依赖项,因此gcc会为这段代码生成一个空trigraph。现在,根据您实际使用的标准标志(如果在*nix环境中,请检查环境变量CFLAGS和cxflags),编译器不会生成asm“占用”代码

只需在执行
g++-S source.cpp
source.S文件(包含ASM代码)后检查循环是否已生成

以下是我的输出,没有使用g++(GCC)4.5.0 20090910(实验)的优化标志:


这段代码像预期的那样占用了我的CPU(在Mac OSX 10.6.1上)。

您使用的优化级别是什么?(“-O”、“-O2”、“-O3”?)带有编译器标志的Post代码示例。您如何衡量CPU使用率?st=i486 linux gnu--target=i486 linux gnu gcc版本4.3.3(Ubuntu 4.3.3-5ubuntu4)看起来我在O0和O3处都从编译器得到了一个循环。Post您的.s文件差异,主要是“label:jmp label”部分
int main()
{
  while(1);
}
    .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