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

新手上路,请多包涵

据我了解,您编写的 Linux 守护程序在无限循环中侦听请求。

就像是..

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

参考: 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 资源对我来说是个谜。

原文由 resting 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

有一个更好的选择。

您可以只使用 semaphore ,它在循环开始时保持阻塞,并且您可以在希望循环执行时向 semaphore 发出信号。

请注意,这不会吃掉任何资源。

原文由 Alok Save 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

sleepYieldProcessorsched_yield 都不是正确的方法,原因如下。

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

sleep 可能允许这种低功耗状态,但它会玩一个猜想距离下一个请求到来还有多长时间,它会在不需要时反复唤醒处理器,并让进程对请求的响应较少,因为即使有要服务的请求,进程也会继续休眠直到请求的时间到期。

pollselect 调用正是针对这种情况而设计的。他们告诉操作系统,这个进程想要处理一个从它的 I/O 通道进来的请求,但是没有工作要做。这允许操作系统将进程标记为不可运行,并在合适的情况下将处理器置于低功耗状态。

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

批评 pollselect 或信号量导致内核模式调用是无关紧要的,因为其他方法也会导致内核模式调用。进程不能自己休眠;它必须调用操作系统来请求它。同样, YieldProcessorsched_yield 向操作系统发出请求。

原文由 Eric Postpischil 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题