学习 linux 的工作队列机制

myriel / 2023-07-29 / 原文

入职后导师给的第二篇文章,让学习驱动的编写和工作队列,可能主要是想培养一下阅读源码和分析能力吧,做一个驱动的入门。

在公司和学校都习惯用 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 );
int queue_work_on( int cpu, 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 * );