文章出处:http://bbs.chinaunix.net/thread-1613560-1-1.html
为什么死循环占用CPU高
一个进程如果是死循环,那么占有的CPU会很高,可是操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?即便是死循环,到时间还是会切换到别的进程,为什么占用CPU会高呢? 因为别的进程也在占用CPU的资源,如果别的进程休眠或者放弃CPU,调度程序又会把这个死循环进程调度回来继续执行。 死循环的时候程序不像其它的程序那样可能在某处被阻塞,比如sleep了,等IO了....这些可能被阻塞的程序在进程睡眠期间都不会被唤醒的,不会占用CPU的,而死循环则不会让出CPU,所以表现出CPU占用率高. 这种死循环一般是用户层的计算,没有调用 系统调用, 除了时间片到期外,陷入内核(通过调用系统调用)也是会引起进程调度的。死循环程序少了这个。 死循环应该是不会让出CPU的 死循环不会让出CPU,但是操作系统的调度模块会对所有的进程进行相应的调度,只要时间片用完了,也会将其放到内核进程的等待队列中去的。 因为循环计数也是需要计算的,而且是不停的计算。 学习中,不知道到底是那个正确,我也很想知道答案阿,等大牛出现 [quote]原帖由 [i]cugb_cat[/i] 于 2009-11-14 01:51 发表 [url=http://bbs2.chinaunix.net/redirect.php?goto=findpost&pid=11470198&ptid=1613560][img]http://bbs2.chinaunix.net/images/common/back.gif[/img][/url]这种死循环一般是用户层的计算,没有调用系统调用,除了时间片到期外,陷入内核(通过调用系统调用)也是会引起进程调度的。死循环程序少了这个。 [/quote]
对,只是少了调度的机会 等一个大牛解析的详细一点 CPU占用是怎么算出来的? 只要开机,CPU就不会休息,总是会在某个进程上运行这个进程就是current。
如果current是0号进程(idle进程),那么就算CPU idle(因为在这个CPU上没有别的进程是处于RUNNING状态的,0号进程才可能被调度运行)。否则,就算CPU被占用。
可见,CPU要idle只有一种情况,那就是这个CPU对应的运行队列里面没有进程(即没有处于RUNNING状态的进程)。
而死循环的进程总是处于RUNNING状态的,不管这个进程是否正在执行、是否要被抢占,没有人会改变它的执行状态,它总是RUNNING。 所以CPU idle当然就会很低。
按我的理解,这种情况下CPU占用应该总是100%,但是由于一些统计方面的原因,CPU占用可能偶尔会低于100%。 你这属于根本不了解 round-robin。
现代操作系统大多包含时间片轮转调度器。我们假设 CPU 有两种状态,一种是运行,一种是空闲,时间片轮转是将 CPU 时间分为大小相等的时间片,采用定时器中断或者类似的方式来通知操作系统选择某一时刻时间片运行完毕后下一个运行的任务。计算为主的进程有更多的机会获得这些时间片,也就是说,如果一个进程在不停地做无意义的循环,它仍旧会被调度,而且占用更多的时间片,CPU 会长久地保持在运行状态。 有点晕了,不知道哪个是正确的 [quote]原帖由 [i]zhangxjian[/i] 于 2009-11-18 23:15 发表 [url=http://bbs3.chinaunix.net/redirect.php?goto=findpost&pid=11488496&ptid=1613560][img]http://bbs3.chinaunix.net/images/common/back.gif[/img][/url]
有点晕了,不知道哪个是正确的 [/quote]
:) 把cpu占用这个指标的原理和计算方法了解清楚后你就没有疑惑了. 死循环,nice 值高一点,也可以让出CPU to 15楼
应该是nice值越低吧
我觉得死循环会操作系统觉得本进程是一个计算优先的进程,故调用的优先级会非常高,虽然也会因为时间片耗尽而让出cpu,但是由于是计算优先的进程,操作系统分配的时间会更多一些 好几个提到了优先级,死循环的优先级比较高吗? 11楼比较好,如果没有服务的话,系统90%以上都是idle,没事可干。有个死循环就不idle,不停的循环。如果同时运行个测试和死循环,那就可以看出系统应该轮流调度,占用时间差不多。 其它的程序也在占用
明白了一大半了,还有一点点疑惑
死循环加入sleep会让cpu空闲下来的
呵呵
为什么死循环占用cpu率高?
可以忽略掉调度的因素,很简单,因为死循环只做计算。
问题应该这样问:为什么非死循环占用率低? 因为非死循环不需做那么多的计算。很多时间花在了io等待上面。
首先要明白这个比例是如何算出来的,11楼说的很好。
关键看占用率的统计方式。
[b]回复 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=11469910&ptid=1613560]1#[/url] [i]zhangxjian[/i] [/b]
如果你在循環中調用了sleep之類的函數出讓CPU時間片, 則不會占用那么多
好像我在哪看见过说[quote]while(1);[/quote]会影响中断的响应。可能是由于cpu的cache造成的。
[quote]好几个提到了优先级,死循环的优先级比较高吗?
[size=2][color=#999999]zhangxjian 发表于 2009-11-21 16:49[/color] [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=11501062&ptid=1613560][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url][/size][/quote]
动态优先级算法会使死循环的优先级变高
[b]回复 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=15597166&ptid=1613560]24#[/url] [i]cobras[/i] [/b]
CPU永远要被什么程序占用。不存在不占用的时刻。
统计是在时钟中断中做的。
这个统计程序检查中断前的指令寄存器的数值,通过这个数值就知道中断前谁在运行。
普通程序多处于调用系统调用的阻塞状态,比如等待键盘输入。这时候,进程不是运行态,在内核中的休眠。
而死循环程序每次统计时候都是在那几行中。如果仅仅有一个死循环程序,那它的占用就接近100%。
100%不意味着CPU不能做其他了。如果CPU做上其他事情(比如内核自己的定时程序启动了,或另外一个死循环启动),这个比例就会下降。
[color=Blue]因为死循环都不能用尽CPU时间的话,
证明操作系统[color=Red][size=7][b]做的不好![/b][/size][/color][/color]
一个进程如果比其他进程更频繁地申请一种资源(比如CPU),系统就会自动提升这个进程申请这种资源的优先级。
怎么会是计算型占时间片多呢,应该是io型进程会分配较多时间片和较低nice值吧
你可以理解成,死循环完整的占用了时间片,大多数情况下,其他过程并不需要完整的占用时间片。
[i=s] 本帖最后由 irp 于 2011-05-09 21:32 编辑 [/i]
平时大多数进程都是[u]wait在kernel[/u], 不会被调度,或者极低的cpu使用率, 时间片没用完就yield了,死循环的进程会用满时间片, 状态总是ready to run, 因为没有机会进入内核来切换到其他状态(不被调度),两方面的因素1,时间片用满,2, 被调度的概率最高。自然使用率自然就上来了。
注: idle用词不当,改为[u]wait in kernel,[/u] 感谢楼下的提醒。
idle进程就是死循环