[转帖]Epoll和IOCP的比较

Epoll和IOCP的比较

https://yq.aliyun.com/articles/53621/
 
kryptosx  2016-05-27 23:32:51 浏览6181
 

原来整理过一个《六种Socket I/O模型幽默讲解》,里面是windows的六种socket I/O模型,大学时的windows网络编程就是讲的这几个。今天听了一个网络技术讲座,突然想起了这两个模型还是没搞清楚。

但是,貌似服务器中用的最多的还是linux,相对于windwos最尖端的IOCP而言,linux祭出的则是它的Epoll。

Epoll 和 IOCP 都是为高性能网络服务器而设计的高效 I/O 模型;都是基于事件驱动的。事件驱动有个著名的好莱坞原则(“不要打电话给我们,我们会打电话给你”)。

不同之处:

  1.  Epoll 用于 Linux 系统;而 IOCP 则是用于 Windows;
  2.  Epoll 是当事件资源满足时发出可处理通知消息;而 IOCP 则是当事件完成时发出完成通知消息。
  3.  从应用程序的角度来看, Epoll 本质上来讲是同步非阻塞的,而 IOCP 本质上来讲则是异步操作;这是才二者最大的不同。

这么说来,其实Epoll有点像上面说的第四种Socket I/O模型。不过,Epoll只告诉你几个句柄收到消息和收到消息的句柄队列,然后你自己去扫描。

一个例子

有个文档需要拿到打印室打印,这时候看到前面还有好几个同事在排队。

我们分解一下操作:

一:你有一个打印的需求,来到打印店。

二:你需要排队等别人打印完。

三:轮到你打印了,直到你的文档打印完。

四:你取走文档,做后面的处理。

阻塞模型:

你只能傻呆呆的站着,直到轮到你打印。

这种模型,就类似一个流水线,你的一,二,三,四步是一步一步走的。所需时间就是他们的和。

同步非阻塞:

你告诉打印店的人,可以轮到你打印了,就通知你。

于是,你在第一步的时候,给打印店留了个电话号码,就做自己的事情去了。直到别人打印完了,打印店会通知你,然后第三步第四步。

异步非阻塞:

这比上一个更轻松,同样是留了个电话号码,但是打印店的人会把你的打印完了再通知你。你只要回来拿就可以了。

用一句话来说就是”同步非阻塞是半托管,异步非阻塞是全托管“

几个疑问

从技术上来看,IOCP比Epoll更为智能,全包了。但为什么Epoll的效率高于IOCP?

个人看法,IOCP确实看上去更智能,啥事都干完了,但同异步情况来看,并不见得就比Epoll要好。无非就是收包这步系统做了。

但是扫描epoll返回的fd,并非就比IOCP回调要快。其次,linux内核的协议栈实现要优于windows,因为linux本身就是服务器的架构。

为什么Linux不用IOCP模型?

某人的经典回答:这和为什么linux桌面一直做不好差不多一个道理。

总结:

其实说到底,优化的手段都是让程序能够并行,以让服务器的性能能发挥到机智。

线程池也发挥了很大的作用,正是它,让大量的链接成为可能。常见的场景总是链接很多,但是活跃的链接很少,异步I/O技术使得在活跃连接数不变的情况下,链接数量的增加不会对系统产生影响。

说到底,Epoll也是过去的产物。在现在,大量的连接已经不是难题,下一代网络的挑战是如何更高效的服务。

转载请注明:旅途@KryptosX » Epoll和IOCP的比较

猜你喜欢

转载自www.cnblogs.com/jinanxiaolaohu/p/11732448.html
今日推荐