我刚刚第一次阅读Linux内核中断处理程序的下半部分,并试图理解使用工作队列进行延迟工作。
据我所知,工作队列优于softirps或tasklet的好处是工作在进程上下文中完成,因此它可以睡眠。但默认情况下,这项工作只是在其中一个事件/ X线程上按顺序完成的?因此,如果说某些工作是在events / 0上启动的,然后在某些IO上等待很长时间,那么就不会再在该处理器上处理任何工作队列项,这对性能来说似乎非常糟糕。
如果工作可以长时间休眠,那么所有中断处理程序开发人员都有责任不使用默认事件/ X线程吗?或者我误解了什么?
答案 0 :(得分:0)
但是默认情况下,这项工作是在其中一个事件/ X线程上按顺序完成的?因此,如果说某些工作是在events / 0上启动的,然后在某些IO上等待很长时间,那么就不会再在该处理器上处理任何工作队列项,这对性能来说似乎非常糟糕。
这不准确; workqueue API允许单线程和多线程任务。对于前者,调用函数create_singlethread_workqueue()。
如果工作可以长时间休眠,那么所有中断处理程序开发人员都有责任不使用默认事件/ X线程吗?或者我误解了什么?
在softirq(即tasklet)中你根本无法睡觉,所以基本上,工作队伍的好处是你可以睡觉......的确 - 这是开发人员的责任而不是在单线程工作队列的情况下导致其他kthreads饿死。
另外请记住,workqueue API不仅提供排队/出队任务,还提供排队延迟工作,工作间同步,冲洗工作队列,取消延迟工作等功能。此API也是一个优于其他基于softirq的库,即使是不可睡眠的用途。