IO:Reactor设计模式
reactor設計模式
reactor設計模式,是一種基于事件驅動的設計模式。
?這個模式的結構圖如下:
?圖中的handle對應的是操作系統提供的句柄,例如I/O句柄,Event_Handler類持有這些句柄,(其實就是事件,可以看成是Type)
Handles:表示操作系統管理的資源,我們可以理解為fd
Synchronous Event Demultiplexer:同步事件分離器,阻塞等待Handles中的事件發生(select、poll、epoll)
Initiation Dispatcher(Reactor):初始分派器,作用為添加Event handler(事件處理器)刪除Event handler以及分派事件給Event handler也就是說,SynchronousEvent Demultiplexer負責等待新事件發生,事件發生時通知InitiationDispatcher(Reactor),然后Initiation Dispatcher調用event handler處理事件
Event Handler:事件處理器的接口
Concrete Event Handler:事件處理器的實際實現,而且綁定了一個Handle因為在實際情況中,我們往往不止一種事件處理器,因此這里將事件處理器接口和實現分開,與C++Java這些高級語言中的多態類似
過程如下:
?reactor類內部提供一個事件循環:handle_events(),事件循環的代碼實現利用了操作系統提供的多路分離函數(Select,poll,epoll等)(這個方法調用多路復用器。)
?WaitForMultipleObjects或者select等,這些多路分離的函數的特點是,可以同時等待多個句柄,在等待過程中所在線程屬于掛起狀態(阻塞),不消耗CPU時間,一旦某個句柄被觸發,則線程被喚醒,函數將返回,線程可以執行后面的代碼,?
利用多路分離函數的這一特點,根據被激活的句柄對應的特定事件,調用相關的事件處理函數。可以實現事件循環。
?register_handler()函數用于將Event_Handler對象注冊到事件驅動列表?中,保證對于某一類型的事件,會調用Event_Handler類的響應函數handle_event()。?
reactor類在做多路分離時需要操縱Event_Handler類的Handle,因此Event_Handler類需要提供get_handle()函數。?
另外,當程序不需要再對特定事件響應時,需要把Event_Handler對象從事件驅動列表中刪除,因此reactor類還實現了?remove_handler函數。
?因為reactor相對穩定,一旦實現,不需要再定制,所以沒有提供一個抽象接口類,但Event_Handler是經常需要根據不同?的需求定制的,因此需要提供一個抽象接口類,然后根據實際需求編寫派生類,提供具體句柄,并實現相關虛函數。
?
Reactor模式實現
在Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events中,一直以Logging Server來分析Reactor模式,這個Logging Server的實現完全遵循這里對Reactor描述,因而放在這里以做參考。Logging Server中的Reactor模式實現分兩個部分:Client連接到Logging Server和Client向Logging Server寫Log。因而對它的描述分成這兩個步驟。
Client連接到Logging Server
Reactor_LoggingServer_connect.png
?
Client向Logging Server寫Log
Reactor_LoggingServer_log.png
3.4步驟循環直到當前日志處理完成。
這模式的優點是本身不涉及多線程,從而避免了線程的上下文切換。
?對于響應事件處理時間較短的情況下,可以考慮使用這個模式。
?如果處理一個事件需要花費大量時間,就不能使用這個模式,那樣會導致其他事件處理被阻塞。
?ACE_Reactor框架是這一模式的半成品,用戶只要做三件事情就可以實現并使用這一模式:
?1.從Event_Handler派生一個或多個類
2.向Reactor類登記應用的事件處理對象
3.運行Reactor事件循環(它就會調用IO分離函數,開始輪訊事件,等到有事件返回,傳給事件處理者)。
?
總結
以上是生活随笔為你收集整理的IO:Reactor设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO:select、poll、epoll
- 下一篇: 设计模式:纵观