operamasks
-
2008-04-19
epoll与IOCP - [性能]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://operamasks.blogbus.com/logs/19317909.html
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、引用。但任何对本文的引用,均须注明本文的作者、出处以及本行声明信息。在win平台下,高效的IO模型是IOCP,而在linux底下则是epoll。那么,epoll与iocp之间到底有哪些异同之处呢?
首先,我们看一下它们相同的地方。
两者都是处理异步IO的高效模型,这种高效,除了“异步处理”这个共同的特征之外,二者都可以通过指针携带应用层数据:在IOCP里,应用层数据可以通过单句柄数据和单IO数据来与IOCP底层通信;而在epoll里,可以通过epoll_data里的"void *ptr"来传递。这是一种很重要的思想,也是它们高效的原因所在:当事件的通知到来时,它不仅告诉你发生了什么样的事件,还同时告诉这次事件所操作的数据是哪些。
那么,epoll和iocp到底又有什么不同呢?
1.iocp是在IO操作完成之后,才通过get函数返回这个完成通知的;而epoll则不是在IO操作完成之后才通知你,它的工作原理是,你如果想进行IO操作时,先向epoll查询是否可读或可写,如果处于可读或可写状态后,epoll会通过epoll_wait函数通知你,此时你再进行进一步的recv或send操作。
2. 在1的基础上,我们其实可以看到,epoll仅仅是一个异步事件的通知机制,其本身并不作任何的IO读写操作,它只负责告诉你是不是可以读或可以写了,而具体的读写操作,还要应用层自己来作;但iocp的封装就要多一些,它不仅会有完成之后的事件通知,更重要的是,它同时封装了一部分的IO控制逻辑。从这一点上来看,iocp的封装似乎更全面一点,但是,换个角度看,epoll仅提供这种机制也是非常好的,它保持了事件通知与IO操作之间彼此的独立性,使得epoll的使用更加灵活。
历史上的今天:
在Apusic中根据多核环境进行参数优化 2008-04-19在Apusic中输出E文日志提示信息 2008-04-19修正Java中的时间 2008-04-19Code From Web 2008-04-19IBM反对ESB,VK反对老毛 2008-04-19随机文章:
javascript优化工具 2008-11-28关于支持自主品牌发展的相关政策 2008-11-27linux下减少TIME_WAIT的socket 2008-11-04关于request.getRemoteHost的性能问题 2008-11-04Apusic性能领先WebSphere 2008-05-28
收藏到:Del.icio.us








评论