workqueue
workqueue就是用来异步执行逻辑的内核组件。异步执行是很常见的需求,workqueue组件为异步执行抽象出三个概念: · work:指需要异步执行的任务 · woker:处理work的异步执行上下文,就是一个内核线程 · workqueue:work的链表,异步执行需求者产生work,将work加入到workqueue。worker从workqueue中获得需要执行的work列表进行执行
使用workqueue的一般流程如下:
- 调用alloc_workqueue()创建workqueue,或者直接使用系统已经创建好workqueue
- 创建work(struct work_struct),并使用INIT_WORK进行初始化
- 调用queue_work_on函数将work放入workqueue
要区别作为整个组件的名字的workqueue和作为workqueue组件中的工作队列的workqueue队列。workqueue被创建出来描述了队列的属性,不同属性的队列需要匹配不同的worker来实际的执行。
worker pool
worker被组织为线程池,线程池中的每个线程都是一个worker,没有work需要执行的时候线程池的线程数量大部份情况为0,有work需要执行的时候才会动态的创建worker线程来执行。这种worker线程池叫做worker pool。worker线程的数量由worker pool控制,对于使用者是无感知的。
系统中不止存在一个worker pool,每个worker pool都有一个优先级和运行的CPU列表两个属性,属性结构体定义如下: