免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7536 | 回复: 17
打印 上一主题 下一主题

[函数] redhat 6 sleep怎么cpu占用高那么多? [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-08 14:16 |只看该作者 |倒序浏览
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>

void * Thread(void *lpvoid)
{
        while (1)
        {
                usleep(1000);
        }
        return lpvoid;
}

int main()
{
        for (int i =0; i<50; i++)
        {
                pthread_t tid;
                int eno = pthread_create (&tid, NULL, Thread, NULL);
                if (eno)
                {
                        printf("pthread_create err eno =%d\n",eno);
                        return 0;
                }
        }

        Thread(NULL);
        return 0;
}



这个代码在5.4系统上运行cpu 0

在6.1上运行就直接 10%

6系列redhat 内核改了啥,sleep占用高了那么多?




#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/timeb.h>


void wsleep(unsigned int MinSecond)
{
        timeval t_timeval;
        t_timeval.tv_sec  = MinSecond / 1000;
        t_timeval.tv_usec = MinSecond % 1000 * 1000 ;
        select( 0, NULL, NULL, NULL, &t_timeval );
}

void * Thread(void *lpvoid)
{
        while (1)
        {
                wsleep(1);
        }
        return lpvoid;
}

int main()
{
        for (int i =0; i<50; i++)
        {
                pthread_t tid;
                int eno = pthread_create (&tid, NULL, Thread, NULL);
                if (eno)
                {
                        printf("pthread_create err eno =%d\n",eno);
                        return 0;
                }
        }

        Thread(NULL);
        return 0;
}


换select也是一样都占用高

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
2 [报告]
发表于 2013-06-09 09:16 |只看该作者
!没人能解答么

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-06-09 13:41 |只看该作者
本帖最后由 csumck 于 2013-06-09 13:47 编辑

http://stackoverflow.com/questio ... leep-on-cent-os-6-3
樓主看這個帖子,可能會有些幫助。
我看了這個帖子後的理解是: 以前usleep實際作用出來的效果最小單位實際是1ms,所以在舊內核裏你usleep(1000)和usleep(1200)效果是一樣的。現在posix標準已經不推薦用usleep(),具體可以查看man手冊,而是推薦用nanosleep(),這是一個精確度高的多的sleep。在新內核裏,usleep()實際上會變成nanosleep(),通過strace就可以看到,由於顆粒小了非常多,cpu的消耗也變得大很多了,這樣才能更加準確。 所以這個帖子裏1樓推薦了一個解決辦法,就是用條件變量來代替定時輪詢。 不過他沒說啥叫條件變量,我覺着他的思路就是用系統中斷或者信號的手段來進行定時,比如用新內核提供的定時器這種。
不一定對哈,只是大概看了後的理解,第一次瞭解到這種東西。

又找到篇文章  http://www.tldp.org/HOWTO/IO-Port-Programming-4.html
這裏面說nanosleep在soft real time scheduling的進程裏是已busy waiting實現的(難道不會把進程掛起?),基本上就是死循環吧,cpu佔用高是肯定的了。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
4 [报告]
发表于 2013-06-09 15:36 |只看该作者
回复 3# csumck


    条件变量应该是指pthread中的条件变量,我想。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-06-09 17:08 |只看该作者
回复 4# zhaohongjian000


    具體怎麼用,用這個怎麼做定時?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
6 [报告]
发表于 2013-06-09 17:28 |只看该作者
回复 5# csumck


    他的意思应该是,不要轮询,改用通知的机制。原帖问题的代码是每隔一定时间去看task list中有没有东西,完全可以改成向其中插入东西之后用条件变量唤醒。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-06-09 18:59 |只看该作者
回复 6# zhaohongjian000


    有道理,應該是的

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2013-06-12 23:16 |只看该作者
usleep(1000);还不如usleep(0);

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
9 [报告]
发表于 2013-06-14 09:42 |只看该作者
egmkang 发表于 2013-06-12 23:16
usleep(1000);还不如usleep(0);


愿闻其详

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
10 [报告]
发表于 2013-06-14 12:22 |只看该作者
w_anthony 发表于 2013-06-14 09:42
愿闻其详


usleep(0)是放弃时间片
usleep(1000)是想1ms后唤醒,操作系统调度没有这么精确的,搞不好会忙等
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP