转自:http://blog.chinaunix.net/uid-20382483-id-4077101.html
tasklet |
Workqueue |
处于atomic context,不能sleep |
不处于atomic context,可以sleep |
处于中断上下文,OS不可以进行进程调度 |
处于进程上下文,OS可以进行进程调度 |
运行调度它们的同一个CPU上 |
默认同一个CPU上 |
不能指定确定时间进行调度 |
不能指定确定时间进行调度或者指定至少延时一个确定时间后调度 |
只能交给ksoftirqd/0 |
可以提交给events/0,也可以提交给自定义的workqueue |
Tasklet函数带参数 |
Work函数不带参数 |
Tasklet与workqueue的不同应用环境总结如下:
- [极少量任务]:必须立即进行紧急处理的极少量任务放入在中断的顶半部中,此时屏蔽了与自己同类型的中断,由于任务量少,所以可以迅速不受打扰地处理完紧急任务。
- [中等数量任务]:需要较少时间的中等数量的急迫任务放在tasklet底半部中。此时不会屏蔽任何中断(包括与自己的顶半部同类型的中断),所以不影响顶半部对紧急事务的处理;同时又不会进行用户进程调度,从而保证了自己急迫任务得以迅速完成。
- [大量任务]:需要较多时间且并不急迫(允许被操作系统剥夺运行权)的大量任务放在workqueue中。此时操作系统会尽量快速处理完这个任务,但如果任务量太大,期间操作系统也会有机会调度别的用户进程运行,从而保证不会因为这个任务需要运行时间将其它用户进程无法进行。
- 可能引起睡眠的任务放在workqueue中,因为在workqueue中睡眠是安全的。