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

2021-01-19 10:17:03 +08:00
 pinews
3751 次点击
所在节点    程序员
16 条回复
YouLMAO
2021-01-19 10:21:35 +08:00
单线程啊大哥
linksNoFound
2021-01-19 10:26:29 +08:00
单进程,每个进程的资源是有限的
wakzz
2021-01-19 10:31:05 +08:00
会耗尽单 CPU 的资源
jackmod
2021-01-19 10:35:34 +08:00
不要看总数,看单个 CPU 的占用,肯定是 100%。
jackmod
2021-01-19 10:36:40 +08:00
补充:如果单核占满了,CPU 同样会过热,然后风扇狂转。这种浪费是我难以忍受的。
wangxn
2021-01-19 10:38:59 +08:00
操作系统还是大 boss,它随时能中止程序的执行。
所有程序都是分时间片执行,总会返回内核,它永远不会占用 100%的时间。
Jooooooooo
2021-01-19 10:47:31 +08:00
能耗尽一个核

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

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

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

例子不是很恰当,大概是这个意思吧,那个 iowait 应该是第三种吧,所以 while true 没 sleep 能又快又轻松完成任务。
ben1024
2021-01-21 12:11:19 +08:00
@pinews
可能是第二种,sleep 的时间短,然后在验证下队列消息

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746183

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX