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

标签 c++ c linux infinite-loop daemon

据我了解,您编写的 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.如果我取消 sleep ,是否意味着CPU消耗会增加100%?

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

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

最佳答案

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

sleepYieldProcessorsched_yield 都不是执行此操作的正确方法,原因如下。

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

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

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

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

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

关于c++ - 无休止的While循环会占用CPU资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13680512/

相关文章:

linux - 从 shell 中清理文件

linux - 在 bash shell 中的 for 循环内连接字符串变量

c++ - 使用 boost::asio::generic::raw_protocol::socket 时 OS (Linux) 不添加第 2 层 header

c++ - C++无法取消引用结束列表迭代器

c++ - 使用 Boost 库程序选项的必需和可选参数

我们可以在树莓派 2 上运行 labview 生成的 C 代码吗?

c++ - C/C++ 中的定点奇异值分解

C++ - 在嵌套模板实例化中调用非默认构造函数

C++ 在环境变量 RC 中找不到编译器集

c++ - 用户空间和内核空间进程中的一组信号处理程序