我可以设置工作队列的优先级吗?

Posted

技术标签:

【中文标题】我可以设置工作队列的优先级吗?【英文标题】:Can I set up the priority of a workqueue? 【发布时间】:2013-03-14 16:34:36 【问题描述】:

我正在修改 SPI 内核模块“spidev”,以便它可以更快地与我的硬件通信。 外部硬件是一个带有非常小的缓冲区的 CAN 控制器,所以我必须快速读取任何传入的数据以避免丢失数据。 我已经配置了一个 GPIO 中断来通知我新数据,但我无法在中断处理程序中读取 SPI 硬件。 我的中断处理程序基本上设置了一个将读取 SPI 数据的工作队列。 当内核中只有一个活动进程时,它可以正常工作。 一旦我同时打开任何其他进程(甚至是进程查看器顶部),我就会开始丢失成串的数据,即,我可能会毫无问题地收到 1000 个数据包,然后连续丢失 15 个数据包,依此类推. 我怀疑我的问题的原因是当另一个进程(在本例中为顶部)控制 CPU 时,中断处理程序运行,但工作队列中的工作直到再次调用调度程序才开始。 我试图提高我的进程的优先级,但没有成功。

我想知道是否有办法告诉内核在中断处理函数之后立即执行工作队列中的工作。 欢迎提出建议。

【问题讨论】:

那么,为什么你不能从 ISR 中隐藏输入数据呢? lkml.indiana.edu/hypermail/linux/kernel/0510.2/1027.html 看来你需要RT操作系统,检查RT Linux。 【参考方案1】:

作为替代方案,您可以考虑使用 tasklet,它会告诉内核更立即执行,但请注意您无法在 tasklet 中休眠

一篇关于在内核中延迟工作的好 ibm 文章

http://www.ibm.com/developerworks/linux/library/l-tasklets/

http://www.makelinux.net/ldd3/chp-7-sect-5

只要 CPU 忙于运行进程,tasklet 就会在下一个计时器滴答时运行,但当 CPU 空闲时它会立即运行。内核提供了一组 ksoftirqd 内核线程,每个 CPU 一个,只是为了运行“软中断”处理程序,例如 tasklet_action 函数。因此,tasklet 的最后三个运行发生在与 CPU 0 关联的 ksoftirqd 内核线程的上下文中。jitasklethi 实现使用高优先级的 tasklet,在即将发布的函数列表中进行了解释。

【讨论】:

以上是关于我可以设置工作队列的优先级吗?的主要内容,如果未能解决你的问题,请参考以下文章

springboot 中使用 RabbitMQ 配置使用优先级队列

Uva 1153 Keep the Customer Satisfied (贪心+优先队列)

工作队列可以被中断吗

具有比较器的优先级队列未按预期工作

索引优先队列的工作原理与简易实现

AMQP Golang优先级不工作