Epoll vs. IOCP

1 Epoll vs. IOCP

EpollIOCP 都是爲高性能網絡服務器而設計的高效 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. 異步非阻塞

異步肯定不會阻塞啦(有誰聽過異步阻塞啊?),異步就是你告訴操作系統說,我要給你什麼事情,好了,如果操作立即完成,系統會立即返回給你操作結果;否則就告訴你說執行中,完成了再通知你,你接着幹自己的事情去吧,不用等在這裏。

當然這個時候系統必須提供一種機制,以期能在完成時讓應用程序得到通知。

 

對應於打印室的例子:你把文檔給打印室,如果這時候打印機正好空閒,打印室就會立即開始打印,把打印好的文檔給你;否則打印室會對你說,兄弟你忙去吧,文檔打印好了馬上通知你。

 

從理論上來講異步肯定是最優的方案了,你把處理扔給操作系統就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章