【发布时间】:2013-06-13 09:59:46
【问题描述】:
我正在开发已在用户空间实现的设备驱动程序(HDMI、HDCP)。
现在,我正在用户空间中寻找类似于 linux-workqueue 的功能。
我想要什么:
a.) 在工作队列上捆绑不同的工作/功能并运行它。
b.) 能够在您关闭驱动程序或重置驱动程序状态机时刷新工作队列。
c.) 添加工作项的延迟执行。
d.) 取消当前工作项等。
我熟悉 Linux 内核工作队列和工作结构(虽然不是专家),因此我很好奇我们如何在用户空间级别模拟类似的机制?
也许,我可以通过使用 Pthread API 将它与一些全局队列混合来编写这种库。
有什么想法/建议吗?
【问题讨论】:
-
您是否有理由只需要创建一个线程来序列化您的工作?内核内部资源更加有限,创建许多内核线程的成本很高。但在用户空间资源更丰富。当需要新任务时,您应该可以创建一个新线程。如果您需要延迟,请在线程处理程序中使用睡眠函数之一(即 usleep()、nano_sleep() 等)
-
No.. 没有特别的理由只创建“一个线程”。我们可以创建许多用户线程..但是如果我们每次都通过 pthread_create_* 和 pthread_exit_ API 来处理我们需要处理它们的任何琐碎(或非琐碎)的中断/事件,这不是矫枉过正吗?在我的理解中,提前创建一个线程(或线程池)并将工作绑定到这些线程是相当容易的,而且会更快。
-
我还没有完成研究,所以我不确定创建 pthread 需要多少开销,我也不确定这些开销是否真的会给您的应用程序带来负担.不过我很好奇,您谈论的中断只能在内核空间中完成。那么你有处理这个的内核模块吗?
-
是的,我们有一个内核模块,它有一个典型的中断处理程序例程。虽然,它只是将这些中断作为事件报告给上游并返回。不鼓励这种设备驱动程序设计,但这是最起码的我现在很担心,因为我正在不断地举办活动! :)
-
好吧,我认为如果你想坚持留在用户空间,你会陷入使用 Pthread、Pthread 互斥锁或可能的 futexes 以及自定义队列数据结构重新设计自己的 API 的困境。在我看来,这些都已内置在内核中,您应该将该代码移植到内核中。
标签: linux-kernel pthreads