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) );})
    
posted @ 2023-03-19 16:46  人民广场的二道贩子  阅读(11)  评论(0编辑  收藏  举报