异步IO的演化记录
I/O模型从最初的blocking IO发展到现在的异步IO,其间蕴藏着人们对性能和效率的不懈追求,其间的进展见http://en.wikipedia.org/wiki/Asynchronous_I/O
1. 最初的IO就是等待,调用一次read,直到数据可用才返回,然后继续下面的处理:这种方法在等待的时候CPU只能休息太浪费了
2. 后来发展成poll/select方式,不必block了,CPU可以干点其他事情,只要隔一会检查一下就好了:这种方法下CPU就不用死等了,可以干点其他事情
3. 后来poll/select可以针对多个请求同时进行了,也就是可以建立一个对所有轮询请求进行轮询的请求,这样可以同时监控很多调用,这种情况下,CPU检查减少了检查的次数,提高了利用率
4. 后来发展成完成之后可以掉callback或者发signal,那么不用poll/select了,内核数据准备好之后就掉callback或者send signal就行
5. 后来发展成内核将数据拷贝到用户空间之后再通知用户,那么用户接到singal之后或者在callback里面就不用拷数据了,直接就可以进行应用逻处理。
其实,除了block/non-block区别较大,其余的描述起来还是很拗口的,要想解释清楚就大费笔墨,要理解核心思想却不难。下面的场景直接对应5中IO模型,品味一下吧。
老婆说今天做红烧肉和炒波菜,我想尽快吃到,
1. 我跑到厨房门口看着,直到全部做好,我和老婆一起将菜端到餐桌,开始吃饭;
2. 我一边看电影,每隔几分钟就去厨房看一下红烧肉做好没,好了偷吃一块,继续回去看电影,红烧肉好了后我还是隔几分钟跑一次看波菜做好没,都做好了我们一起端到餐桌吃饭;
3. 我一边看电影,每隔几分钟去厨房看一遍,同时看看红烧肉和波菜做好没,做好就一起端到餐桌吃饭,这样我去厨房次数也少了,可以多看会电影。
4. 我一直看电影,老婆做好菜喊我一声端菜啦,我跑过去一起端菜到餐桌,然后吃饭;
5. 最理想的是老婆做好菜并端上餐桌,准备好碗筷,喊一声吃饭啦,于是我坐下来吃饭,多么美好啊
有用的文章:
1. 使用异步 I/O 大大提高应用程序的性能: http://www.ibm.com/developerworks/cn/linux/l-async/
2. Linux下异步IO(libaio)的使用以及性能,libc里面的异步IO是伪的: http://blog.yufeng.info/archives/741
3. 德国人写的一个比较牛X的lib:http://software.schmorp.de/pkg/EV.html