1

我只是第一次阅读有关 Linux 内核中断处理程序下半部分的信息,并试图了解工作队列在延迟工作中的使用。

据我了解,工作队列相对于 softirps 或 tasklet 的好处是工作是在进程上下文中完成的,因此它可以休眠。但默认情况下,这项工作只是在其中一个事件/X 线程上按顺序完成?因此,如果说一些工作在 events/0 上开始,然后在等待一些 IO 时休眠很长时间,则该处理器上不能再处理工作队列项,这对于性能来说似乎非常糟糕。

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

4

1 回答 1

0

但默认情况下,这项工作只是在其中一个事件/X 线程上按顺序完成?因此,如果说一些工作在 events/0 上开始,然后在等待一些 IO 时休眠很长时间,则该处理器上不能再处理工作队列项,这对于性能来说似乎非常糟糕。

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

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

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

还要记住,workqueue API 提供的不仅仅是任务的入队/出队,还提供排队延迟工作、工作之间同步、刷新工作队列、取消延迟工作等功能。这个 API 也比其他 API 更有优势基于 softirq 的库,即使是不可睡眠的使用。

于 2013-01-02T21:24:43.580 回答