直入正題
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處理器在比較了。