无尽的While循环占用CPU资源?

根据我的理解,您可以编写一个无限循环监听请求的Linux守护程序。
就像是..

int main() { while(1) { //do something... } } 

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

我读了一个程序,让它进入等待模式,所以它不会占用资源。

1.如果我想让我的守护进程每隔1秒检查一次请求,下面是否会耗费资源?

 int main() { while(1) { if (request) { //do something... } sleep(1) } } 

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

3.有没有资源可以无限循环? 说..如果它什么都不做,只是循环。 或者只是睡觉(1)。

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

Solutions Collecting From Web of "无尽的While循环占用CPU资源?"

如果不吃资源,是否可以无限循环? 说..如果它什么都不做,只是循环。 或者只是睡觉(1)。

有一个更好的选择。
你可以使用一个信号量 ,它在循环开始时保持阻塞状态,只要你想循环执行就可以发出信号。
请注意,这不会吃任何资源。

pollselect调用(由Basile Starynkevitch在评论中提到)或信号量(由Als在答复中提到)是根据情况等待请求的正确方法。 在没有pollselect操作系统上,应该有类似的东西。

由于以下原因, sleepYieldProcessorsched_yield是正确的方法。

YieldProcessorsched_yield仅将进程移动到可运行队列的末尾,但保持可运行状态。 其效果是它们允许执行相同或更高优先级的其他进程,但是当这些进程完成时(或者没有),那么称为YieldProcessorsched_yield的进程将继续运行。 这导致两个问题。 一个是较低优先级的进程仍然不会运行。 另一个原因是这使得处理器总是运行,使用能源。 我们希望操作系统能够识别什么时候没有进程需要运行,并且使处理器进入低功耗状态。

sleep可能允许这种低功耗的状态,但是它会在下一个请求进入之前玩多长时间的猜谜游戏,它在没有需要的时候重复地唤醒处理器,并且使得该处理对请求的响应较少,因为即使存在要求服务的请求,该过程也将继续睡眠,直到所请求的时间到期。

pollselect电话正是为这种情况而设计的。 他们告诉操作系统这个进程想要服务一个来自其I / O通道之一的请求,但是没有工作要做。 这允许操作系统将进程标记为不可运行,并且在适当的情况下使处理器处于低功耗状态。

使用信号提供相同的行为,除了唤醒进程的信号来自另一个引发信号量的进程而不是I / O通道中产生的活动。 当信号做一些工作到达时,信号量是适合的; 只要使用poll或信号量更适合您的情况。

pollselect或信号量导致内核模式调用的批评是不相关的,因为其他方法也会导致内核模式调用。 一个过程不能独立睡眠; 它必须调用操作系统来请求它。 同样, YieldProcessorsched_yield向操作系统发出请求。

简单的答案是肯定的 – 消除睡眠给了100%的CPU – 但答案确实取决于一些额外的细节。 它消耗所有可以得到的CPU,除非…

  1. 循环体是微不足道的,并优化了。
  2. 循环包含阻止操作(如文件或网络操作)。 您提供的链接建议避免这种情况,但阻止相关事件发生是一个好主意。

编辑:为您的方案,我支持由@Als作出的建议。

编辑2:我期望这个答案已经收到-1,因为我声称阻止操作实际上可以是一个好主意。 [如果你-1,你应该留下一个评论的动机,以便我们都可以学到一些东西。]

目前流行的思想是非块(基于事件)的IO很好,阻塞是不好的。 这个视图过于简单,因为它假定所有执行IO的软件都可以通过使用非阻塞操作来提高吞吐量。

什么? 我真的建议使用非阻塞IO实际上可以减少吞吐量吗? 是的,它可以。 当进程服务于单个活动时,实际上最好使用阻塞IO,因为阻塞IO只会烧掉已存在进程中已经支付的资源。

相比之下,非阻塞IO可以承载比简单阻塞IO更大的固定开销。 如果进程无法提供可以交错的附加IO,那么通过支付非阻塞设置就没有任何好处。 (在实践中,不恰当的非阻塞IO的最大代价只是增加了代码的复杂性,除此之外,这个主题主要是一个思考练习。

在阻止IO的情况下,我们依靠操作系统安排那些可以取得进展的进程。 这就是操作系统设计的目的。

在非阻塞IO下,我们有更高的设置成本,但可以在交错工作之间共享进程及其线程的资源。 因此,非阻塞IO对于任何服务于多个独立活动(如Web服务器)的进程都是理想的选择。 所获得的吞吐量远远优于非阻塞IO的固定成本开销。