【问题标题】:Sleeping in a Linux work queue在 Linux 工作队列中休眠
【发布时间】:2013-01-01 20:38:02
【问题描述】:
我只是第一次阅读有关 Linux 内核中断处理程序下半部分的内容,并试图了解工作队列在延迟工作中的使用。
据我了解,工作队列相对于 softirps 或 tasklet 的好处是工作是在进程上下文中完成的,因此它可以休眠。但默认情况下,这项工作只是在其中一个事件/X 线程上按顺序完成?因此,如果说在 events/0 上启动了一些工作,然后在等待某个 IO 时休眠了很长时间,则该处理器上不能再处理工作队列项,这对于性能来说似乎非常糟糕。
如果工作可以长时间休眠,那么所有中断处理程序开发人员是否有责任不使用默认事件/X 线程?还是我误会了什么?
【问题讨论】:
标签:
linux
kernel
scheduling
【解决方案1】:
但默认情况下,这项工作只是在事件/X 线程之一上按顺序完成?因此,如果说在 events/0 上启动了一些工作,然后在等待某个 IO 时休眠了很长时间,则该处理器上不能再处理工作队列项,这对于性能来说似乎非常糟糕。
这不准确; workqueue API 允许单线程和多线程任务。对于前者,调用函数 create_singlethread_workqueue()。
如果工作可以长时间休眠,那么所有中断处理程序开发人员是否有责任不使用默认事件/X 线程?还是我误会了什么?
在softirq(即tasklet)中,您根本无法睡觉,所以基本上,工作队列的好处是您可以睡觉..确实-开发人员的责任不是在单线程工作队列的情况下导致其他 kthreads 饿死。
还要记住,workqueue API 提供的不仅仅是任务的入队/出队,还提供队列延迟工作、工作间同步、刷新工作队列、取消延迟工作等功能。这个 API 也是一个与其他基于 softirq 的库相比具有优势,即使对于非睡眠使用也是如此。