为什么死循环占用CPU高

CPU占用报错中死循环检测的报错与修复 CPU死循环问题诊断与修复指南 当CPU占用率飙升至100%时,死循环往往是罪魁祸首。本文总结死循环的检测方法和修复策略:通过Linux命令(top/ps)和Java工具(jstack/Arthas)定位CPU线程,分析线程堆栈;修复时需添加终止条件、引入超时机制或异步处理;推荐采用代码规范、监控告警和压力测试进行预防。文中包含具体代码示例和工具使用说明,帮助开发者快速解决CPU占用问题。 阅读详情

文章出处:http://bbs.chinaunix.net/thread-1613560-1-1.html

 

为什么死循环占用CPU高

一个进程如果是死循环,那么占有的CPU会很高,可是操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?即便是死循环,到时间还是会切换到别的进程,为什么占用CPU会高呢?

 

scutan 发表于 2009-11-13 22:12

因为别的进程也在占用CPU的资源,如果别的进程休眠或者放弃CPU,调度程序又会把这个死循环进程调度回来继续执行。

 

converse 发表于 2009-11-13 22:26

死循环的时候程序不像其它的程序那样可能在某处被阻塞,比如sleep了,等IO了....这些可能被阻塞的程序在进程睡眠期间都不会被唤醒的,不会占用CPU的,而死循环则不会让出CPU,所以表现出CPU占用率高.

 

cugb_cat 发表于 2009-11-14 01:51

这种死循环一般是用户层的计算,没有调用 系统调用除了时间片到期外,陷入内核(通过调用系统调用)也是会引起进程调度的。死循环程序少了这个。

 

chinesedragon 发表于 2009-11-14 10:30

死循环应该是不会让出CPU的

 

scutan 发表于 2009-11-14 13:13

死循环不会让出CPU,但是操作系统的调度模块会对所有的进程进行相应的调度,只要时间片用完了,也会将其放到内核进程的等待队列中去的。

 

prolj 发表于 2009-11-14 13:20

因为循环计数也是需要计算的,而且是不停的计算。

 

bill2012 发表于 2009-11-18 10:00

学习中,不知道到底是那个正确,我也很想知道答案阿,等大牛出现

 

zhoubug 发表于 2009-11-18 10:22

[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]
对,只是少了调度的机会

 

zhangxjian 发表于 2009-11-18 12:38

等一个大牛解析的详细一点

 

kouu 发表于 2009-11-18 13:08

CPU占用是怎么算出来的? 只要开机,CPU就不会休息,总是会在某个进程上运行这个进程就是current。
如果current是0号进程(idle进程),那么就算CPU idle(因为在这个CPU上没有别的进程是处于RUNNING状态的,0号进程才可能被调度运行)。否则,就算CPU被占用。

可见,CPU要idle只有一种情况,那就是这个CPU对应的运行队列里面没有进程(即没有处于RUNNING状态的进程)。
而死循环的进程总是处于RUNNING状态的,不管这个进程是否正在执行、是否要被抢占,没有人会改变它的执行状态,它总是RUNNING。 所以CPU idle当然就会很低。

按我的理解,这种情况下CPU占用应该总是100%,但是由于一些统计方面的原因,CPU占用可能偶尔会低于100%。

 

langue 发表于 2009-11-18 13:26

你这属于根本不了解 round-robin
现代操作系统大多包含时间片轮转调度器。我们假设 CPU 有两种状态,一种是运行,一种是空闲,时间片轮转是将 CPU 时间分为大小相等的时间片,采用定时器中断或者类似的方式来通知操作系统选择某一时刻时间片运行完毕后下一个运行的任务。计算为主的进程有更多的机会获得这些时间片,也就是说,如果一个进程在不停地做无意义的循环,它仍旧会被调度,而且占用更多的时间片,CPU 会长久地保持在运行状态。

 

zhangxjian 发表于 2009-11-18 23:15

有点晕了,不知道哪个是正确的

 

system888net 发表于 2009-11-18 23:53

[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占用这个指标的原理和计算方法了解清楚后你就没有疑惑了.

 

net_robber 发表于 2009-11-19 10:44

死循环,nice 值高一点,也可以让出CPU

 

geodge831012 发表于 2009-11-20 17:13

to 15楼
应该是nice值越低吧
我觉得死循环会操作系统觉得本进程是一个计算优先的进程,故调用的优先级会非常高,虽然也会因为时间片耗尽而让出cpu,但是由于是计算优先的进程,操作系统分配的时间会更多一些

 

zhangxjian 发表于 2009-11-21 16:49

好几个提到了优先级,死循环的优先级比较高吗?

 

你就依了我吧 发表于 2009-11-21 18:31

11楼比较好,如果没有服务的话,系统90%以上都是idle,没事可干。有个死循环就不idle,不停的循环。如果同时运行个测试和死循环,那就可以看出系统应该轮流调度,占用时间差不多。

 

hbfnjx 发表于 2009-11-22 02:22

其它的程序也在占用

 

zhangxjian 发表于 2009-11-24 19:24

明白了一大半了,还有一点点疑惑

 

ZSMDEV 发表于 2009-11-24 21:44

死循环加入sleep会让cpu空闲下来的
呵呵

 

peidright 发表于 2009-11-24 21:57

为什么死循环占用cpu率高?
可以忽略掉调度的因素,很简单,因为死循环只做计算。

问题应该这样问:为什么非死循环占用率低? 因为非死循环不需做那么多的计算。很多时间花在了io等待上面。

 

yifeng1118 发表于 2011-05-05 10:42

首先要明白这个比例是如何算出来的,11楼说的很好。

 

cobras 发表于 2011-05-05 11:25

关键看占用率的统计方式。

 

Cindinx 发表于 2011-05-05 13:00

[b]回复 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=11469910&ptid=1613560]1#[/url] [i]zhangxjian[/i] [/b]
如果你在循環中調用了sleep之類的函數出讓CPU時間片, 則不會占用那么多

 

cobras 发表于 2011-05-05 16:04

好像我在哪看见过说[quote]while(1);[/quote]会影响中断的响应。可能是由于cpu的cache造成的。

 

sparkzh 发表于 2011-05-05 19:35

[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]
动态优先级算法会使死循环的优先级变高

 

思一克 发表于 2011-05-06 13:26

[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做上其他事情(比如内核自己的定时程序启动了,或另外一个死循环启动),这个比例就会下降。

 

AD8018 发表于 2011-05-06 15:29

[color=Blue]因为死循环都不能用尽CPU时间的话,
证明操作系统[color=Red][size=7][b]做的不好![/b][/size][/color][/color]

 

hereareyou 发表于 2011-05-06 17:21

一个进程如果比其他进程更频繁地申请一种资源(比如CPU),系统就会自动提升这个进程申请这种资源的优先级。

 

jy02107028 发表于 2011-05-06 18:28

怎么会是计算型占时间片多呢,应该是io型进程会分配较多时间片和较低nice值吧

 

peidright 发表于 2011-05-07 20:43

你可以理解成,死循环完整的占用了时间片,大多数情况下,其他过程并不需要完整的占用时间片。

 

irp 发表于 2011-05-09 16:33

[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] 感谢楼下的提醒。

 

xiaonanln 发表于 2011-05-09 17:02

idle进程就是死循环

光猫桥接后网速不升反降?可能是你的路由器在“偷懒”! 本文详细分析了光猫桥接后网速不升反降的常见原因,包括路由器性能不足、MTU/MSS值设置错误等,并提供了四个关键排查步骤和路由器选购指南。通过优化PPPoE拨号设置和硬件配置,帮助用户解决网速下降问题,提升家庭网络性能。 阅读详情

相关推荐

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 241

定位死循环或者CPU使用率问题

CPU, gdb, attach, info threads CPU, gdb, attach, info threads

易语言CPU优化

易语言CPU优化,改下进程名字即可。。一起学习,一起进步。

为什么一个死循环线程会100%占用一个CPU

在一个死循环中,如果没有合适的停止条件或者等待条件,线程将会持续地执行相同的操作,不断地占用 CPU 资源。这会导致该线程占用一个 CPU 的计算资源,并且其他任务可能无法获得足够的CPU时间片来执行。一个死循环线程会占用一个CPU 的 100% 是因为它在不停地执行代码,而且没有进行休眠或者等待的操作,导致它消耗了大量的 CPU 时间。将会让线程每次循环后休眠 0.1 秒,释放 CPU 资源给其他任务。要解决这个问题,可以在死循环中加入适当的等待或者休眠操作,以让线程释放 CPU 资源给其他任务。

weixin_44943389的博客 2036

空的死循环为什么会让cpu100%

while (1) { //空代码块 }       上面这个代码相信很多人都写过,这个代码的后果就是cpu会100%(具体数值要看cpu核数和操作系统对这个的表示方法,有的2核会显示50%,有的2核会显示100%),如果是单核那么你的电脑会相当卡了。解决这个问题的办法很简单 while (1) { sleep(1); } 加上一个sleep(1),让她休眠一秒就好...

Lonely_Devil的博客 1万+

为什么死循环占用CPU[整理贴]

<br />恰巧遇见这中问题,故将网上帖子整理下~<br /> <br />////整理如下///////s<br />一个进程如果是死循环,那么占有的CPU会很,可是操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?即便是死循环,到时间还是会切换到别的进程,为什么占用CPU呢?<br /> <br />死循环的时候程序不像其它的程序那样可能在某处被阻塞,比如sleep了,等IO....这些可能被阻塞的程序在进程睡眠期间都不会被唤醒的,不会占用CPU的,而死循环则不会让出CPU,所以表现

wang37921的专栏 3205

while(true)循环与CPU占用率问题

转自https://blog.csdn.net/zhuyijian135757/article/details/42269329,部分删减修改,学习分享所用,如有侵权,立刻删除。 一、为什么死循环占用CPU     一个进程如果是死循环,那么占有的CPU会很,可以操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?既然即便是死循环,到时间还是会切换到别的进程,为什么占用CPU...

Leo's blog 1万+

windows 上追踪导 java 产生死循环等其他导致占用 CPU的代码的位置

接口请求之后一直 pending,后台发现控制台无任何输出,cpu 占用也有点并且迟迟下不来,于是预感到可能发生死循环了。 以下是排查步骤: 1. 确定占用 cpu的进程的 pid 2272( 任务管理器无法更细粒度地查看进程中哪些线程占用 cpu,所以还需后面步骤 ): 2. 导出 stack 文件留作备用: cmd 执行jstack -l 2272> c://2272.stack 如果出现下面情况,进入 "C:\Windows\System32" 文件夹,搜索 "c..

heshiyuan1406146854的博客 406

死循环导致apk的 cpu占用率过

(1)分析: $ busybox top $ 1 (2) 线程中如果一直while的话,cpu一直霸用不能闲置 while(true){ } (3)处理 while(true){ sleep(一会); } 附上一个CPU占用,内存泄漏的怀疑对象的参考博客: http://www.cnblogs.com/qianxudetianxia/p/3645106.html

muxi@Achilles的专栏 2225

Linux 多线程调试(内存占用死循环CPU占用……)

文章出处:http://www.cnblogs.com/cy568searchx/archive/2013/10/28/3391790.html 你的软件在某个时刻停止服务,CPU占用达到100%+,这种问题一个可能的原因是产生了死循环,假设程序某处存在潜在的死循环,并在某种条件下会引发,本文以一个示例来定位出现死循环的位置。当程序某处存在死循环...

weixin_33782386的博客 172

linux定位cpu占用率的进程,(转)如何定位死循环CPU利用率linux

最近在完成一个比较大的多线程C++离线服务程序后,发现经常会出现卡住的情况,表现为CPU利用率100%左右,一直没找到代码原因,就采用了一个笨到方法,每小时重启一次服务……这样做仍然会有好多数据进不了库,不是治本的方法,前几天决定彻底解决这个问题,搜索发现了gdb的一个强大的功能,gdb attach(如何定位死循环CPU使用率(linux) - Sonic4x),记录一下。找出线程找出CPU...

weixin_35394437的博客 181

linux内核cpu占用,如何定位死循环CPU使用率(linux)

确定是CPU使用top观察是否存在CPU使用率过现象找出线程对CPU使用率过的进程的所有线程进行排序psH-e-opid,tid,pcpu,cmd--sort=pcpu|grepxxx得到如下结果,其中线程2909使用了7.8%的CPU.290729130.0./xxx290729097.8./xxx也可以通过查看/proc中的信息来确定CPU线程.打印了4列...

weixin_42510645的博客 1305

使用sleep避免java死循环导致的CPU占用率过

sleep(long millis) 线程睡眠 millis 毫秒 使用sleep方法可以避免cpu空转,防止cpu占用率过。 public static void main(String[] args) { while (true) { // you code... try { Thread.sleep(3); } catch (InterruptedException e) { e.printS

岁月静好 1879

CPU突然被打满的原因(全方位分析)

如果应用程序涉及到大量的数据库操作,而数据库访问存在延迟,例如查询复杂度、索引缺失等情况,那么CPU可能会在等待数据库响应的过程中被空闲浪费,或者在处理大量的数据库查询结果时被占用,导致CPU利用率升。如果应用程序需要频繁地进行IO操作,例如并发的网络请求、数据库查询等,即使这些IO操作是非阻塞的,但是由于IO操作的频率较CPU可能无法及时处理所有的IO请求,从而导致CPU打满。如果应用程序中存在频繁的大内存分配和释放操作,例如大量的对象创建和销毁,会导致频繁的内存管理操作,增加CPU的负载。

码到三十五 8745

主程序运行完了,但是不想他退出,有子线程要继续运行

网上摘抄的,这是给自己看的blog 主程序运行完了,但是不想他退出,有子线程要继续运行 1. while(1) 循环,但是会占用cpu资源 http://blog.sina.com.cn/s/blog_74a459380102uwcb.html 一、一个进程如果是死循环,那么占有的CPU会很,可以操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?既然即便是死

wuweiyoung的专栏 3210

为什么空循环进程会导致CPU占有率很

linux系统是时间片调度算法,微观上所有可运行进程都是串行,不管进程中作何操作,该进程的时间片一到就切换到下一进程,那为什么一个空循环进程CPU占用率还这么

做一个有技术追求的人 1万+

操作系统笔记

需要掌握: 1、os的功能 2、os的定义 3.单道批处理系统 并发: 操作系统的功能 C语言编译过程详解 https://www.cnblogs.com/knife-king/p/11090029.html https://blog.csdn.net/qq_36192099/arti...

ao_mike的博客 3563

linux内核线程死锁或死循环(soft lockup)之后如何让系统宕机重启

在开发内核模块或驱动时,如果处理失误,导致内核线程中出现死锁或者死循环,你会发现,除了重启之外,你没有任何可以做的。这时你的输入不起任何作用,终端(不是指远程的ssh工具)只会在那重复的输出类似“BUG: soft lockup - CPU#0 stuck for 67s! [fclustertool:2043]”,更无奈的是你重启之后导致系统挂起的堆栈信息也看不到,你所能做的就是一遍遍的加调

qq_35964941的博客 4732

2007-2022年全国各地级市银行金融机构网点数据.xlsx

2007-2022年地级市金融机构网点数据1、时间:2007-2022年2、指标:行政区划代码、年份、城市名称、所属省份、银行网点数量、其中-政策性银行及国家开发银行营业网点占比、其中-商业银行营业网点数量占比、其中-农村金融机构营业网点数量占比3、范围:360个地级市4、来源:银保监5、用途:详细列出了在这15年时间范围内,各地级市的银行及其他金融机构的分支机构数量及其变化趋势。通过这些数据,可以深入了解中国金融服务的地理分布、扩张速度和市场渗透情况

上一篇: SYN 洪水攻击
下一篇: LVS集群的负载调度算法
ixidof
博客等级 码龄19年 222粉丝 2原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值