在看LWN上的Linux内核周报的时候,发现又有人开始了工作队列(workqueue)的,试图统一现在Linux内核里面诸多的和工作队列实现。
这个工作队列实现引入了一个比较有意思的概念:工作队列默认只有一个线程(单CPU)用于处理工作队列里面的工作,当且仅当这个线程发生阻塞后,工作队列才新建一个线程来处理工作队列里面的其他工作。
这个概念和以前Linux内核社区讨论过的概念有些相同,都是尽量避免非必要的线程创建和调度的开销。实际上,因为局部性原理,操作系统的cache使得很多可能会阻塞的操作在实际的情形下很少发生阻塞,但就是为了这些很小的阻塞可能性,我们很多时候不得不引入更多的overhead。
工作队列的抽象在Apple新近发布的并行库中也得到了采用,并用它使得CPU数量对程序员透明,简化了编程模型。这个模型可以进一步演化成模型,采用Actor模型的编程语言将工作队列中的工作称为“进程”,当然这个“进程”并不是通常意义上的进程。不过这也从另外一个方面说明:工作队列在某种程度上就等同于运行队列,里面的工作就像“进程”一样需要调度,否则就会发生资源分配不均的问题。
所以,工作队列中的任务要保持尽量短小,尤其是不要有死循环,这样工作队列只要采用FIFO策略就能有很好的性能;对于可期待的阻塞,如socket读,写等,要通过select类操作在工作队列外实现,不要让他们阻塞线程执行。
工作在多CPU系统上的调度仍然是个问题,等我再研读些相关代码和文章再总结。
阅读(2120) | 评论(3) | 转发(0) |