12 workqueue
编程指南
- 构造workqueue
- 将workqueue放入队列,开始调度
1 工作机制
内核线程(while(1))中对去判定是否存在workqueue;如果不存在择休眠;
如果存在workqueue则等待wake up事件唤醒workqueue,然后执行workqueue中的fun
1.1 内核线程的创建
每一个CPU将会创建两个worker_pool;一个普通优先级,一个高优先级
每个worker_pool下创建一个内核线程
引用百问网的图片
workqueue在内核线程中并不是固定捆绑在某个内核线程中的。它会随着系统动态变化的
2 常用API和数据结构
2.1 work_struct
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
2.2 INIT_WORK
初始化work_struct
#define INIT_WORK(_work, _func)
2.3 schedule_work
将workqueue放入队列,并唤醒内核线程对齐进行调度
3 相关知识点
-
container_of
通过member的地址(ptr),退到出type的首地址
#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})