1. 程式人生 > >Linux Epoll vs Windows IOCP

Linux Epoll vs Windows IOCP

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. 非同步非阻塞

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

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

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

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