使用工作队列

本文介绍Linux系统中如何通过work_struct结构实现任务的延迟处理。包括使用系统默认工作队列及自定义工作队列的方法,详细解释了如何创建、初始化工作单元,并将其加入相应队列进行调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

驱动为需要延迟处理的工作建立一work_struct 结构, 该结构即为工作单元, 它还包含一函数指针用来处理具体的延迟工作;
该工作单元被添加到当前CPU 的默认工作线程或自定义工作线程的工作队列中等待处理
在某一时刻, 工作线程被唤醒, 它将循环处理工作队列中的每一个工作单元

使用系统中的默认工作队列

 

首先, 要为需要延迟处理的工作单元建立一个work_struct 结构
内核提供了下面2 个宏来方便地建立该结构:
DECLARE_WORK(name, void (*func)(void *), void *data);  //静态创建
INIT_WORK (struct work_struct *work, void (*func)(void *),void *data)   //动态初始化
将该结构放入到默认工作线程的工作队列中去, 内核提供以下2 个宏操作:
schedule_work(work);
schedule_delayed_work(work, delay)
2 个宏操作的主要区别就在于一个是立即被调度, 一个是延迟delay 个时钟周期后被调度
使用自定义工作队列
 
创建工作线程使用

           struct workqueue_struct *create_workqueue (const char *name)

其中, name 为该类型工作工作线程的名字
创建类型为myworker工作线程的代码如下:

    struct workqueue_struct *myworker;

     myworker = create_workqueue( “myworker”)

work_struct 加入到自定义工作线程的工作队列中可以采用以下接口:
int queue_work(struct workqueue_struct *wq, struct work_struct *work);
int queue_delayed_work (struct workqueue_struct *wq,struct work_struct *work,unsigned long delay)
在Linux内核编程中,软中断(Softirqs)和工作队列(Workqueues)是两种常见的异步执行机制,它们用于处理需要延迟执行的任务,但它们的使用场景和特性有所不同。 软中断: 1. 软中断是一种轻量级的上下文,用于延迟处理硬件中断服务程序中的非紧急工作。 2. 软中断在中断上下文之外执行,这意味着它们不会阻塞硬件中断。 3. 软中断是固定优先级的,并且是在中断上下文中执行的,因此它们必须非常迅速和高效。 4. 软中断适合处理时间敏感的任务,如网络数据包的接收和发送处理。 工作队列: 1. 工作队列工作推送到内核线程中执行,因此它们运行在进程上下文中。 2. 工作队列可以阻塞,适合执行那些需要睡眠、等待或需要更长执行时间的任务。 3. 工作队列提供了更多灵活性,因为它们可以被不同的内核线程处理,包括它们自己的工作队列线程。 4. 工作队列适用于不能或不应该在中断上下文中执行的耗时任务,例如磁盘I/O操作。 使用软中断和工作队列的决定因素包括: - 任务的紧急程度:需要快速执行且不会阻塞的任务应该使用软中断。 - 执行时间长度:耗时较长或者需要睡眠的任务应该使用工作队列。 - 是否需要睡眠:如果任务中需要睡眠或者等待,应该使用工作队列,因为软中断中不允许睡眠。 - 系统资源:如果系统资源紧张,应该更加谨慎地使用软中断,因为它们是在中断上下文中执行的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值