背景
Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器,Contex-A53,双核
- 使用工具:Source Insight 3.5, Visio
1. 概述
Workqueue
工作队列是利用内核线程来异步执行工作任务的通用机制;Workqueue
工作队列可以用作中断处理的Bottom-half
机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而Softirq
和Tasklet
在处理任务时不能睡眠;
来一张概述图:
- 在中断处理过程中,或者其他子系统中,调用
workqueue
的调度或入队接口后,通过建立好的链接关系图逐级找到合适的worker
,最终完成工作任务的执行;
2. 数据结构
2.1 总览
此处应有图:
- 先看看关键的数据结构:
work_struct
:工作队列调度的最小单位,work item
;workqueue_struct
:工作队列,work item
都挂入到工作队列中;worker
:work item
的处理者,每个worker
对应一个内核线程;worker_pool
:worker
池(内核线程池),是一个共享资源池,提供不同的worker
来对work item
进行处理;pool_workqueue
:充当桥梁纽带的作用,用于连接workqueue
和worker_pool
,建立链接关系;
下边看看细节吧:
2.2 work
struct work_struct
用来描述work
,初始化一个work
并添加到工作队列后,将会将其传递到合适的内核线程来进行处理,它是用于调度的最小单位。
关键字段描述如下:
struct work_struct { atomic_long_t data; //低比特存放状态位,高比特存放worker_pool的ID或者pool_workqueue的指针 struct list_head entry; //用于添加到其他队列上 work_func_t func; //工作任务的处理函数,在内核线程中回调#ifdef CONFIG_LOCKDEP struct lockdep_map lockdep_map;
没有评论:
发表评论