转载:中断处理的tasklet(小任务)机制和workqueue(工作队列)机制

https://www.cnblogs.com/bcfx/articles/2915249.html

workqueue内核原理 

软中断等比较细致全面:

                                      Linux内核机制总结中断异常和系统调用之中断下半部(三十二)

扒开 Linux 中断的底裤之 workqueue-蒲公英云

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

Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼? - 维科号

总结:

1、tasklet与workqueue处理时中断都支持开启状态;tasklet中不能进行睡眠,workqueue可以。同一个任务tasklet只能在待执行任务中存在一份多次增加是无效的;同一个任务workqueue中可以存在多份(可以在workqueue中前一个work未执行到时继续向workqueue中增加相同的work),但是内核机制并不能保证work的执行顺序与加入顺序一致,有特殊需要的应用需要在执行函数种做专门针对性的处理。

2、workqueue的创建:系统workqueue与用户自己创建的workqueue都是通过alloc_workqueue创建的

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

  • system_wq:如果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

内核代码:

 用自己可以通过下面几个宏创建自己的workqueue,(create_singlethread_workqueue创建的是不绑定CPU的workqueue)。

 3、初始化work,系统提供的如下一些宏可以将work与处理函数绑定。

带DELAYED的是触发后延时处理的。带ONESTACK的是work结构体是栈局部变量的时候(work在函数中定义)使用影响内核的debug告警机制。

4、将work加入到workqueue:queue_work(workqueue, work) 。

因为系统创建的system_wq经常被使用系统封装了一个schedule_work(work)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值