1 Epoll vs. IOCP
Epoll 和 IOCP 都是爲高性能網絡服務器而設計的高效 I/O 模型;都是基於事件驅動的。事件驅動有個著名的好萊塢原則(“不要打電話給我們,我們會打電話給你”)。
不同之處在於:
1. Epoll 用於 Linux 系統;而 IOCP 則是用於 Windows ;(啊,好大的雞蛋 … )
2. Epoll 是當事件資源滿足時發出可處理通知消息;而 IOCP 則是當事件完成時發出完成通知消息。
3. 從應用程序的角度來看, Epoll 本質上來講是同步非阻塞的,而 IOCP 本質上來講則是異步操作;這是才二者最大的不同。
就第 3 點來講,還需要簡單說說系統的 IO 模型。
2 系統的 IO 模型
系統 IO 可以分成三種模型:阻塞 (blocking) ,同步非阻塞 (non-blocking synchronous) 和異步非阻塞 (non-blocking asynchronous) 。
先舉個打印室的例子:
你有個文檔需要拿到打印室打印,這時候正巧你的一個同事正在打印一本 800 頁的書;
看看這三種模型下你和打印室的反應。
1. 阻塞模型
調用者必須阻塞等待操作的完成,如果資源不可用,只能阻塞等待。可見這是一種相當低效的模型。
對應於打印室的例子:你把文檔給打印室,打印室不會告訴你,現在前面有個兄弟 800 頁呢,你的等半天了。你只能等在那裏,直到打印室打完文檔後給你;在打那 800 頁時你也只能白等着。
2. 同步非阻塞
本質上依然是同步的,但是當資源不可用時,調用將會立即返回,並得到通知指示資源部可用;否則可以立即完成。
對應於打印室的例子:你把文檔給打印室,打印室馬上就會告訴你,忙着呢,現在前面有個兄弟 800 頁呢。得到打印室的通知後,隨你怎麼處理了;如果你去的時候打印機正好空閒,打印室就會立即開始打印,把打印好的文檔給你。
3. 異步非阻塞
異步肯定不會阻塞啦(有誰聽過異步阻塞啊?),異步就是你告訴操作系統說,我要給你什麼事情,好了,如果操作立即完成,系統會立即返回給你操作結果;否則就告訴你說執行中,完成了再通知你,你接着幹自己的事情去吧,不用等在這裏。
當然這個時候系統必須提供一種機制,以期能在完成時讓應用程序得到通知。
對應於打印室的例子:你把文檔給打印室,如果這時候打印機正好空閒,打印室就會立即開始打印,把打印好的文檔給你;否則打印室會對你說,兄弟你忙去吧,文檔打印好了馬上通知你。
從理論上來講異步肯定是最優的方案了,你把處理扔給操作系統就行了。