前几篇文章提到在定时器中断里用工作队列来处理中断下半部分,但当时不明白其中的原理,今天终于发现了一些内容,现跟大家一起来分享。
工作队列可以把工作推后,交由一个内核线程去执行——该工作总会在进程上下文执行。通过工作队列执行的代码能占尽进程上下文的所有优势。最重要的就是工作队列可以重新调度甚至睡眠。
如果需要获得大量的内存时,在你需要获取信号量时,在你需要执行阻塞式的i/o操作是,它都会非常有用。
工作队列子系统是一个用于创建内核线程的接口,通过它创建的进程负责执行由内核其他部分排到队列里的任务(现在更明白工作队列处理下半部分的机制了吧,好下面继续分析)。它创建的内核线程被称为工作者线程(worker threads)。工作队列可以让你的驱动程序创建一个专门的工作者线程来处理需要推后的工作。
不过工作队列子系统提供了一个缺省的工作者线程来处理这些工作。因此,工作队列的表现形式就转变成了一个把需要推后执行的任务交给特定的通用线程这样以一种接口。
现在思路应该更清晰了,呵呵。如果你的任务是处理器密集型和性能要求严格那组后创建自己的工作者线程,这样做有助于减轻缺省线程的负担,避免工作中其他需要完成的工作处于饥饿状态。
所有的工作者线程都是用普通的内核线程实现的,他们都要执行worker_thread()函数。在它初始化完以后,这个函数执行一个死循环并开始休眠。当有操作被插入到队列里的时候线程就会被唤醒,以便执行这些操作,当没有剩余的操作时,它又会继续休眠。
工作队列实现下半部的过程大概就是这样了。
我上面写的内容很多参考linux内核设计与实现这本书,在这里面有详细的阐述,网上有很多地方可以下,如果不想在其他地方找的话,在我这你留下邮箱我发给你,压缩后10M多一点。
谢谢你的阅读!
阅读(1646) | 评论(0) | 转发(2) |