无休止的While循环会占用CPU资源吗?

res*_*ing 21 c c++ linux daemon

据我所知,你编写的Linux守护进程在无限循环中监听请求.
就像是..

int main() {
    while(1) {
        //do something...
    }
}
Run Code Online (Sandbox Code Playgroud)

参考:http://www.thegeekstuff.com/2012/02/c-daemon-process/

我读到睡眠程序使它进入等待模式,因此它不会占用资源.

1.如果我希望我的守护进程每1秒检查一次请求,以下是否会消耗资源?

int main() {
    while(1) {
        if (request) {
            //do something...
        }
        sleep(1)
    }
}
Run Code Online (Sandbox Code Playgroud)

2.如果我要取消睡眠,这是否意味着CPU消耗将增加100%?

3.没有食用资源就可以运行无限循环吗?说..如果它什么都不做,只是循环自己.或者只是睡觉(1).

无尽的循环和CPU资源对我来说是个谜.

Alo*_*ave 14

是否可以在不吃资源的情况下运行无限循环?说..如果它什么都不做,只是循环自己.或者只是睡觉(1).

有一个更好的选择.
你可以使用一个信号量,它在循环开始时仍然被阻塞,你可以在需要循环执行时发出信号量信号.
请注意,这不会占用任何资源.


Eri*_*hil 13

pollselect电话(由巴西莱Starynkevitch在评论中提及)或信号(由阿尔斯在回答中提到的)是正确的方式来等待请求,视情况而定.在没有poll或的操作系统上select,应该有类似的东西.

无论是sleep,YieldProcessor也不sched_yield是正确的方法来做到这一点,有以下原因.

YieldProcessor并且sched_yield只是将进程移动到可运行队列的末尾,但让它可以运行.结果是它们允许执行具有相同或更高优先级的其他进程,但是,当这些进程完成时(或者如果没有),则调用YieldProcessorsched_yield继续运行的进程.这导致两个问题.一个是较低优先级的进程仍然无法运行.另一个原因是,这会导致处理器始终使用能量运行.我们希望操作系统能够识别何时不需要运行进程并将处理器置于低功耗状态.

sleep 可能允许这种低功耗状态,但是它会猜测下一个请求进入之前需要多长时间,它会在没有需要时重复唤醒处理器,并且使得进程对请求的响应性降低,因为即使有服务请求,进程也将继续睡眠,直到请求的时间到期.

pollselect电话的设计正是这种情况.它们告诉操作系统该进程希望为其I/O通道之一上的请求提供服务,否则无需做任何工作.这允许操作系统将进程标记为不可运行,并且如果合适则将处理器置于低功率状态.

使用信号量提供相同的行为,除了唤醒进程的信号来自另一个引发信号量的进程而不是I/O通道中出现的活动.信号量适用于做某事的信号以这种方式到达; 只需使用poll更适合您情况的信号量或信号量.

该批评poll,select或信号导致内核模式调用是无关紧要的,因为其他的方法也导致内核模式调用.一个过程本身无法入睡; 它必须调用操作系统来请求它.同样,YieldProcessor并向sched_yield操作系统发出请求.