首页 > 其他分享 >workqueue机制

workqueue机制

时间:2022-12-21 17:22:06浏览次数:43  
标签:struct 队列 work 线程 内核 workqueue 机制

软硬件协同设计是未来发展的主流,软硬件的界限越来越模糊,软硬件的设计思想是相通的,实现方法是各异的,实现的结果上当然也存在较大差别,因此,很有必要做好软硬件的协同设计。

什么是workqueue?Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程, Workqueue机制的实现Workqueue机制中定义了两个重要的数据结构,分析如下:

1、cpu_workqueue_struct结构。

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

2、work_struct结构是对任务的抽象。

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

 1 struct work_struct {
 2          unsigned long pending;
 3  
 4          struct list_head entry;
 5  
 6          void (*func)(void *);
 7  
 8          void *data;
 9  
10          void *wq_data; 
11  
12          strut timer_list timer;
13 }; 

当用户调用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。

标签:struct,队列,work,线程,内核,workqueue,机制
From: https://www.cnblogs.com/tongxiguo24/p/16996715.html

相关文章

  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCla......
  • KingbaseES V8R6 空闲事务会话超时自动终止机制
    背景如果会话在事务中停留的时间过长,则允许自动终止空闲会话。可以由配置参数idle_in_transaction_session_timeout事务处于空闲状态的时长,它有助于防止被遗忘的交易事务......
  • 【源码透视】SpringBoot的SPI机制
    一、从java类加载机制说起java中的类加载器负载加载来自文件系统、网络或者其他来源的类文件。jvm的类加载器默认使用的是双亲委派模式。三种默认的类加载器BootstrapCl......
  • .NET Core如何通过认证机制访问Kafka?
    大家好,我是Edison。最近有一个ASP.NETCore使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番,......
  • SE的事件机制--选择事件响应
    SE采用事件方式与外部程序交互,例如:根据选择的对象,自动显示属性信息等相应的处理;...  _documentEvents=(SolidEdgeFramework.ISEDocumentEvents_Event)document.Docum......
  • 前段性能----缓存机制
    缓存一词原本来源于计算机系统结构,提供“缓存”的目的是为了让数据访问的速度适应CPU的处理速度,其基于的原理是内存中“程序执行与数据访问的局域性行为”,即一定程序执行时......
  • 09 什么是注意力机制(Attention )
    ​​博客配套视频链接:https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0b站直接看​​​​配套github链接:https://github.com/nickchen121/Pre-traini......
  • 两道面试题,带你解析Java类加载机制
    通过两道面试题,带你深入学习Java类加载机制。简单易懂,深入浅出!博主个人独立站点开通啦!欢迎点击访问:​​https://shuyi.tech​​在许多Java面试中,我......
  • 事件循环机制(面试快速解题技巧)
    目录事件循环机制同步与异步微任务与宏任务(异步事件)任务执行顺序最终总结事件循环机制同步与异步我们先思考两个问题,如下:为什么会存在同步和异步的概念?我们的JavaScri......
  • 使用Tomcat基于redis的session共享机制集群部署
    常见的session集群方案:session复制和session共享Session复制:指session信息会在集群节点之间复制,每个节点服务上都会有相同的session信息;主要是实现后端多个节点的冗余功......