正常的 while true 为什么不加 sleep 也不会耗尽 cpu? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
pinews
V2EX    程序员

正常的 while true 为什么不加 sleep 也不会耗尽 cpu?

  •  
  •   pinews 2021-01-19 10:17:03 +08:00 4130 次点击
    这是一个创建于 1757 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    2021-01-21 12:11:19 +08:00
    YouLMAO
        1
    YouLMAO  
       2021-01-19 10:21:35 +08:00 via Android
    单线程啊大哥
    linksNoFound
        2
    linksNoFound  
       2021-01-19 10:26:29 +08:00
    单进程,每个进程的资源是有限的
    wakzz
        3
    wakzz  
       2021-01-19 10:31:05 +08:00
    会耗尽单 CPU 的资源
    jackmod
        4
    jackmod  
       2021-01-19 10:35:34 +08:00
    不要看总数,看单个 CPU 的占用,肯定是 100%。
    jackmod
        5
    jackmod  
       2021-01-19 10:36:40 +08:00
    补充:如果单核占满了,CPU 同样会过热,然后风扇狂转。这种浪费是我难以忍受的。
    wangxn
        6
    wangxn  
       2021-01-19 10:38:59 +08:00 via iPhone   2
    操作系统还是大 boss,它随时能中止程序的执行。
    所有程序都是分时间片执行,总会返回内核,它永远不会占用 100%的时间。
    Jooooooooo
        7
    Jooooooooo  
       2021-01-19 10:47:31 +08:00
    能耗尽一个核

    如果是 8 核的机器搞一个死循环然后去看 cpu.busy 的监控会发现一条 12.5% 左右的线
    julyclyde
        8
    julyclyde  
       2021-01-19 11:02:33 +08:00
    所谓正常 while 那就是里边还多少执行了点儿正经内容的呗
    正经内容很难跑满 cpu 的,多少会有点 iowait 啥的
    pinews
        9
    pinews  
    OP
       2021-01-19 11:02:56 +08:00
    我说正常的 while true 是正常使用的。比如 kafka 的 php 示例就是 while true 我看 cpu 也没什么变化,如果跑满 4 核不是要占到 25 33 ?
    systemcall
        10
    systemcall  
       2021-01-19 11:05:25 +08:00 via Android
    自己去复习多任务
    正常的 while,用中断可以跳出去执行别的,不会卡死。系统有个中断向量表,而且会管理多任务,正常情况下不会让一个进程独占所有的资源
    pinews
        11
    pinews  
    OP
       2021-01-19 11:28:12 +08:00
    @wangxn 如果 while(true){};那是不是他把所有时间片都占用了,所以会 100%
    @julyclyde iowait 是啥?大概了解了一下,如果 cpu 虽然不用干活,但是也不能干别的,那有什么区别?
    @systemcall 程序是怎么调用中断的?比如消息队列,我到 github 上搜源代码,看不懂,也没找到什么想要了解的信息
    julyclyde
        12
    julyclyde  
       2021-01-19 11:31:35 +08:00
    @pinews IO 的时候这个程序是没办法执行下去的,只能等
    cpu 可以去干别的,如果有别的
    sryanyuan
        13
    sryanyuan  
       2021-01-19 18:46:46 +08:00
    调度策略是充分利用 cpu 资源,防止有进程想要资源却得不到满足,当你只有一个死循环的时候,调度的资源就都给那个进程了,所以就表现为 100%了,因为它不断的想要 cpu,没有其它任务和它抢
    ben1024
        14
    ben1024  
       2021-01-19 20:24:29 +08:00
    @pinews
    里面的执行任务里有同步阻塞
    pinews
        15
    pinews  
    OP
       2021-01-21 10:36:57 +08:00
    @ben1024 阻塞就是超时等待吧?

    我借之前一个网友去快递点取快递的例子总结下。

    第一个是,去了发现没有就回来,然后马上再接着去(很累很蠢,因为本来是预计已经到了,只取一次的)
    第二个是,去了发现没有就回来,过一会( sleep )再去(不累了,但是会不及时)
    第三个是,去了返现没有,就在那里等,如果在这个时间里没等到就回来,然后接着去,但是很有可能等到,或者干脆等不到就不回来,直到等到才回去(不累也很及时,但是要快点递支持在里面等)

    例子不是很恰当,大概是这个意思吧,那个 iowait 应该是第三种吧,所以 while true 没 sleep 能又快又轻松完成任务。
    ben1024
        16
    ben1024  
       2021-01-21 12:11:19 +08:00
    @pinews
    可能是第二种,sleep 的时间短,然后在验证下队列消息
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     998 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 19:26 PVG 03:26 LAX 11:26 JFK 14:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86