26

据我了解,您编写的 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 资源对我来说是个谜。

4

3 回答 3

16

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

sleep, YieldProcessor, 也不是sched_yield正确的方法,原因如下。

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

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

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

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

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

于 2012-12-03T14:34:12.533 回答
14

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

有一个更好的选择。
您可以只使用semaphore,它在循环开始时保持阻塞,并且您可以在希望循环执行时向 semaphore 发出信号。
请注意,这不会吃掉任何资源。

于 2012-12-03T09:41:36.250 回答
3

简短的回答是肯定的——移除睡眠会提供 100% 的 CPU——但答案确实取决于一些额外的细节。它消耗了它可以获得的所有CPU,除非......

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

编辑:对于您的情况,我支持@Als 提出的建议。

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

当前流行的想法是,非阻塞(基于事件的)IO 是好的,阻塞是坏的。这个观点过于简单了,因为它假设所有执行 IO 的软件都可以通过使用非阻塞操作来提高吞吐量。

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

相比之下,非阻塞 IO 可以比简单的阻塞 IO 承载更大的固定开销。如果进程不能提供可以交错的额外 IO,那么支付非阻塞设置就没有任何好处。(在实践中,不适当的非阻塞 IO 的最大成本仅仅是增加了代码复杂性。除此之外,这个主题在很大程度上是一个思考练习。)

在阻塞 IO 下,我们依靠操作系统来调度那些可以取得进展的进程。这就是操作系统的设计目的。

在非阻塞 IO 下,我们有更大的设置成本,但可以在交错工作之间共享进程及其线程的资源。因此,非阻塞 IO 非常适合任何服务于多个独立活动的进程,例如 Web 服务器。获得的吞吐量大大优于非阻塞 IO 的固定成本开销。

于 2012-12-03T09:45:14.783 回答