- 论坛徽章:
- 0
|
原帖由 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内核设计与实现》,第二版,关于这些方面,说得很清楚的。 |
|