I/O併發模式:Reactor模式與Proactor模式


     要理解這兩個模式還是有點困難。從網上找了幾篇關於這兩個模式的講解,特此在這裏記錄下。看了很多總感覺不能深入精髓,可能實際經驗太少。希望日後自己自己能理解的很好了,再來好好總結下。以下是別人的一些總結:

     首先最好拜讀下《Unix網絡編程第一卷:套接口API》第6章關於I/O模型的講解非常經典,首先搞清楚何爲阻塞和非阻塞,何爲同步和異步。

   《高性能IO設計的Reactor和Proactor模式》關於阻塞非阻塞,同步異步的講解,以及Reactor和Proactor的區別比較清晰。

1、Reactor模式

     Reactor釋義“反應堆”,是一種事件驅動機制。和普通函數調用的不同之處在於:應用程序不是主動的調用某個API完成處理,而是恰恰相反,Reactor逆置了事件處理流程,應用程序需要提供相應的接口並註冊到Reactor上,如果相應的時間發生,Reactor將主動調用應用程序註冊的接口,這些接口又稱爲“回調函數”。使用Libevent也是想Libevent框架註冊相應的事件和回調函數;當這些時間發聲時,Libevent會調用這些回調函數處理相應的事件(I/O讀寫、定時和信號)。
    用“好萊塢原則”來形容Reactor再合適不過了:不要打電話給我們,我們會打電話通知你。
 

2、兩個模式簡單對比

     兩個模式的相同點:(1)都是對某個IO事件的事件通知(即告訴某個模塊,這個IO操作可以進行或已經完成)。(2)在結構上的相同點:demultiplexor負責提交IO操作(異步)、查詢設備是否可操作(同步),然後當條件滿足時,就回調handler。

     不同點在於:異步情況下(Proactor),當回調handler時,表示IO操作已經完成;同步情況下(Reactor),回調handler時,表示IO設備可以進行某個操作(can read or can write),handler這個時候開始提交操作。

     我的理解:兩者的根本區別就在於《Unix網絡編程第一卷:套接口API》第6章講解的五種I/O模型,Proactor是基於異步I/O,Reactor是同步I/O(一般是I/O複用)。但是現在的操作系統並不是都能很好的真正支持異步I/O,比如Windows裏有真正的異步I/O——IOCP,而Unix、Linux並沒有真正實現異步I/O。所以考慮程序移植性以及現在很多服務器基於Unix,Linux;Proactor封裝了這種差異,在內部異步事件分離器實現時根據系統的不同調用相應的I/O模式。

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