目录
区别
直入正题:
- 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处理器在比较了。
搁笔。如果遇到有什么疑问,可留言或站内私信消息。