news 2026/4/16 13:55:40

Linux kernel wait queue和completion的区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux kernel wait queue和completion的区别

一、基本概念

1. 等待队列(Wait Queue)

定义:等待队列是内核通用的进程阻塞/唤醒机制,用于让进程等待某个任意条件(如资源可用、信号到达、事件触发)。

核心结构

struct wait_queue_head_t { spinlock_t lock; // 保护队列的自旋锁 struct list_head head; // 等待进程的链表头 }; struct wait_queue_entry { struct task_struct *task; // 等待的进程 struct list_head entry; // 链表节点 // 可选的回调函数(如poll) };

关键操作

  • 初始化:init_waitqueue_head(wait_queue_head_t *q)

  • 添加等待进程:add_wait_queue(q, entry)(将进程加入队列)

  • 设置进程状态:set_current_state(TASK_UNINTERRUPTIBLE/TASK_INTERRUPTIBLE)(标记为阻塞)

  • 调度:schedule()(主动让出CPU)

  • 唤醒:wake_up(q)(唤醒队列中所有符合条件的进程)、wake_up_interruptible(q)(仅唤醒可中断进程)

特点:灵活支持复杂条件判断(如循环检查变量状态),适用于生产者-消费者、多条件等待等场景。

2. 完成量(Completion)

定义:完成量是基于等待队列的简化封装,专门用于等待单一事件完成(如“操作已结束”“任务已完成”)。

核心结构

struct completion { unsigned int done; // 事件完成计数(0表示未完成) wait_queue_head_t wait; // 底层等待队列(继承自wait queue) };

关键操作

  • 初始化:init_completion(struct completion *x)done=0)或DECLARE_COMPLETION(name)(静态初始化)

  • 等待事件:wait_for_completion(struct completion *x)(阻塞直到done≠0

  • 唤醒事件:complete(struct completion *x)done++,唤醒1个等待进程)、complete_all(struct completion *x)done=UINT_MAX,唤醒所有等待进程)

特点:接口极简,仅需“初始化-等待-唤醒”三步,适用于单次事件同步(如线程间通知“任务完成”)。

二、核心区别

维度

等待队列(Wait Queue)

完成量(Completion)

抽象层次

底层通用机制

高层封装(基于wait queue)

用途

等待任意复杂条件(如缓冲区非空、信号到达)

等待单一事件完成(如“操作已结束”)

接口复杂度

需手动管理队列、进程状态、唤醒逻辑

提供init/complete/wait简单接口

唤醒粒度

支持唤醒单个(wake_up_nr)或所有(wake_up)进程

支持唤醒1个(complete)或所有(complete_all)进程

状态管理

需显式设置进程状态(如TASK_UNINTERRUPTIBLE

内部自动处理状态(默认用TASK_UNINTERRUPTIBLE

重复使用

可重复添加/删除进程,队列长期有效

完成后需init_completion重置才能再次使用

错误处理

可通过wake_up_interruptible响应信号(返回错误码)

wait_for_completion被信号中断时返回-ERESTARTSYS

三、适用场景举例

1. 用完成量(Completion)的场景
  • 单次事件通知:如“DMA传输完成”“编码线程处理完一帧”。

    例:视频采集线程采集到一帧后,用complete()通知编码线程,编码线程用wait_for_completion()等待。

    struct completion frame_done; init_completion(&frame_done); // 采集线程 capture_frame(); complete(&frame_done); // 通知编码线程“帧已就绪” // 编码线程 wait_for_completion(&frame_done); // 等待帧就绪 encode_frame();
  • 简单线程同步:如主线程等待子线程初始化完成。

2. 用等待队列(Wait Queue)的场景
  • 复杂条件等待:如“缓冲区有数据且未溢出”(生产者-消费者模型)。

    例:流媒体传输线程等待“发送缓冲区有数据”,采集线程填充数据后唤醒队列。

    wait_queue_head_t send_wait; init_waitqueue_head(&send_wait); char send_buf[1024]; int buf_len = 0; // 传输线程(消费者) while (1) { wait_event(send_wait, buf_len > 0); // 等待缓冲区有数据 send_data(send_buf, buf_len); buf_len = 0; } // 采集线程(生产者) buf_len = capture_to_buf(send_buf); if (buf_len > 0) wake_up(&send_wait); // 唤醒传输线程
  • 多条件等待:如同时等待“网络就绪”和“设备初始化完成”。

四、总结

  • 完成量简化的事件同步工具,适合“等待某事发生”的单次场景,代码简洁、开销小。

  • 等待队列通用的条件等待工具,适合“等待复杂条件满足”的场景,灵活性高但需手动管理。

流媒体开发中:

  • 若只需通知“某操作完成”(如编码结束),优先用完成量

  • 若需等待“多条件组合”(如缓冲区数据+网络带宽足够),则用等待队列

两者均基于内核同步原语,理解其差异能帮助于更高效地解决流媒体 pipeline 中的同步问题(如采集-编码-显示的时序协调)。

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

前端响应式设计进阶:从移动优先到自适应

前端响应式设计进阶:从移动优先到自适应 一、引言:别再把响应式设计当适配 "响应式设计不就是多写几个媒体查询吗?"——我相信这是很多前端开发者常说的话。 但事实是: 好的响应式设计可以提升移动用户体验50%以上响应式…

作者头像 李华
网站建设 2026/4/16 13:53:35

智能体开发必备:九个神仙Skill仓库,从此告别重复造轮子

什么是 AI 智能体 ( Agent ) 技能?为什么你需要一个技能库? 图片 什么是智能体技能? 简单来说,技能就是一个包含 SKILL.md 文件的文件夹。 这个文件里包含了指令、代码示例和上下文信息,能教会你的 AI 智能体 ( Agen…

作者头像 李华
网站建设 2026/4/16 13:52:42

学术福利!AI专著生成工具深度测评,开启专著写作新体验

学术专著的主要价值在于其内容的严谨性和逻辑的完整性,然而这正是许多作者在写作过程中最难跨越的障碍。与专注单一课题的期刊论文不同,专著需要建立一个涵盖引言、理论基础、主要研究、应用扩展和结论的全面框架。各章节之间必须层层递进、环环相扣&…

作者头像 李华
网站建设 2026/4/16 13:52:41

GSE宏编辑器:魔兽世界玩家的终极操作优化指南

GSE宏编辑器:魔兽世界玩家的终极操作优化指南 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. 项目地址: https://gitcode.com/gh_mirrors/gs/GSE-Advanced-Macro-Compiler …

作者头像 李华
网站建设 2026/4/16 13:48:19

终极指南:如何用res-downloader轻松下载微信视频号和各大平台资源

终极指南:如何用res-downloader轻松下载微信视频号和各大平台资源 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

作者头像 李华
网站建设 2026/4/16 13:48:12

AI故事创作应用深度拆解(SITS2026官方技术白皮书首次公开)

第一章:AI故事创作应用深度拆解(SITS2026官方技术白皮书首次公开) 2026奇点智能技术大会(https://ml-summit.org) 核心架构演进路径 SITS2026白皮书首次披露了AI故事创作系统的三层协同架构:语义意图解析层、动态叙事图谱层与多…

作者头像 李华