免费注册 查看新帖 |

Chinaunix

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

请版主及各路大牛们指点,关于工作队列的理解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-07 18:33 |只看该作者 |倒序浏览
INIT_WORK(struct work_struct *work, void (*function)(void *), void *data); 函数将初始化一个工作队列任务,然后调用int queue_work(struct workqueue_struct *queue, struct work_struct *work);添加到工作队列中,我看过的驱动中都是只初始化一个工作队列任务,个人猜想驱动中应该可以初始化多个工作队列任务,是不是这样呢?
还有工作队列是一个内核线程,那么工作队列中的工作队列任务的运行时机是不是每次内核调度运行到这个工作队列这里,这个工作队列里的工作队列任务才得以运行,那么系统负荷越大,这个工作队列得以运行的机会越少是吗?如果这个工作队列有多个工作队列任务,那么又是怎么运行其中的每个任务的呢?
请大侠们指点,找了好多资料,也没弄明白。谢谢。
yy12345 该用户已被删除
2 [报告]
发表于 2006-12-07 22:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2006-12-08 09:07 |只看该作者
能不能就我的问题解释一下,拜托。

论坛徽章:
0
4 [报告]
发表于 2006-12-08 09:25 |只看该作者
原帖由 luanjian 于 2006-12-7 18:33 发表
INIT_WORK(struct work_struct *work, void (*function)(void *), void *data); 函数将初始化一个工作队列任务,然后调用int queue_work(struct workqueue_struct *queue, struct work_struct *work);添加到工作队 ...


1、工作队列,是交任务推后,交给一个专门的内核线程去执行,叫做worker thread(工作者线程)。工作队列提供了一个默认的工作者线程来处理,叫做events/n,n是处理器编号,所以,一般用不着创建,而是使用默认的工作队列:
可以使用DECLEAR_WORK静态创建或INIT_WORK 动态创建一个工作。工作由struct work_struct 描述,它的func指针对应处理函数。
创建完成后,可以调用schedule_work把工作交给events,或者是schedule_delayed_work延迟交付。
——所以,大多数情况下,它给人的感觉就只有一个线程在处理,也就是向内核接口提交了一个工作。

但是,默认的工作队列不一定就能满足需求,所以,内核也允许创建多个工作队列和对应的工作者线程。也就是my_events/n,调用:
create_workqueue()
当然自己创建的就不能调用schedule_work了,它是交给默认的events/n的,这个时候,得使用queue_work或queue_delayed_work来提交。

2、关于调度的问题,我想,只需要明白一点,就是“工作队列的内核线程,它是在进程上下文中执行的”,既然是进程上下文,那么,它就有可能睡觉去了,也有可能被唤醒,以重新调度,所以,这方面的问题,我想你应该参考内核的进程调度方面的知识了。也就是2楼回的贴!

其实这些不用查很多资料的吧?一本《Linux内核设计与实现》,第二版,关于这些方面,说得很清楚的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP