nio reactor proactor

兩種I/O多路複用模式:Reactor和Proactor
一般地,I/O多路複用機制都依賴於一個事件多路分離器(Event Demultiplexer)。分離器對象可將來自事件源的I/O事件分離出來,並分發到對應的read/write事件處理器(Event Handler)。開發人員預先註冊需要處理的事件及其事件處理器(或回調函數);事件分離器負責將請求事件傳遞給事件處理器。兩個與事件分離器有關的模式是Reactor和Proactor。Reactor模式採用同步IO,而Proactor採用異步IO。
在Reactor中,事件分離器負責等待文件描述符或socket爲讀寫操作準備就緒,然後將就緒事件傳遞給對應的處理器,最後由處理器負責完成實際的讀寫工作。
而在Proactor模式中,處理器--或者兼任處理器的事件分離器,只負責發起異步讀寫操作。IO操作本身由操作系統來完成。傳遞給操作系統的參數需要包括用戶定義的數據緩衝區地址和數據大小,操作系統才能從中得到寫出操作所需數據,或寫入從socket讀到的數據。事件分離器捕獲IO操作完成事件,然後將事件傳遞給對應處理器。比如,在windows上,處理器發起一個異步IO操作,再由事件分離器等待IOCompletion事件。典型的異步模式實現,都建立在操作系統支持異步API的基礎之上,我們將這種實現稱爲“系統級”異步或“真”異步,因爲應用程序完全依賴操作系統執行真正的IO工作。
舉個例子,將有助於理解Reactor與Proactor二者的差異,以讀操作爲例(類操作類似)。
在Reactor中實現讀:
- 註冊讀就緒事件和相應的事件處理器
- 事件分離器等待事件
- 事件到來,激活分離器,分離器調用事件對應的處理器。
- 事件處理器完成實際的讀操作,處理讀到的數據,註冊新的事件,然後返還控制權。
與如下Proactor(真異步)中的讀過程比較:
- 處理器發起異步讀操作(注意:操作系統必須支持異步IO)。在這種情況下,處理器無視IO就緒事件,它關注的是完成事件。
- 事件分離器等待操作完成事件
- 在分離器等待過程中,操作系統利用並行的內核線程執行實際的讀操作,並將結果數據存入用戶自定義緩衝區,最後通知事件分離器讀操作完成。
- 事件分離器呼喚處理器。
- 事件處理器處理用戶自定義緩衝區中的數據,然後啓動一個新的異步操作,並將控制權返回事件分離器。

 

實踐現狀
由Douglas Schmidt等人開發的開源C++開發框架ACE,提供了大量與平臺無關,支持併發的底層類(線程,互斥量等),且在高抽象層次上,提供了兩組不同的類--ACE Reactor和ACE Proactor的實現。不過,雖然二者都與平臺無關,提供的接口卻各異。
ACE Proactor在windows平臺上具有更爲優異的性能表現,因爲windows在操作系統提供了高效的異步API支持(見http://msdn2.microsoft.com/en-us/library/aa365198.aspx)。
然而,並非所有的操作系統都在系統級大力支持異步。像很多Unix系統就沒做到。因此,在Unix上,選擇ACE Reactor解決方案可能更好。但這樣一來,爲了獲得最好的性能,網絡應用的開發人員必須爲不同的操作系統維護多份代碼:windows上以ACE Proactor爲基礎,而Unix系統上則採用ACE Reactor解決方案。

 

學習網絡編程中...。

 

 

 

發佈了41 篇原創文章 · 獲贊 0 · 訪問量 2566
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章