学习 linux 的工作队列机制
入职后导师给的第二篇文章,让学习驱动的编写和工作队列,可能主要是想培养一下阅读源码和分析能力吧,做一个驱动的入门。
在公司和学校都习惯用 onenote,但是这个东西带不走的,因此希望在博客上记录一点。
在学习别人的文章时,demo 那部分的代码可以看懂,但是很多东西别人记录和自己记录的逻辑和行文完全不一样,尤其时 demo 中做的几个实验,看得很乱,因此还是想自己走一遍,形成自己的笔记。
本文主要学习内容来源:工作队列
学习任务:
- 区分工作队列的几个函数(几个函数非常乱,搞不懂相互之间的关系)。
- 自己看源码来了解 pool、workqueue、work、worker 之间的逻辑关系,产出他们的关系图,还有源码的执行逻辑。
- 根据 上面 的理解来对照 文章 中的结论,看看是否理解正确。
罗列并区分工作队列的几个函数
| 自带的工作队列 | 自定义的工作队列 | ||
| work(work struct) 工作本身 | 创建 |
DECLARE_WORK(work,work_fn);静态的,编入ko,会增加ko的大小,因为会加载到内存里 INIT_WORK(work,work_fn);动态的,运行时再加载入内存 |
|
| 调度 | schedule_work(struct work_struct *work) schedule_work_on(int cpu, struct work_struct *work)可以指定哪个CPU去做 |
int queue_work( struct workqueue_struct *wq, struct work_struct *work ); 可以指定哪个CPU去做 |
|
| 取消 | cancel_work(struct work_struct *work); cancel_work_sync(struct work_struct *work);// 等待执行完毕再取消 |
||
| 强制执行 | flush_work(struct work_struct *work);// 强制执行某个任务 flush_scheduled_work() // 特指强制执行 整个system_wq的任务 |
flush_workqueue(struct workqueue_struct *_wq) | |
| 自定义的workqueue | 创建 | struct workqueue_struct *create_workqueue(name) struct workqueue_struct *create_singlethread_workqueue(name) |
| 销毁 | void destroy_workqueue( struct workqueue_struct * ); |
系统自带的工作队列创建流程
重新看了下文章的内容,发现讲得也蛮详细的,但是我作为初学者还是有很多疑问:
1、events队列和后面的events_highpri都是在一个链表中的嘛,代码中好像没有这样写,但是博主是这样表述的。
2、内核自带的工作队列有很多个,每个都在CPU中创建两个work_pool嘛?那是否太冗余了?每个工作队列都是为什么而存在的?
3、内核创建的流程,是怎么从一点一点把workqueue创建起来的?
4、如何回答文章最后的问题:经过上面分析发现,无论是自己创建的工作队列还是系统自带的工作队列,最后都是交给一个worker_pool来处理,那么他们之间到底有什么本质区别呢?希望读者能告诉我。

浙公网安备 33010602011771号