【问题标题】: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 的库相比具有优势,即使对于非睡眠使用也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 2015-09-13
      • 2011-10-12
      相关资源
      最近更新 更多