草庐IT

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

coder 2023-05-31 原文

据我了解,您编写的 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/

有关c++ - 无休止的While循环会占用CPU资源吗?的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  6. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby - Ruby 中的闭包和 for 循环 - 2

    我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对

随机推荐