天天看點

Reactor和Proactor模式1.Reactor和Proactor模式的比較2.Proactor模式詳細介紹

1.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操作完成事件,然後将事件傳遞給對應處理器。

以上的差異确定了兩者不同的應用場景。Reactor架構中使用者定義的操作是在實際操作之前調用的。比如你定義了操作是要向一個SOCKET寫資料,那麼當該SOCKET可以接收資料的時候,你的操作就會被調用;而Proactor架構中使用者定義的操作是在實際操作之後調用的。比如你定義了一個操作要顯示從SOCKET中讀入的資料,那麼當讀操作完成以後,你的操作才會被調用。

Proactor和Reactor都是并發程式設計中的設計模式,都是用于派發/分離IO操作事件的。這裡所謂的IO事件也就是諸如read/write的IO操作。"派發/分離"就是将單獨的IO事件通知到上層子產品。兩個模式不同的地方在于,Proactor用于異步IO,而Reactor用于同步IO。

2.Proactor模式詳細介紹

proactor模式的整體結構圖如下:

Reactor和Proactor模式1.Reactor和Proactor模式的比較2.Proactor模式詳細介紹

 整體流程如下:

(1)為了異步式的執行服務,作為用戶端的應用程式将異步操作傳遞給異步操作處理器以完成初始化操作。同時,用戶端需向異步操作處理器指明異步操作完成後回調哪個完成句柄執行後續的工作。(注冊回調函數)

(2)用戶端在異步操作處理器激活操作之後,操作和用戶端可以和其他應用程式激活的異步操作一起并行的運作。

(3)當操作執行完後,異步操作處理器取回操作初始化時用戶端限定的完成句柄和proactor。然後異步操作處理器傳遞異步操作的結果和完成句柄給proactor,由其完成分發。

(4)proactor分發完成句柄的鈎子方法,并傳遞完成資料。

詳細的處理過程如下:

Reactor和Proactor模式1.Reactor和Proactor模式的比較2.Proactor模式詳細介紹

繼續閱讀