V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pinews
V2EX  ›  程序员

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

  •  
  •   pinews · 2021-01-19 10:17:03 +08:00 · 3754 次点击
    这是一个创建于 1406 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   3025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:39 · PVG 22:39 · LAX 06:39 · JFK 09:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.