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的比较

目录
相关文章
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
3307 3
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
9430 4
|
11月前
|
网络协议 算法 网络性能优化
第十一问:TCP的窗口机制是什么?
TCP的窗口机制是实现流量控制和拥塞控制的重要手段,主要包括滑动窗口、接收窗口(rwnd)和拥塞窗口(cwnd)。滑动窗口定义了发送方允许发送的数据范围,接收窗口控制接收方的缓冲区容量,拥塞窗口防止网络拥塞。这些窗口通过动态调整,确保数据传输的高效性和可靠性。
|
Java Apache
解决gradle下载慢的问题
解决gradle下载慢的问题
9397 0
|
网络协议 Linux API
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
1647 0
|
9月前
|
人工智能 自然语言处理 数据可视化
OneCode 接入 DeepSeek:开启代码开发新纪元
OneCode 接入 DeepSeek,带来自然语言聊天式基础建模、本地代码工程无缝结合、图生代码功能全线升级及 AI 模型代码直接导入等新特性,极大提升开发效率与体验。预计第二季度推出开源版本,进一步推动开发者社区的开放与创新。这些改进使开发更加高效、便捷和智能,助力代码开发进入新纪元。
|
10月前
|
存储 编解码 数据处理
云端问道第4期实践教学——多媒体数据存储与分发方案部署演示
该文档详细介绍了阿里云一键部署和手动部署多媒体数据存储与分发方案的步骤。一键部署通过资源编排服务(ROS)实现自动化,涵盖注册账号、开通服务、创建OSS Bucket、配置CDN加速及绑定IMM等功能,简化了复杂操作。手动部署则更细致地展示了每个配置环节,包括网络规划、资源创建、域名绑定、CDN配置、证书加密及最终的验证与清理,确保用户对整个流程有清晰理解。两种方式均以OSS为核心,支持数据上传、转码处理和加速分发,保障高效稳定的用户体验。
447 4
|
消息中间件 小程序 Java
【规范】看看人家Git提交描述,那叫一个规矩
本文通过IDEA中的Git描述规范插件【git commit message helper】,介绍了Git提交描述的规范流程,强调了团队开发中统一标准的重要性,并通过实例展示了规范的提交记录如何提高代码管理和维护效率。最后,文章提供了几个实用的Git提交描述案例,帮助读者更好地理解和应用这些规范。
3490 0
【规范】看看人家Git提交描述,那叫一个规矩
|
前端开发 应用服务中间件 nginx
Nginx入门 -- 理解 Nginx 的基本概念:Pipe 和 Lingering Close
Nginx入门 -- 理解 Nginx 的基本概念:Pipe 和 Lingering Close
276 0
|
JSON 开发工具 开发者
CMake进阶教程:深入FetchContent与ExternalProject模块
CMake进阶教程:深入FetchContent与ExternalProject模块
1409 0