免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: chestnut king
打印 上一主题 下一主题

[C++] 各位大侠进来看看 同样程序suse和centos 占有cpu不一样 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
11 [报告]
发表于 2013-01-17 14:12 |只看该作者
shan_ghost 发表于 2013-01-17 13:55
sleep并不保证让出CPU,也可以是忙等,只是早期实现都让出CPU了,新版gcc还是内核不再这么做。前些天有过报 ...


但这样为什么 CPU 不是 100%, 而仅仅 5%?

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
12 [报告]
发表于 2013-01-17 14:17 |只看该作者
zylthinking 发表于 2013-01-17 14:12
但这样为什么 CPU 不是 100%, 而仅仅 5%?


这个就不清楚了,没深入研究过。反正是不能再用sleep代替等待信号就对了……

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
13 [报告]
发表于 2013-01-17 14:29 |只看该作者
shan_ghost 发表于 2013-01-17 14:17
这个就不清楚了,没深入研究过。反正是不能再用sleep代替等待信号就对了……


我觉得你这句话就错了, 要是 sleep 基于秒级的还用忙等, 那做出这个决定的人就应该找块豆腐一头撞死;
事实上, 据我所直, 2.4 内核就已经有这个措施, 当睡眠时间过短, 则会采用忙等形式而不是睡眠; 这个绝对不是什么新东西; 新代码中, 倒是有可能将什么是睡眠过短这个定义给改点, 但若说 sleep(1) 会忙等, 我觉得这是个无脑袋的想法

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
14 [报告]
发表于 2013-01-17 14:36 |只看该作者
zylthinking 发表于 2013-01-17 14:29
我觉得你这句话就错了, 要是 sleep 基于秒级的还用忙等, 那做出这个决定的人就应该找块豆腐一头撞死; ...


这点你是对的。

另,注意楼主用的是usleep(1)。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
15 [报告]
发表于 2013-01-17 14:37 |只看该作者
shan_ghost 发表于 2013-01-17 14:36
这点你是对的。

另,注意楼主用的是usleep(1)。


反正是不能再用sleep代替等待信号就对了

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
16 [报告]
发表于 2013-01-17 14:57 |只看该作者
本帖最后由 shan_ghost 于 2013-01-17 15:02 编辑
zylthinking 发表于 2013-01-17 14:37
反正是不能再用sleep代替等待信号就对了


查到资料了。的确是不能再用sleep/usleep系列函数代替等待信号了:

http://www.360doc.com/content/11/1201/09/1317564_168809827.shtml

大概是说,系统把定时器分组维护,越快到期的定时器组会被越频繁的扫描。

比如,如果一个组的定时器要1小时后到期,那么这个组每5分钟或更长时间关注一次就够了;而如果一个组的定时器1分钟后就可能到期,那么可能至少1分钟就得去检查一次。

linux内核把定时器按时间远近分成4个组,给它们不同的关注频率。当低优先级的一个定时器即将到期时,linux会自动把它转到高优先组里。


这样,对sleep(3600s),它可能一开始在第4组(随便写的),50分钟后被移到第3组,9分钟后到第2组,50秒后到第一组。



但,因为性能原因,linux本身能支持的最小时间粒度是有限的,也就是说,哪怕是第一组,它也难以得到1us乃至更高的精度;此时额外的精度就只能通过忙等提供了。


实现上,就是第一组的定时器到期后,相关进/线程被唤起,然后由线程内的忙等来得到更精确的定时效果。

如此一来,sleep(1)当然还会出让CPU并等待信号;但,为了得到精确的sleep(1)效果,最后常常多余出来的一点点“时间尾巴”就只能忙等。
于是,sleep(1)/usleep(1)就必须多消耗一点点CPU,这就是5%CPU占用率的由来。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
17 [报告]
发表于 2013-01-17 15:11 |只看该作者
shan_ghost 发表于 2013-01-17 14:57
查到资料了。的确是不能再用sleep/usleep系列函数代替等待信号了:

http://www.360doc.com/content/ ...


我真不知说什么了, 我看了一下, 通篇是介绍 2.4 内核的 timer 机制; 我想这个我还有点了解, 却不知你的以上的论断哪里来的;
timer 之所以如此实现, 完全是为了性能做的一个算法, 具体算法不说, 但却无法得到你所谓的 sleep(1) 不能用来等信号之类的事情的结论;

timer 到时之后, 调用的是 bottom half, 这个链表是各个驱动挂进去的, 作为一种给驱动程序一个延迟执行之类的服务; 而且是一到时间, 立刻执行, 哪里还有什么 timer 到时之后, 之后还有忙等逻辑, 你到底是没看懂了还是想用来蒙我呢

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
18 [报告]
发表于 2013-01-17 15:15 |只看该作者
本帖最后由 shan_ghost 于 2013-01-17 15:15 编辑
zylthinking 发表于 2013-01-17 15:11
我真不知说什么了, 我看了一下, 通篇是介绍 2.4 内核的 timer 机制; 我想这个我还有点了解, 却不知 ...


呵呵,这个5%左右的数据以及相关机制是之前那个报道提到过的。我当时没认真看,大致了解下就过去了。所以遇到这个问题的时候,一时就想不起了。

现在有了这个文档,有了它关于2.4内核timer实现机制之类知识一引导,那篇文章的内容自然就回想起来了。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
19 [报告]
发表于 2013-01-17 15:19 |只看该作者
记得好像是linus或者那几个人说的,也可能是偶自动综合了他们的言论:大意就是2.4的内核能提供更精确的时钟,但代价是过去依赖sleep让出控制权的程序就要多占用百分之几的CPU。但sleep本来就不是为出让CPU而设计的,不按文档使用的后果只能由使用者自己承担。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
20 [报告]
发表于 2013-01-17 15:22 |只看该作者
…………但是那篇文章死活就是找不到了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP