技术派-epoll和IOCP之比较

本文对比了Linux下的epoll模型与Windows下的IOCP模型。epoll为同步非阻塞模型,通过通知形式告知资源可用;IOCP为异步模型,在事件完成后主动处理并通知。文章通过打印店的例子生动解释了两种模型的区别。
摘要由CSDN通过智能技术生成

目录

区别

Linux的epoll模型

windows的IOCP模型


区别

直入正题:

  • Epoll 是Linux系统下的模型;
  • IOCP 是Windows下模型;
  • Epoll 是当事件资源满足时发出可处理通知消息;
  • IOCP 则是当事件完成时发出完成通知消息;
  • 从应用的角度看, Epoll 是同步非阻塞的;IOCP是异步操作;

举例说明,更加清晰透彻:

有一个打印店,有一台打印机,好几个人在排队打印。
普通打印店,正常情况是:

  • 1、你准备好你的文档,来到打印店;
  • 2、排队,等别人打印完;
  • 3、轮到你了,打印你的文档;
  • 4、你取走文档,做后面的处理。

这种方式,你会浪费很多等待时间,非常低效。
于是, Linux和windows都提出了自己最优的模型。

Linux的epoll模型

则可以描述如下:

  • 1、你准备好你的文档,来到打印店;
  • 2、告诉店小二说,我先排队在这位置,轮到我了通知一声(假定你来回路上不耗时);
  • 3、你先去忙你的事情去了;
  • 4、轮到你了,店小二通知你(假定你来回路上不耗时);
  • 5、你获得打印机使用权了,开始打印;
  • 6、打印完了拿走。

你会发现,你节省了排队的时间,等到你能获得打印机资源的时候,告诉你来处理。但是这里,就浪费了一点时间,就是你自己打印。这就是epoll的同步非阻塞。

windows的IOCP模型

则可以描述如下:

  • 1、你准备好你的文档,来到打印店;
  • 2、告诉店小二说,我先排队,轮到我了帮打印下,好了通知我(也假定你来回路上不耗时);
  • 3、你先去忙你的事情去了;
  • 4、轮到你的文档了,店小二直接帮你打印好了,通知你;
  • 5、你来了,直接取走文档。

你会发现,你不但节省了排队时间,你连打印时间都节省了, 完全异步操作。

很显然,IOCP简直是太完美了,可以称得上是最高性能的服务器网络模型了。

那么问题来了,是不是epoll就比iocp效率低了?

不一定。

同样是以打印为例:
假定现在有两个打印店,分别命名为:

epoll打印店(L店), IOCP打印店(W店)

你把相同的材料2份,分别放在两个店,哪一个会先完成呢?

如果L店的工作人员,工作任务少,效率非常高,很快就轮到你打印了;
而W店的工作人员,工作任务巨多,慢慢悠悠,边工作边吃饭边聊天,很久才轮到你的打印。

请问:那个会先打印完? 所以,谁更快,还与打印店的工作方式有很大关系。

windows启动后,即便什么也不干,就已经有近百个进程+近百个服务在后台运行+一千多个线程在工作了,外加大量图形化界面占用许多系统资源。而Linux启动后仅有几个进程几个服务在后台,轻装上阵,只要你不启动图形化应用,就几乎没有什么图形化应用占用系统资源。

回到本话题,决定效率快慢的,模型是一方面;操作系统的底层协议处理架构,也是一方面。

两者同样重要。

当然你也可以说,也很有可能是,L店的打印机是时速30张/分钟,W店打印机时速120张/分钟,非常正确,但是这就属于硬件配置的范畴了,这就等于是i9处理器与二十年前的赛扬II处理器在比较了。

搁笔。如果遇到有什么疑问,可留言或站内私信消息。

EpollIOCP(I/O Completion Ports)都是用于提高现代操作系统中高并发网络编程性能的异步I/O模型。它们的主要目标是减少CPU阻塞,提高系统效率。 **Epoll(Linux下的事件驱动模型)**: - Epoll是Linux内核提供的原生事件通知机制,它允许一个进程注册文件描述符,当这些描述符上有数据可读或写就绪时,Epoll会唤醒进程。 - 它使用单个内核结构来维护多个fd的状态,减少了内存开销。 - 主要优点是简单易用,适合于Linux环境,性能较好,特别是在大量并发连接下。 **IOCP(Windows下的I/O完成端口)**: - IOCP是Windows NT内核提供的,类似于Epoll,用于处理多个网络连接的异步I/O请求。 - 它使用一组称为“完成端口”的结构,每个完成端口可以关联多个工作线程,当I/O操作完成时,会将数据发送回特定的端口。 - IOCP支持更复杂的异步操作,如接收缓冲区预读等高级功能。 - 与Epoll相比,IOCP在Windows上性能通常更好,特别是对于非阻塞I/O和大数量的连接。 **比较**: 1. **平台依赖**:Epoll仅在Linux和某些Unix-like系统可用,而IOCP是Windows特有的。 2. **资源管理**:Epoll通常比IOCP更轻量级,因为它没有像完成端口那样的内核结构。 3. **并发性能**:两者都能提供良好的并发性能,但在某些场景下IOCP可能表现更优,尤其是在Windows平台且连接数较多的情况下。 4. **API复杂性**:IOCP可能需要更多的学习和调试,但提供了更丰富的功能。 相关问题: 1. Windows环境下,为何IOCP性能优于Epoll? 2. Epoll能否在Windows系统上运行? 3. IOCP和Epoll都支持哪些类型的I/O事件?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌志辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值