直入正题
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店)
你把相同的材料两份,分别放在两个店,哪一个会先完成呢?
如果L店的工作人员,工作效率非常高,很快就轮到你打印了。
而W店的工作人员,慢慢悠悠,边工作边吃饭边聊天,很久才轮到你的打印。
请问:那个会先打印完?
所以,谁更快,还与打印店的工作方式有很大关系。
回到本话题,决定效率快慢的,模型是一方面,操作系统的底层协议处理架构,也是一方面。
两者同样重要。
当然你也可以说,也很有可能是,L店的打印机是时速30张/分钟,W店打印机时速120张/分钟,这个就属于硬件配置了。
这就等于是i9处理器与二十年前的赛扬II处理器在比较了。