news 2026/6/15 15:27:51

内核中延迟的工作delayed_work

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内核中延迟的工作delayed_work

对于周期性的任务,除了定时器以外,在Linux内核中还可以利用一套封装得很好的快捷机制,其本质是利用工作队列和定时器实现,这套快捷机制就是delayed_work.
schedule_delayed_work的作用为在指定延时后将任务,放到工作队列执行。

  • 具体而言当指定的delay到来时,delayed_work结构体中的work成员work_func_t类型成员func(​)会被执行。
  • 如果要周期性地执行任务,通常会在delayed_work的工作函数中再次调用schedule_delayed_work(​)​,周而复始。work_func_t类型成员func(​)为schedule_delayed_work本身。
/** * schedule_delayed_work - put work task in global workqueue after delay * @dwork: delayed_work 结构体,表示要执行的延时工作 * @delay: 延时时间(单位:jiffies) * - delay > 0 : 延时指定时间后执行 * - delay == 0: 不延时,立即投递到 workqueue(异步执行) * 注意: * - 实际执行发生在 kworker 线程中,而不是当前上下文 * - work 运行在进程上下文,可以睡眠 * - 如果该 delayed_work 已经处于 pending 状态,则不会重复入队 * * 返回值: * - true : 本次成功将 delayed_work 加入队列 * - false : delayed_work 已经在队列中,未再次调度 */staticinlineboolschedule_delayed_work(structdelayed_work*dwork,unsignedlongdelay){/* * system_wq 是内核提供的全局默认 workqueue, * 由内核统一管理,适用于大多数普通延时任务。 * * queue_delayed_work() 会: * 1. 设置并启动 dwork->timer * 2. 在 timer 到期后,将 dwork->work 投递到 system_wq */returnqueue_delayed_work(system_wq,dwork,delay);}

其中,delay参数的单位是jiffies,使用时一般用毫秒位单位,如下用法:
schedule_delayed_work(&work, msecs_to_jiffies(poll_interval));
msecs_to_jiffies(​)用于将毫秒转化为jiffies。

delayed_work的结构体定义,以及包含的work_func_t类型定义如下:

/** * struct delayed_work - workqueue item with delay * * delayed_work 通过 timer 实现延时,到期后将 work * 投递到指定的 workqueue 中,由 kworker 线程执行。 * * 常用于:按键消抖、延时重试、周期性状态检测等场景。 */structdelayed_work{/* * 实际执行的 workqueue 工作项 * * - 包含最终被 kworker 线程调用的回调函数 * - 运行在进程上下文中,可以睡眠 * - timer 到期后会将该 work 投递到 workqueue */structwork_structwork;/* * 内核定时器,用于实现延时机制 * * - 不执行真正的业务逻辑 * - 仅在超时后负责将 work 放入 workqueue * - 定时器回调运行在软中断上下文 */structtimer_listtimer;/* * 目标 workqueue * * - 指定 work 最终由哪个 workqueue 执行 * - schedule_delayed_work() 默认使用 system_wq * - queue_delayed_work() / queue_delayed_work_on() * 会显式指定该字段 */structworkqueue_struct*wq;/* * 目标 CPU 编号 * * - 指定该 delayed_work 绑定到哪个 CPU 上执行 * - 通常由 queue_delayed_work_on() 设置 * - 未绑定时为 WORK_CPU_UNBOUND */intcpu;/* * Android Kernel ABI 预留字段 * * - 用于保持内核 ABI 兼容性 * - 未来 Android 内核可能在此处扩展成员 * - 驱动中禁止访问或依赖这些字段 */ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);};structwork_struct{atomic_long_tdata;structlist_headentry;work_func_tfunc;#ifdefCONFIG_LOCKDEPstructlockdep_maplockdep_map;#endifANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);};

取消delay_work的函数

int cancel_delayed_work(struct delayed_work *work); int cancel_delayed_work_sync(struct delayed_work *work);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 15:00:37

scanner在汽车焊装线的质量追溯应用:完整示例

扫码器如何成为焊装线的“质量侦探”?一个真实案例讲透工业追溯在汽车工厂里,每天有成百上千台车身骨架沿着焊装主线缓缓前行。机械臂挥舞间火花四溅,数百个焊点在一分钟内精准完成。但你有没有想过:如果半年后某辆车出现异响&…

作者头像 李华
网站建设 2026/6/14 19:07:44

47、深入解析Active Directory安全、备份与恢复

深入解析Active Directory安全、备份与恢复 1. Active Directory的部分恢复与权威恢复 在Active Directory管理中,除了恢复整个数据库,还可以使用 ntdsutil 实用工具中的 restore subtree 命令来恢复特定子树。这在意外删除孤立材料时非常有用,能精准恢复特定信息。 …

作者头像 李华
网站建设 2026/6/15 13:50:21

串口通信入门必看:零基础快速理解基本原理

串口通信从零到实战:工程师必须掌握的底层“语言”你有没有遇到过这样的场景?调试一块新开发的电路板,烧录完程序后却毫无反应。于是你打开串口助手,接上杜邦线,突然屏幕上开始刷出熟悉的Hello World!或者一堆十六进制…

作者头像 李华
网站建设 2026/6/14 15:07:09

49、组策略的规划、实施与管理

组策略的规划、实施与管理 1. 管理模板与组策略对象(GPO) 在配置组策略时,可修改的各种选项在管理模板文件中指定。若有需要,系统管理员可以创建自定义的管理模板文件,包含更多配置选项。当修改GPO时,添加新管理模板的操作步骤如下: - 步骤1:在组策略对象编辑器中,…

作者头像 李华
网站建设 2026/6/15 12:54:48

56、网络与系统管理综合指南

网络与系统管理综合指南 1. 活动目录与相关操作 1.1 活动目录对象操作 在活动目录中,对象的定位可通过特定方法实现,具体可参考 126 - 128 页内容。若要移动对象,可参考 128 - 129 页。 1.2 远程协助功能 “Offer Remote Assistance feature”可用于发起远程协助会话,…

作者头像 李华
网站建设 2026/6/15 12:54:11

LangFlow中的情感分析模块:自动识别文本情绪倾向

LangFlow中的情感分析模块:自动识别文本情绪倾向 在智能客服对话中,一条用户评论“这耳机音质真棒!”背后藏着怎样的商业价值?如果系统能瞬间判断出这是正面情绪,并将其归入满意度统计,甚至触发自动回访机制…

作者头像 李华