linux内核研究-6-work queue

linux内核研究-6-work queue

1,work queue 与软中断和tasklet的关系
1》work queue是内核线程来执行的,软中断和tasklet是qsoftirqd内核线程来执行的。
2》work queue能休眠,软中断和tasklet不能。


2,work queue工作原理和过程
1》内核有一个默认的工作者线程(worker thread),event(n),n代表CPU。
2》每个工作者线程有一个工作结构体链表。
3》链表的节点结构体成员有个函数指针,和函数参数。来执行下半部任务。
4》工作者线程检查这个链表,发现有节点,就执行这个节点的函数指针。
5》执行完毕后,将这个节点移除链表。
6》如果链表为空,工作者线程休眠。

3,如何在驱动中使用work queue
1》一般使用内核默认的工作者线程(evnet),也可以自己创建一个(rill):
struct workqueue_struct *rill_wq;
rill_wq = creat_workqueue("rill");

2》创建工作结构体(链表的一个节点)
静态:
DECLARE_WORK(name,void(*func)(void*),void*data);

动态:
INIT_WORK(struct work_struct *work,void(*func)(void*),void*data);

3》实现处理函数
在驱动里实现func函数。

4》调度工作队列
schedule_work(&rill_wq);
5》刷新
flush_workqueue(&rill_wq);

你可能感兴趣的:(thread,工作,struct,任务,linux内核)