荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: mmkiller (宝贝计划|我什么都会,但就是不强), 信区: Program
标  题: epoll与iocp的异同之处zz
发信站: 荔园晨风BBS站 (Wed Sep 27 16:19:12 2006), 站内

本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、引用。但任何对本文的引用,均须注明本文
的作者、出处以及本行声明信息。

目前国内的网游研发,在服务器使用的开发平台方面,win和linux的比例各占多少,我一时
半会也没有准确数据,但从我了解的这么多公司情况来看,用win系统的还是比较多一点,
这些企业一般都是比较单纯的网游公司,而用linux的则多数是一些传统的互联网公司,比
如网易和腾讯。

网游服务器用win还是linux,向来都是大家关注的话题。我想,原因可能很多,但此处不想
过多论述这个问题,为避免多费口舌,我还是明确表明一下自己的观点:我是推荐用linux
作开发的,虽然我也是刚转来作linux平台下的开发。

那么,说具体一点。但凡作过比较深入的网络编程的人,都会知道,在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的使用更加灵活。

这只是我初步使用epoll开发过程中的体会,以后有更深的体会时还会发上来跟大家分享。






--
太阳当空照,花儿对我笑。小鸟说:早早早,你为什么背着炸药包。我去炸学校,老师不
知道。一拉线,我就跑,轰的一声学校不见了。
第一句借景物描写表达了作者去炸学校前的愉快心情。第二句作者借“小鸟说:早早早”
暗示他自己实在不想伤及无辜,所以赶在其他同学到来之前,去炸学校。第三句“老师不
知道“是用反语的手法表示:老师也痛恨学校,所以睁一只眼闭一只眼“一拉线,我就跑
”说明作者具有丰富的爆破经验,而且善于保护自己。


※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 59.40.31.111]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店