- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
据我了解,您编写的 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 资源对我来说是个谜。
最佳答案
poll
和 select
调用(Basile Starynkevitch 在评论中提到)或信号量(Als 在回答中提到)是等待请求的正确方法,视情况而定。在没有 poll
或 select
的操作系统上,应该有类似的东西。
sleep
、YieldProcessor
和 sched_yield
都不是执行此操作的正确方法,原因如下。
YieldProcessor
和 sched_yield
只是将进程移动到可运行队列的末尾,但使其可运行。效果是它们允许具有相同或更高优先级的其他进程执行,但是,当这些进程完成时(或者如果没有),则调用 YieldProcessor
或 sched_yield 的进程
继续运行。这会导致两个问题。一是较低优先级的进程仍然不会运行。另一个原因是这会导致处理器始终运行,使用能量。我们希望操作系统能够识别何时不需要运行任何进程并将处理器置于低功耗状态。
sleep
可能允许这种低功耗状态,但它会玩一个猜谜游戏,知道下一个请求到来之前还有多长时间,它会在不需要时反复唤醒处理器,并且它会降低进程对请求的响应,因为即使有需要服务的请求,进程也会继续休眠直到请求的时间到期。
poll
和 select
调用正是针对这种情况而设计的。他们告诉操作系统,这个进程想要处理一个从它的 I/O channel 进来的请求,但是没有工作要做。这允许操作系统将进程标记为不可运行,并在合适的情况下将处理器置于低功耗状态。
使用信号量提供相同的行为,除了唤醒进程的信号来自另一个进程引发信号量,而不是在 I/O channel 中产生的事件。当做一些工作的信号以这种方式到达时,信号量是合适的;只需使用更适合您情况的 poll
或信号量。
poll
、select
或信号量导致内核模式调用的批评无关紧要,因为其他方法也会导致内核模式调用。进程不能自己休眠;它必须调用操作系统来请求它。同样,YieldProcessor
和 sched_yield
向操作系统发出请求。
关于c++ - 无休止的While循环会占用CPU资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13680512/
我是一名优秀的程序员,十分优秀!