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