带你走进linux内核中断子系统—workqueue

本文详细介绍了Linux内核中断子系统中的工作队列(workqueue)机制,包括工作队列的数据结构,如work、workqueue、worker、worker_pool等,以及流程分析,如初始化、工作调度和worker动态管理。此外,还讨论了worker线程的创建和状态机变换。工作队列是用于异步执行任务,特别是处理中断处理中耗时任务的重要机制。
摘要由CSDN通过智能技术生成

1 概述

  • Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制;
  • Workqueue工作队列可以用作中断处理的Bottom-half机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而SoftirqTasklet在处理任务时不能睡眠;

来一张概述图:

  • 在中断处理过程中,或者其他子系统中,调用workqueue的调度或入队接口后,通过建立好的链接关系图逐级找到合适的worker,最终完成工作任务的执行;

2 数据结构

2.1 总览

先看看关键的数据结构:

  • work_struct:工作队列调度的最小单位,work item
  • workqueue_struct:工作队列,work item都挂入到工作队列中;
  • workerwork item的处理者,每个worker对应一个内核线程;
  • worker_poolworker池(内核线程池),是一个共享资源池,提供不同的worker来对work item进行处理;
  • pool_workqueue:充当桥梁纽带的作用,用于连接workqueueworker_pool,建立链接关系;
【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份 价值699的内核资料包(含视频教程、电子书、实战项目及代码)

内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议

2.2 work

struct work_struct用来描述work,初始化一个work并添加到工作队列后,将会将其传递到合适的内核线程来进行处理,它是用于调度的最小单位。

关键字段描述如下:

struct work_struct {
	atomic_long_t data;     //低比特存放状态位,高比特存放worker_pool的ID或者pool_workqueue的指针
	struct list_head entry; //用于添加到其他队列上
	work_func_t func;       //工作任务的处理函数,在内核线程中回调
#ifdef CONFIG_LOCKDEP
	struct lockdep_map lockdep_map;
#endif
};

图片说明下data字段:

2.3 workqueue

内核中工作队列分为两种:

  • bound:绑定处理器的工作队列,每个worker创建的内核线程绑定到特定的CPU上运行;
  • unbound:不绑定处理器的工作队列,创建的时候需要指定WQ_UNBOUND标志,内核线程可以在处理器间迁移;

内核默认创建了一些工作队列(用户也可以创建):

  • system_mq:如果work item执行时间较短,使用本队列,调用schedule[_delayed]_work[_on]()接口就是添加到本队列中;
  • system_highpri_mq:高优先级工作队列,以nice值 -20 来运行;
  • system_long_wq:如果work item执行时间较长,使用本队列;
  • system_unbound_wq:该工作队列的内核线程不绑定到特定的处理器上;
  • system_freezable_wq:该工作队列用于在Suspend时可冻结的work item
  • system_power_efficient_wq:该工作队列用于节能目的而选择牺牲性能的work item
  • system_freezable_power_efficient_wq:该工作队列用于节能或Suspend时可冻结目的的work item

struct workqueue_struct关键字段介绍如下:

struct workqueue_struct {
	struct list_head	pwqs;		/* WR: all pwqs of this wq */   //所有的pool_workqueue都添加到本链表中
	struct list_head	list;		/* PR: list of all workqueues */    //用于将工作队列添加到全局链表workqueues中
 
	struct list_head	maydays;	/* MD: pwqs requesting rescu
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值