睡在Linux工作队列中

时间:2013-01-01 20:38:02

标签: linux kernel scheduling

我刚刚第一次阅读Linux内核中断处理程序的下半部分,并试图理解使用工作队列进行延迟工作。

据我所知,工作队列优于softirps或tasklet的好处是工作在进程上下文中完成,因此它可以睡​​眠。但默认情况下,这项工作只是在其中一个事件/ X线程上按顺序完成的?因此,如果说某些工作是在events / 0上启动的,然后在某些IO上等待很长时间,那么就不会再在该处理器上处理任何工作队列项,这对性能来说似乎非常糟糕。

如果工作可以长时间休眠,那么所有中断处理程序开发人员都有责任不使用默认事件/ X线程吗?或者我误解了什么?

1 个答案:

答案 0 :(得分:0)

  

但是默认情况下,这项工作是在其中一个事件/ X线程上按顺序完成的?因此,如果说某些工作是在events / 0上启动的,然后在某些IO上等待很长时间,那么就不会再在该处理器上处理任何工作队列项,这对性能来说似乎非常糟糕。

这不准确; workqueue API允许单线程和多线程任务。对于前者,调用函数create_singlethread_workqueue()。

  

如果工作可以长时间休眠,那么所有中断处理程序开发人员都有责任不使用默认事件/ X线程吗?或者我误解了什么?

在softirq(即tasklet)中你根本无法睡觉,所以基本上,工作队伍的好处是你可以睡觉......的确 - 这是开发人员的责任而不是在单线程工作队列的情况下导致其他kthreads饿死。

另外请记住,workqueue API不仅提供排队/出队任务,还提供排队延迟工作,工作间同步,冲洗工作队列,取消延迟工作等功能。此API也是一个优于其他基于softirq的库,即使是不可睡眠的用途。