学习 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) |
自定义的work queue | 创建 | struct workqueue_struct *create_workqueue(name) struct workqueue_struct *create_singlethread_workqueue(name) |
销毁 | void destroy_workqueue( struct workqueue_struct * ); |