博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
workqueue原理和分析(转)
阅读量:6209 次
发布时间:2019-06-21

本文共 1877 字,大约阅读时间需要 6 分钟。

workqueue,中文称其为工作队列,是一个用于创建内核线程的接口,通过它创建的内核线程来执行内核其他模块排列到队列里的工作,创建的内核线程被称为工作者线程。要理解工作队列的实现,重点在于理解相关的三个数据结构的含义及关系。

 
1 表示工作队列类型的数据结构:struct workqueue_struct
  1. /*
  2.  * The externally visible workqueue abstraction is an array of
  3.  * per-CPU workqueues:
  4.  */
  5. struct workqueue_struct {
  6.     struct cpu_workqueue_struct *cpu_wq;   /*工作者线程数组*/
  7.     struct list_head list; /*连接工作队列类型的链表*/
  8.     const char *name;        /*工作者线程的名称*/          
  9.     int singlethread;         /*是否创建新的工作者线程,0表示采用默认的工作者线程event/n*/
  10.     int freezeable; /* Freeze threads during suspend */
  11.     int rt;
  12. #ifdef CONFIG_LOCKDEP
  13.     struct lockdep_map lockdep_map;
  14. #endif
  15. };

内核中默认的工作队列为:

  1. static struct workqueue_struct *keventd_wq __read_mostly;

其对应的工作者线程为:event/n    其中,n代表当前cpu中processor的个数。

2. 表示工作者线程的数据结构:struct cpu_workqueue_struct

  1. /*
  2.  * The per-CPU workqueue (if single thread, we always use the first
  3.  * possible cpu).
  4.  */
  5. struct cpu_workqueue_struct {
  6.     spinlock_t lock;          /*因为工作者线程需要频繁的处理连接到其上的工作,所以需要枷锁保护*/
  7.     struct list_head worklist;
  8.     wait_queue_head_t more_work;
  9.     struct work_struct *current_work; /*当前工作线程需要处理的工作*/
  10.     struct workqueue_struct *wq;   /*该工作者线程属于那种类型的工作者队列*/
  11.     struct task_struct *thread;    /*指向工作者线程的任务结构体*/
  12. } ____cacheline_aligned;

3. 表示工作的数据结构,即工作者线程处理的对象:struct work_struct

  1. struct work_struct {
  2.     atomic_long_t data;       /*工作处理函数func的参数*/
  3. #define WORK_STRUCT_PENDING 0        /* T if work item pending execution */
  4. #define WORK_STRUCT_STATIC 1        /* static initializer (debugobjects) */
  5. #define WORK_STRUCT_FLAG_MASK (3UL)
  6. #define WORK_STRUCT_WQ_DATA_MASK (~WORK_STRUCT_FLAG_MASK)
  7.     struct list_head entry;        /*连接工作的指针*/
  8.     work_func_t func;              /*工作处理函数*/
  9. #ifdef CONFIG_LOCKDEP
  10.     struct lockdep_map lockdep_map;
  11. #endif
  12. };

再分析了以上三个对象后,重点掌握三者之间的关系。工作队列类型,工作者线程以及工作三个数据对象之间的关系如图所示。

workqueue的执行非常简单,即在每次运行工作者线程的时候,去遍历工作者线程对应的工作链表上的工作,逐一进行处理即可,从这里我们也可以猜到,工作队列是没有优先级的,基本按照FIFO的方式进行处理。

转自:http://blog.csdn.net/ustc_dylan/article/details/6371229

转载于:https://www.cnblogs.com/hoys/archive/2012/06/06/2537637.html

你可能感兴趣的文章
《Oracle AWR与ASH性能报告深入解析》-核心参数详解-手操-图文
查看>>
用大数据处理思路保护数据
查看>>
还是分了的好——看惠普、赛门铁克拆分
查看>>
yum和编译两种方式升级or降级Centos内核
查看>>
Android消息处理机制Looper和Handler详解
查看>>
C# 设置IE Cookie 从而实现自动打开需要登录的页面
查看>>
Android拓展系列(2)--Git使用
查看>>
脚踏实地,不要飘忽不定
查看>>
A Resegmentation Approach for Detecting Rectangular Objects in High-Resolution Imagery
查看>>
郁闷的时候干脆休息
查看>>
sql语句查询Oracle|sql server|access 数据库里的所有表名,字段名
查看>>
当 dynamic 遇上 internal
查看>>
webGL简单例子(klayge)
查看>>
如何在有int型主键遍历表中的某一列数据
查看>>
梯度下降法 Method of steepest descent.
查看>>
跟小静读CLR via C#(09)-扩展方法
查看>>
关于javascript中的回调函数
查看>>
多进程,多线程,就是这么回事儿
查看>>
Java之Log4j入门 [V512工作室视频]
查看>>
mass Framework class模块 v7
查看>>