Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2033059
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类:

2009-10-23 23:20:07

在看LWN上的Linux内核周报的时候,发现又有人开始了工作队列(workqueue)的,试图统一现在Linux内核里面诸多的和工作队列实现。

这个工作队列实现引入了一个比较有意思的概念:工作队列默认只有一个线程(单CPU)用于处理工作队列里面的工作,当且仅当这个线程发生阻塞后,工作队列才新建一个线程来处理工作队列里面的其他工作。

这个概念和以前Linux内核社区讨论过的概念有些相同,都是尽量避免非必要的线程创建和调度的开销。实际上,因为局部性原理,操作系统的cache使得很多可能会阻塞的操作在实际的情形下很少发生阻塞,但就是为了这些很小的阻塞可能性,我们很多时候不得不引入更多的overhead。

工作队列的抽象在Apple新近发布的并行库中也得到了采用,并用它使得CPU数量对程序员透明,简化了编程模型。这个模型可以进一步演化成模型,采用Actor模型的编程语言将工作队列中的工作称为“进程”,当然这个“进程”并不是通常意义上的进程。不过这也从另外一个方面说明:工作队列在某种程度上就等同于运行队列,里面的工作就像“进程”一样需要调度,否则就会发生资源分配不均的问题。

所以,工作队列中的任务要保持尽量短小,尤其是不要有死循环,这样工作队列只要采用FIFO策略就能有很好的性能;对于可期待的阻塞,如socket读,写等,要通过select类操作在工作队列外实现,不要让他们阻塞线程执行。

工作在多CPU系统上的调度仍然是个问题,等我再研读些相关代码和文章再总结。
阅读(2120) | 评论(3) | 转发(0) |
0

上一篇:出离愤怒

下一篇:用prctl给线程命名

给主人留下些什么吧!~~

xiaosuo2009-11-26 10:09:24

今天看LWN上的过期周报发现,有人已经开始了将这个思想导出到用户空间的工作:http://lwn.net/Articles/362357/

xiaosuo2009-10-31 12:37:55

这个对于文件操作等不能poll的操作意义比较大,对于网络转发来说epoll应该就已经足够了。

icymoon2009-10-31 03:53:34

这方面对网络收发报文/转发报文有多少性能上的影响呢? 对于某些新机器,是否能利用NUMA特性对网络性能影响更大些? :-)