Epoll和IOCP的比较

简介:

原来整理过一个《六种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的比较

目录
相关文章
|
3月前
|
消息中间件 Kubernetes NoSQL
多路复用I/O-epoll
多路复用I/O-epoll
32 0
|
3月前
|
Linux
|
3月前
|
缓存 Linux NoSQL
epoll与reactor浅析
epoll与reactor浅析
|
11月前
|
API
I/O多路复用模型实现——epoll
I/O多路复用模型实现——epoll
117 0
|
Linux
linux网络编程(六)epoll反应堆
linux网络编程(六)epoll反应堆
143 1
linux网络编程(六)epoll反应堆
|
Java Windows 容器
IOCP详解
IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。
243 0
IOCP详解
|
监控 JavaScript 前端开发
|
前端开发 算法 C++
IOCP编程小结(中)
上一篇主要谈了一些基本理念,本篇将谈谈我个人总结的一些IOCP编程技巧。   网络游戏前端服务器的需求和设计   首先介绍一下这个服务器的技术背景。在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计。
1079 0
poll&&epoll实现分析(二)——epoll实现
Epoll实现分析——作者:lvyilong316 通过上一章分析,poll运行效率的两个瓶颈已经找出,现在的问题是怎么改进。首先,如果要监听1000个fd,每次poll都要把1000个fd 拷入内核,太不科学了,内核干嘛不自己保存已经拷入的fd呢?答对了,epoll就是自己保存拷入的fd,它的API就已经说明了这一点——不是 epoll_wait的时候才传入fd,而是通过epoll_ctl把所有fd传入内核再一起"wait",这就省掉了不必要的重复拷贝。
1004 0