Chinaunix

标题: deadloop控制sleep时间,咩搞? [打印本页]

作者: lxyscls    时间: 2015-10-17 21:33
标题: deadloop控制sleep时间,咩搞?
只能deadloop,直接导致在没有数据的时候,CPU利用率畸高

当然最终的目标是希望:数据多的时候尽可能的使用CPU来处理,数据少或者没数据的时候CPU利用率降下来

暂时想到的办法是根据数据量控制sleep时间,个人感觉是某种函数的关系,但是没有思路

X:数据输入量 per/s

单个deadloop内只处理一个数据
Y:sleep时间
Z:单个数据输出处理时间,应该只能是一个平均的时间,有的时候处理得快些,有时慢些

不知道算不算是调优的范畴了,请问sleep有什么比较好的控制方案么,还有其他的解决方案么?(C实现)
作者: 0521    时间: 2015-10-19 11:59
查一个叫 yield 的函数
作者: 0521    时间: 2015-10-19 12:01
没事儿的时候主动放弃CPU,死循环会给系统拖垮的,一般来说,大多数线程不会用满cpu分给你的时间片的,大多数线程都很有礼貌的没事儿了就把cpu放弃了,只有这个线程会把cpu给你的时间片用光,cpu会不断调用你这个线程,导致cpu使用率很高。
作者: lxyscls    时间: 2015-10-19 14:24
0521 发表于 2015-10-19 12:01
没事儿的时候主动放弃CPU,死循环会给系统拖垮的,一般来说,大多数线程不会用满cpu分给你的时间片的,大多 ...


     yield之后,请问是不是靠内核调度回来呢?用户态进程,没有yield(),pthread_yield倒是有
作者: 0521    时间: 2015-10-19 15:38
是的, yield 是线程没事儿干的时候告诉操作系统,把我重新插入线程调度的等待队列。
作者: hanxin83    时间: 2015-10-19 16:13
sched_yield

不过如果cpu比较闲, 它照样很快又回来了.
仍然会100%的cpu....

所以推荐别的办法:你在能感知到"有数据了"的地方, 用个eventfd来通知你的处理线程---
作者: 0521    时间: 2015-10-19 16:20
如果是类似生产者--消费者 问题,用信号量解决
作者: lxyscls    时间: 2015-10-19 16:41
本帖最后由 lxyscls 于 2015-10-19 16:42 编辑

回复 6# hanxin83


    uio,数据的来源就只能deadloop poll

    偶然发现了这个,业界还有比linus更能喷垃圾话的大牛吗?

    http://yarchive.net/comp/linux/userspace_io.html
作者: yulihua49    时间: 2015-10-19 22:59
本帖最后由 yulihua49 于 2015-10-19 23:01 编辑
0521 发表于 2015-10-19 11:59
查一个叫 yield 的函数

这个比较复杂,需要timerfd与epoll配合,整个的一个协程系统。
还是条件变量比较简单。当然,CPU可以释放,而线程是占用的。
作者: happy_fish100    时间: 2015-10-20 18:18
用经典的生产者消费者模型呗。
条件不满足就等待好了,可以wait在条件变量上。
作者: lxyscls    时间: 2015-10-20 18:27
回复 10# happy_fish100


    其实这个流程如果拆成两个步骤:数据输入 和 数据处理 的话,确实就是生产消费了,用条件变量

    但是目前前端的数据输入,还是只能用poll的方式
作者: happy_fish100    时间: 2015-10-20 18:43
前端的数据输入poll拿到后,然后作为生产者就可以了
生产者消费者模型都会有个队列吧,生产者入队,消费者出队处理不就Ok
作者: lxyscls    时间: 2015-10-20 20:07
回复 12# happy_fish100


    嗯,是这样的,谢谢咯!
作者: cokeboL    时间: 2015-10-20 20:20
ngix那种,epollwait的时间参数是timer的列表,列表空的时候wait永久,不空就按最小时间wait,有事件来了,处理事件,处理事件过程中当然可以加定时器





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2