cpu使用率跟什么因素有关

kingstarer 2012-09-13 10:53:05
最近思考cpu使用率,有些问题想不明白,发贴请教一下大家。

按我们的编程经验是循环空转会导致cpu使用率上升,循环空转如果从汇编角度来看,是一直做

寄存器操作加1
判断寄存器值是否为0
跳转

这三步动作中是哪一步比较耗cpu呢 还是都耗

我们平时代码中也不乏循环操作,为啥这些循环操作就没这么耗cpu呢

我们知道系统有一个idle进程,这个进程占用cpu比较高时,如果是其它进程占用cpu高,系统反应就会比较快,否则会慢一些
idle进程跟其它进程有啥区别

我们常说计算密集型的程序比较耗cpu,io密集型程序相对小一些。那就是说io读取不消耗cpu? 那从内存读数据耗不耗cpu?

我们知道程序在执行sleep的时候,cpu消耗是比较低的,那在sleep期间,cpu是在做什么呢? cpu什么状态算是空闲态呢?

为啥cpu 100%久了,主机容易重启

欢迎大家讨论,什么是cpu使用率,什么因素会影响cpu使用率
...全文
1332 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstarer 2014-04-01
  • 打赏
  • 举报
回复
感谢大家回复 虽然已不再是程序员,但对编程还是热爱的 有空我还是会写代码,给自己或朋友们写一些小工具,小系统
小猴饲养员 2012-09-26
  • 打赏
  • 举报
回复
我现在遇到了线程cup使用率 99%+的问题:
新后端系统运行12个小时候后,使用的存储模块性能出现了抖动,产生了少量的读取超时。同时cpu使用率从55%飙升到了99%+,存储模块性能5分钟后恢复,但cpu使用率一直没有降低。查看比较系统状态:内存使用没有变化,qps(query per second)没有变化,硬盘读写没有变化,网络访问没有变化,进程都在,虽然前端有超时,但前端有是还能正常收到后端的正确消息,日志数量也不多-10条/秒。
用数据重跑性能测试和稳定性测试都没有cup 使用率过高的问题,请问,可能是什么问题?
qq120848369 2012-09-16
  • 打赏
  • 举报
回复
挂起和阻塞是不占CPU的。

死循环肯定是占的,是用户CPU时间。

Linux下跑死循环机器就跑死了,我有一次在公司服务器上(16核,16G)跑了一个,机器就停止相应了。。
ForestDB 2012-09-16
  • 打赏
  • 举报
回复
自己其实也不是完全理解了,但是感觉LZ把一些概念混淆在一起了。
个人理解的CPU占用,其实指的是CPU在不同的进程中的切换,所谓100%,指的是CPU的都花在这一个进程上了。
而当系统没什么进程在跑的时候,CPU大多都在一个所谓idle的进程上跑。
在解释CPU密集和IO密集之前,我们先来看看一些细节:读/写一个磁盘或外设上的数据的时候,是不需要CPU参与的(当然CPU会做一些准备工作),这里的读/写即IO,不是内存的访问,从API来看,就是调用了read()和write()这样的函数,由于不需要CPU的参与,这时当前进程就可以让出CPU,因为它在等待IO的结果,而CPU就可以去跑别的进程。
这样看来,CPU密集就是需要大量CPU计算,而IO密集指的是IO操作多,时间大多花在IO等待上了。
而所谓sleep,就是当前进程主动让出CPU,让其他进程得到调度。
那为什么一个空while容易让CPU上来呢?因为它反复执行那几个操作,没有机会(比如读写磁盘)从而让出调度。
个人觉得这点上Linux可能会好点,在Linux上面即使是空循环,也很难让CPU100%,因为Linux每隔一段“非常小”的时间就会产生一个中断,然后所有进程都有机会得到重新调度。

推荐LZ看看操作系统原理的书,然后就是APUE。
Gloveing 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
现在还是有些疑问:
sleep期间在做什么
ildle进程实际上是什么东西
为什么cpu 100%久了机器容易死机重启
[/Quote]
NOP
idle进程---都说了,这个进程是虚拟的,实际不存在的
图灵狗 2012-09-16
  • 打赏
  • 举报
回复
1、sleep期间机器尽可能进入睡眠,不消耗任何功率,也就是说CPU不工作;
2、idle期间,CPU执行最低优先级别的任务,都没有的话,执行空指令;
3、100%久了之所以容易死机,应该是另外的问题,比较造成CPU温度过高。

[Quote=引用 10 楼 的回复:]

现在还是有些疑问:
sleep期间在做什么
ildle进程实际上是什么东西
为什么cpu 100%久了机器容易死机重启
[/Quote]
冷月清晖 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

《代码之美》里面有一个例子让任务管理器里面的CPU负荷曲线呈正弦曲线状。
[/Quote]

《编程之美》吧。
npuhuxl 2012-09-15
  • 打赏
  • 举报
回复
还有你说的:

寄存器操作加1
判断寄存器值是否为0
跳转

这三个指令从进程的cpu使用率角度来说,没有更耗cpu的说法,因为进程在执行这些指令的时候,cpu都被他霸占;利用率只与程序占有cpu的时间有关,和执行哪条指令无关。
当然这三条执行执行所需要的cpu时间是不同的。单位时间内寄存器加1操作指令 ips自然高些
npuhuxl 2012-09-15
  • 打赏
  • 举报
回复
其实从cpu角度来说,他的利用率应该始终是100%,因为他一直在跑指令,只是跑的指令所属的进程不同而已。
我觉得如果程序都是按照轮询时间片的方法调度的,并且有n个程序在跑,那么照理说每个程序的cpu使用率都应该是100/n(不考虑内核时间)。当某个程序因为等待挂起,那么自然变成100/(n-1)。而系统中等待的进程占绝大部分,所以系统就应该把所有的cpu资源都留给没有停止的程序,就是我们的while循环程序;同时因为系统采用了动态优先级,所以系统判断while循环进程为cpu型进程,进一步提高它的优先级,它的时间片会更多,系统其他的程序的响应就会变慢。个人理解,如有不对,请指正。
idle进程其实执行就是一些nop指令,等待事件(或中断等)发生,从而引起进程调度。
赵4老师 2012-09-15
  • 打赏
  • 举报
回复
Sleep的时候,对应线程被操作系统线程调度挂起不执行任何CPU指令了,当然不占CPU负荷了。
kingstarer 2012-09-15
  • 打赏
  • 举报
回复
现在还是有些疑问:
sleep期间在做什么
ildle进程实际上是什么东西
为什么cpu 100%久了机器容易死机重启
kingstarer 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:

《代码之美》里面有一个例子让任务管理器里面的CPU负荷曲线呈正弦曲线状。


《编程之美》吧。
[/Quote]
里面其实就是通过sleep和循环来控制cpu使用率 但是没说明原理
Gloveing 2012-09-14
  • 打赏
  • 举报
回复
idle进程---实际上是不存在的
耗不耗CPU不能微观的去看待
冷月清晖 2012-09-14
  • 打赏
  • 举报
回复
来学习,最近一个服务端进程时不时cpu占用100%,昨天一天没复现。
kingstarer 2012-09-14
  • 打赏
  • 举报
回复
谢谢ls总结
图灵狗 2012-09-14
  • 打赏
  • 举报
回复
占用CPU的事情主要是:
1、CPU内部的ALU进行算术逻辑运算;
2、CPU的PC指针跳转;
3、CPU的寄存器操作;
4、CPU进行寄存器与存储器之间的搬运工作;
5、CPU中断处理。
而其它不耗费CPU资源的事情,主要是由各种硬件模块自己分担工作。比如DMA、浮点运算协处理器,显卡和声卡对数据的批量处理等等。
Athenacle_ 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
寄存器操作加1
判断寄存器值是否为0
跳转

这三步动作中是哪一步比较耗cpu呢 还是都耗

我们平时代码中也不乏循环操作,为啥这些循环操作就没这么耗cpu呢

[/Quote]

都耗。具体那个更耗时间等待体系结构大神。

平常的循环操作基本上是有限次的,瞬间就循环完了,而死循环却在永恒不停循环着,当然不一样拉
赵4老师 2012-09-14
  • 打赏
  • 举报
回复
《代码之美》里面有一个例子让任务管理器里面的CPU负荷曲线呈正弦曲线状。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧