在Linux工作队列中休眠



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

据我所知,工作队列相对于软线程或微线程的好处是工作是在进程上下文中完成的,因此它可以休眠。但是默认情况下,这项工作只是在events/X线程中的一个上顺序完成的。因此,如果在events/0上启动了一些工作,然后在等待一些IO时休眠了很长时间,那么该处理器上无法处理更多的工作队列项,这对性能来说似乎非常糟糕。

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

但是默认情况下,这项工作只是在一个事件/X线程上顺序完成?因此,如果在events/0上启动了一些工作,然后在等待一些IO时休眠了很长时间,那么该处理器上无法处理更多的工作队列项,这对性能来说似乎非常糟糕。

这是不准确的;工作队列API既支持单线程任务,也支持多线程任务。对于前者,调用create_singlethread_workqueue()函数。

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

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

还要记住,工作队列API提供的不仅仅是任务的排队/脱队列,还提供了对延迟工作进行排队、工作之间同步、刷新工作队列、取消延迟工作等功能。与其他基于软件的库相比,这个API也是一个优势,即使对于非休眠的使用也是如此。

最新更新