2.2. 异步任务执行:workqueue与taskwork

Posted broler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.2. 异步任务执行:workqueue与taskwork相关的知识,希望对你有一定的参考价值。

workqueue

workqueue就是用来异步执行逻辑的内核组件。异步执行是很常见的需求,workqueue组件为异步执行抽象出三个概念: · work:指需要异步执行的任务 · woker:处理work的异步执行上下文,就是一个内核线程 · workqueue:work的链表,异步执行需求者产生work,将work加入到workqueue。worker从workqueue中获得需要执行的work列表进行执行
使用workqueue的一般流程如下:

  1. 调用alloc_workqueue()创建workqueue,或者直接使用系统已经创建好workqueue
  2. 创建work(struct work_struct),并使用INIT_WORK进行初始化
  3. 调用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列表两个属性,属性结构体定义如下:

以上是关于2.2. 异步任务执行:workqueue与taskwork的主要内容,如果未能解决你的问题,请参考以下文章

RT-Thread workqueue 详解

原创Linux中断子系统-Workqueue

爬虫第四章 单线程+多任务异步协程

Linux内核模块编程可以使用的内核组件

Linux中断管理 workqueue工作队列

使用CompletableFuture.runAsync()来完成异步任务