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