INIT_WORK 和 DECLARE_WORK

Linux内核工作队列workqueue详解 linux 内核 workqueue详解 阅读详情
AI摘要

本文详细介绍了Linux内核中的INIT_WORK和DECLARE_WORK宏,分别用于初始化和声明工作结构,以及它们的语法和用法,通过示例代码展示了两者之间的区别和应用场景。,

INIT_WORK 和 DECLARE_WORK 是 Linux 内核中用于初始化和声明工作结构的两个宏。它们都与工作队列(workqueue)相关,用于定义要在工作队列中执行的工作函数。

INIT_WORK 宏:

作用:INIT_WORK 宏用于初始化一个工作结构(struct work_struct),将工作函数和相关参数绑定到工作结构中。
语法:INIT_WORK(struct work_struct *work, void (*func)(struct work_struct *work))
参数:
work:指向要初始化的工作结构体的指针。
func:指向要执行的工作函数的指针,通常是 void work_function(struct work_struct *work) 类型的函数。


DECLARE_WORK 宏:

作用:DECLARE_WORK 宏用于声明一个工作结构,但并不对其进行初始化,通常用于在代码中声明工作结构,而不立即初始化。
语法:DECLARE_WORK(workname, void (*func)(struct work_struct *work))
参数:
workname:工作结构的名称。
func:指向要执行的工作函数的指针,通常是 void work_function(struct work_struct *work) 类型的函数。


区别和用法:

INIT_WORK 用于初始化工作结构,通常在代码中初始化工作结构并绑定工作函数时使用。
DECLARE_WORK 用于声明工作结构,通常在代码中声明工作结构的变量,但不进行初始化,初始化工作结构时需要额外调用 INIT_WORK。

示例代码:
#include <linux/workqueue.h>

DECLARE_WORK(my_work); // 声明一个名为 my_work 的工作结构

static void my_work_function(struct work_struct *work) {
    // 工作函数的具体实现
}

static int __init my_init(void) {
    INIT_WORK(&my_work, my_work_function); // 初始化工作结构并绑定工作函数
    // 其他初始化操作
    return 0;
}
在示例代码中,DECLARE_WORK(my_work) 声明了一个名为 my_work 的工作结构,而在 my_init 函数中使用 INIT_WORK(&my_work, my_work_function) 对工作结构进行初始化,并绑定了工作函数 my_work_function。

Linux内核工作队列机制详解:INIT_WORK原理与异步任务处理实践 在操作系统内核开发中,中断处理函数的执行时间直接影响系统实时性。为解决中断上下文无法执行耗时操作的问题,Linux内核引入了工作队列(Workqueue)这一异步任务处理机制。其核心原理基于生产者-消费者模型,通过将任务提交到专门的内核线程上下文执行,实现了中断处理与复杂业务逻辑的解耦。该机制的技术价值在于允许开发者在进程上下文中安全调用可能引起睡眠的函数(如内存分配、互斥锁操作),从而提升系统稳定性与响应能力。在嵌入式系统、网络驱动、存储设备等场景中,工作队列成为处理数据包解析、硬件状态更新等异步任务的标 阅读详情

相关推荐

queue_work 简介

queue_work 是 Linux 内核中 workqueue 机制的一个关键函数,用于将工作(work)提交到工作队列(workqueue)中异步执行。

六六哥的博客 1176

INIT_WORK()工作队列使用

#define INIT_WORK(_work, _func)\ do {\ __INIT_WORK((_work), (_func), 0);\ } while (0) #define __INIT_WORK(_work, _func, _onstack)\ do {\ __init_work((_work), _onstack);\ (_work)->data = (atomic_long_t) WORK_DATA_I...

乐于分享 1万+

手把手教你学pcie--msix中断机制内核函数(五):INIT_WORK

或类似接口提交到工作队列后,内核会将该任务加入队列,并由工作队列中的内核线程负责调度和执行。和工作队列的调用机制,开发者可以更好地设计异步任务调度逻辑,确保任务能够在合适的时机被执行。在 Linux 内核中,通过。

MHD0815的博客 197

INIT_WORK的理解

#define INIT_WORK(_work, _func, _data) \ do { \ INIT_LIST_HEAD(&amp;(_work)-&gt;entry); \ (_work)-&gt;pending = 0; \ PREPARE_WORK((_work), (_func), (_data)); \ init_timer(&amp;(_work)-&gt;timer); \ }...

abcdefg的专栏 1万+

手把手教你学PCIE--Linux 内核工作队列机制(五):INIT_WORK 详细介绍

INIT_WORK是 Linux 内核中用于初始化一个工作任务()的宏。它将一个具体的任务单元绑定到一个回调函数上,以便稍后通过工作队列机制调度执行。以下是对INIT_WORK的详细解析,包括其功能、参数、使用场景以及注意事项。1. 宏原型c深色版本作用初始化一个结构体,并将其与一个回调函数关联起来。这个宏通常在驱动程序或内核模块的初始化阶段使用,用于准备异步任务的执行。2. 参数详解2.1.类型: 指向的指针。作用: 表示一个具体的工作任务。说明。

MHD0815的博客 338

RK3399平台入门到精通系列讲解(实验篇)共享工作队列的使用

工作队列是实现中断下半部分的机制之一,是一种用于管理任务的数据结构或机制。它通常用于多线程,多进程或分布式系统中,用于协调和分配待处理的任务给可用的工作线程或工作进程。

内核笔记 1252

linux INIT_WORK 创建工作队列

Linux 2.6内核使用了不少工作队列来处理任务,他在使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。 工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处理;另外一种是创建自己的工作队列并添加工作。 (一)利用系统共享的工作队列添加工作: Ø ...

qinjie的博客 918

CANoe信号传输故障排查指南

本文提供了全面的CANoe信号传输故障排查指南,涵盖从硬件连接、通道配置到软件脚本与数据库加载的全链路诊断。针对常见的通道指示灯不亮、信号无法发送及ECU握手失败等问题,给出了基于CANoe工具和CAPL脚本的详细排查步骤与解决方案,帮助工程师系统化定位并解决实车测试中的通信故障。

ice55的博客 258

work queue分析

TBD

Flynn's Blog 314

基于多智能体架构的AI自动化渗透测试平台PentAGI部署与实战

自动化渗透测试是网络安全领域提升效率、应对复杂威胁的关键技术。其核心原理在于通过程序化脚本或智能系统模拟攻击者行为,对目标系统进行安全评估。该技术能显著降低人工重复劳动,实现7x24小时持续监控与测试,其价值在于将安全专家从繁琐的扫描、信息收集中解放出来,专注于高级威胁分析与策略制定。在实际应用中,自动化渗透测试广泛应用于企业安全自评估、红蓝对抗演练及DevSecOps流程。本文聚焦于一个名为PentAGI的先进平台,它采用多智能体(Multi-Agent)系统架构,集成了知识图谱和向量数据库,实现了从侦察

weixin_30294295的博客 608

多层感知机 Multilayer Perceptron | MLP

本文主要简单介绍了多层感知机的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型的参数等。

JasonH2021的博客 3万+

kthread_worker_fn work kthread

源码目录:kernel/kthread.c kthread_worker_fn是kernel的kthread函数,用来处理kthread_worker,由kernel提供。 kthread_worker_fn一直处理work_list,可以用kthread_stop()来停止它,当queue是空的时候,这个函数休眠。 这个函数可以做为threadfn,做为kthread_create或kthread_run参数,但是需要提供一个初始化的kthread_worker的参数。 涉及到的api如下: D

tengfeidx的博客 809

如何把Excel的数据导入python?

Python数据分析——excl导入数据的简单方法(xlrd) 本文的初衷是发现网上很多Excel导入Python都没有结合具体Excel文档进行讲解,所以这篇文档将会呈现一个简单快速的Excel+Python的入门方法。 开发环境 Prerequisites: 在开始用Python导入Excel之前,要配置好自己的开发环境,最好有IDE(terminal也可)+安装相应的数据分析包。 IDE :pycharm,vscode,etc 数据分析包:matplotlib,xlrd,numpy,etc 导入数

qq_40783513的博客 7万+

linux 退后根目录,linux下半部与退后执行的工作

表。当一个工作者线程被唤醒时,它会执行它的链表上的所有工作。当工作完毕时,他会将相应的work_struct对象从链表中移去。7.4.2 使用工作队列(1)创建推后的工作首先要做的是实际创建一些需要推后执行的工作。可以通过DECLARE_WORK在编译时静态的创建该结构体:DECLARE_WORK(name, void (*func) (void *), void *data);这样就会静态的创建...

weixin_39673051的博客 93

Lumerical INTERCONNECT 中的自相位调制 (SPM) 仿真实践指南

本文详细介绍了在Lumerical INTERCONNECT中进行自相位调制(SPM)仿真的实践指南。从SPM的基础物理原理出发,深入解析非线性薛定谔方程和克尔效应,到INTERCONNECT中NLSE波导元件的配置技巧,以及时域与频域中SPM效应的观测方法。文章还提供了常见问题排查和进阶联合仿真技巧,帮助用户高效完成从仿真到实测的校准过程。

weixin_42565652的博客 187

【毕设保姆级指南】基于YOLOv8的DAGM 2007工业缺陷检测系统从搭建到落地

本教程基于YOLOv8算法实现DAGM 2007工业缺陷检测系统,包含数据处理、模型训练和可视化界面开发全流程。首先对DAGM数据集进行格式转换和划分,然后通过YOLOv8训练工业缺陷检测模型,最终构建PyQt5交互界面实现缺陷可视化检测。该系统可用于智能制造中的产品质量控制,帮助快速定位工业产品缺陷,提升检测效率和准确性,为工业质检提供高效解决方案。

LXY_LOVE36的博客 182

中断处理的工作队列机制

工作队列(work queue)是另外一种将工作推后执行的形式 ,它和我们前面讨论的所有其他形式都有不同。工作队列可以把工作推后,交由一个内核线程去执行,也就是说,这个下半部分可以在进程上下文中执行。这样,通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列允许被重新调度甚至是睡眠。 那么,什么情况下使用工作队列,什么情况下使用tasklet。如果推后执行的任务需要睡眠,那么就选择工作队列。如果推后执行的任务不需要睡眠,那么就选择tasklet。另外,如果需要用一个可以重新调度的实体来执行

Cui_pc的博客 638

Freeswitch DTMF 按键无法接收问题修复

freeswitch 在接收到 update后,会更新成新的 payload type,但是给的200响应,仍然是旧的,这时候就会导致手机侧认识需要发送旧的payload,所以发到 fs 后就会导致直接丢包,不去处理RTP包了。呼叫时需要设置通道变量 rtp_manual_rtp_bugs=ACCEPT_ANY_PAYLOAD ,这时候FS 就不会对包的payload进行判断,直接判定通过。应该修复 freeswitch 给响应时,应该根据收到的 payload 发送给手机,但是一直未找到正确的路径。

2301_81507069的博客 373

struct workqueue_struct

工作队列是, 表面上看, 类似于 taskets; 它们允许内核代码来请求在将来某个时间调用一个函数. 但是, 有几个显著的不同在这 2 个之间, 包括: tasklet 在软件中断上下文中运行的结果是所有的 tasklet 代码必须是原子的. 相反, 工作队列函数在一个特殊内核进程上下文运行; 结果, 它们有更多的灵活性. 特别地, 工作队列函数能够睡眠. tasklet 常常在它们最初被提交的处理器上运行. 工作队列以相同地方式工作, 缺省地. 内核代码可以请求工作队列函数被延

wangxu696200的博客 579

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux中下半部的工作队列简介及其简单使用

Linux中下半部的工作队列简介及其简单使用1、简介2、使用流程1、定义并初始化2、调度工作队列3、参考事例如下 1、简介 工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。因此如果你要推后的工作可以睡眠那么就可以选择工作队列,否则的话就只能选择软中断或 tasklet。 Linux 内核使用 work_struct 结构体表示一个工作,在内核中的路径 include\linux\workq

一只青木呀 596

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

DECLARE_WORK

1.  static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); 2.   brcmf_sdio_register(); 3.  sdio_register_driver(&brcmf_sdmmc_driver); 4.  static struct sdio_driver brcmf_sdmmc_driver = {

本博客仅供免费阅读,不提供咨询服务。请勿私信。 2224

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

工作队列-schedule_delayed_work()用法

原文地址:schedule_delayed_work()用法作者:Valley   第一篇 工作队列       在Linux内核中,对下半部(或者说推后执行的工作)的处理方式有好几种,包括BH(bottom       half),软中断,Tasklets和工作队列等等。在2.6内核中,大名鼎鼎的BH处理被废除,新增了更方便的工作队列。工作队列的方便之处在于它把 工作推后,交由一个内核线程

lqxandroid2012的专栏 1万+
上一篇: 线程同步互斥锁
下一篇: queue_work
~我爱中国~
博客等级 码龄16年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值