什么是workqueue

2023-12-07 22:08
文章标签 workqueue

本文主要是介绍什么是workqueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是workqueue?

Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。

workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程,

 

Workqueue机制的实现

Workqueue机制中定义了两个重要的数据结构,分析如下:

cpu_workqueue_struct结构。该结构将CPU和内核线程进行了绑定。在创建workqueue的过程中,Linux根据当前系统CPU的个数创建cpu_workqueue_struct。在该结构主要维护了一个任务队列,以及内核线程需要睡眠的等待队列,另外还维护了一个任务上下文,即task_struct。

work_struct结构是对任务的抽象。在该结构中需要维护具体的任务方法,需要处理的数据,以及任务处理的时间。该结构定义如下:

struct work_struct {

              unsigned long pending;

               struct list_head entry;                 

               void (*func)(void *);                  

               void *data;                                 

               void *wq_data;                          

               strut timer_list timer;                  

};

      

       当用户调用workqueue的初始化接口create_workqueue或者create_singlethread_workqueue对workqueue队列进行初始化时,内核就开始为用户分配一个workqueue对象,并且将其链到一个全局的workqueue队列中。然后Linux根据当前CPU的情况,为workqueue对象分配与CPU个数相同的cpu_workqueue_struct对象,每个cpu_workqueue_struct对象都会存在一条任务队列。紧接着,Linux为每个cpu_workqueue_struct对象分配一个内核thread,即内核daemon去处理每个队列中的任务。至此,用户调用初始化接口将workqueue初始化完毕,返回workqueue的指针。

 

       在初始化workqueue过程中,内核需要初始化内核线程,注册的内核线程工作比较简单,就是不断的扫描对应cpu_workqueue_struct中的任务队列,从中获取一个有效任务,然后执行该任务。所以如果任务队列为空,那么内核daemon就在cpu_workqueue_struct中的等待队列上睡眠,直到有人唤醒daemon去处理任务队列。

 

       Workqueue初始化完毕之后,将任务运行的上下文环境构建起来了,但是具体还没有可执行的任务,所以,需要定义具体的work_struct对象。然后将work_struct加入到任务队列中,Linux会唤醒daemon去处理任务。

 

       上述描述的workqueue内核实现原理可以描述如下:


    在Workqueue机制中,提供了一个系统默认的workqueue队列——keventd_wq,这个队列是Linux系统在初始化的时候就创建的。用户可以直接初始化一个work_struct对象,然后在该队列中进行调度,使用更加方便。

 

 

 

Workqueue编程接口

序号

接口函数

说明

1

create_workqueue

用于创建一个workqueue队列,为系统中的每个CPU都创建一个内核线程。输入参数:

@name:workqueue的名称

2

create_singlethread_workqueue

用于创建workqueue,只创建一个内核线程。输入参数:

@name:workqueue名称

3

destroy_workqueue

释放workqueue队列。输入参数:

@ workqueue_struct:需要释放的workqueue队列指针

4

schedule_work

调度执行一个具体的任务,执行的任务将会被挂入Linux系统提供的workqueue——keventd_wq输入参数:

@ work_struct:具体任务对象指针

5

schedule_delayed_work

延迟一定时间去执行一个具体的任务,功能与schedule_work类似,多了一个延迟时间,输入参数:

@work_struct:具体任务对象指针

@delay:延迟时间

6

queue_work

调度执行一个指定workqueue中的任务。输入参数:

@ workqueue_struct:指定的workqueue指针

@work_struct:具体任务对象指针

7

queue_delayed_work

延迟调度执行一个指定workqueue中的任务,功能与queue_work类似,输入参数多了一个delay。

这篇关于什么是workqueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467518

相关文章

微服务:Rabbitmq的WorkQueue模型的使用、默认消费方式(消息队列中间件)

文章目录 WorkQueue模型控制预取消息个数 WorkQueue模型 当然,一个队列,可以由多个消费者去监听。 来实现一下. 生产者: @Testpublic void testWorkQueue() throws InterruptedException {// 队列名称String queueName = "simple.queue";// 消息Stri

8250驱动使用workqueue加入RS485控制逻辑

项目中使用了RS485,主控是PX30 查看资料,有些前辈的帖子写了用了tasklet 中断服务来做,无法休眠, 于是使用了workqueue来进行延迟检测操作,主要是为了检查是否数据发送完毕,数据发送完后就拉低IO口。 在结构体中新增定义:   diff --git a/kernel/include/linux/serial_8250.h b/kernel/include/linux/s

SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue)

文章目录 1. 前言2. 思路3. 消息发送4. 消息接收4.1 能者多劳 总结 1. 前言 上一篇文章,实现了用 SpringBoot实现RabbitMQ的简单队列, 篇文章 操作 用SpringBoot实现RabbitMQ的WorkQueue(SpringAMQP 实现WorkQueue) Work queues,也被称为(Task queues),任务模型。

【RabbitMQ】WorkQueue

📝个人主页:五敷有你        🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。 此时就可以使用work 模型,多个消费者共同处

[linux][异常检测] hung task, soft lockup, hard lockup, workqueue stall

hung task,soft lockup,hard lockup,workqueue stall 是 linux 内核中的异常检测机制,这 4 个检测均是通过时间维度上的检测来判断异常。 在时间维度上的检测机制,有两个核心的点: (1)一个表示被检测对象最新状态的变量 这个变量可以用时间戳表示,也可以是一个计数器。 (2)一个定时器 这个定时器内部做检测工作,检测的依据就是状态变量

hung task, soft lockup, hard lockup, workqueue stall

hung task,soft lockup,hard lockup,workqueue stall 是 linux 内核中的异常检测机制,这 4 个检测均是通过时间维度上的检测来判断异常。 在时间维度上的检测机制,有两个核心的点: (1)一个表示被检测对象最新状态的变量 这个变量可以用时间戳表示,也可以是一个计数器。 (2)一个定时器 这个定时器内部做检测工作,检测的依据就是状态变量

linux 工作队列(workqueue)——非常详细易懂

http://blog.csdn.net/liuxd3000/article/details/7700247 在处理内核相关工作中, 我们经常看到工作队列(workqueue)的身影. 本文描述何为 linux workqueue.本文基于 2.6.32 的内核, 此时的工作队列还不是 cmwq. 为什么使用 workqueue? 在内核代码中, 经常希望延缓部分工作到将来某个时间执行,

[RK3568 Android11] 教程之Workqueue工作队列

目录 一、什么是workqueue(工作队列) 二、工作队列的定义 三、代码例子

linux 中断之工作队列workqueue (自己创建的工作队列,减小默认线程负担)

默认工作队列和自己创建工作队列对比介绍 1、上一节我们用的是schedule_work(&btn_work);  和 schedule_delayed_work(&btn_dwork, 5*HZ);调度任务 这两个调度函数都是把任务交个内核默认线程(event)管理执行,一旦向内核默认线程提交的任务太多,将导致内核默认线程负担太重,影响实时性 2、这一节我们使用的是queue_work(btn

郭健: currency Managed Workqueue(CMWQ)概述

一、前言 一种新的机制出现的原因往往是为了解决实际的问题,虽然linux kernel中已经提供了workqueue的机制,那么为何还要引入cmwq呢?也就是说:旧的workqueue机制存在什么样的问题?在新的cmwq又是如何解决这些问题的呢?它接口是如何呈现的呢(驱动工程师最关心这个了)?如何兼容旧的驱动呢?本文希望可以解开这些谜题。 本文的代码来自linux kernel 4.0。 二、为