http://www.cnblogs.com/hzbook/archive/2012/07/19/2599698.htmlhtml
Reactor框架是ACE各個框架中最基礎的一個框架,其餘框架都或多或少地用到了Reactor框架。本文分析Reactor構架模式的基本原理。react
對每個構架模式的分析,咱們都使用參考文獻的分析風格,着重分析意圖、上下文、問題、解決方案、結構和實現 6個方面的內容。而實現就是ACE源代碼。編程
在事件驅動的應用中,將一個或多個客戶的服務請求分離(demultiplex)和調度(dispatch)給應用程序。設計模式
在事件驅動的應用中,同步地、有序地處理同時接收的多個服務請求。數組
在分佈式系統尤爲是服務器這一類事件驅動應用中,雖然這些請求最終會被序列化地處理,可是必須時刻準備着處理多個同時到來的服務請求。在實際應用 中,這些請求老是經過一個事件(如CONNECTOR、READ、WRITE等)來表示的。在有序地處理這些服務請求以前,應用程序必須先分離和調度這些 同時到達的事件。爲了有效地解決這個問題,咱們須要作到如下4方面:服務器
在一個或多個事件源上等待事件的到來,例如,一個已經鏈接的Socket描述符就是一個事件源。將事件的分離和調度整合處處理它的服務中,而將分離和調度機制從應用程序對特定事件的處理中分離開,也就是說分離和調度機制與特定的應用程序無關。網絡
具體來講,每一個應用程序提供的每一個服務都有一個獨立的事件處理器與之對應。由事件處理器處理來自事件源的特定類型的事件。每一個事件處理器都事先註冊 到Reactor管理器中。Reactor管理器使用同步事件分離器在一個或多個事件源中等待事件的發生。當事件發生後,同步事件分離器通知 Reactor管理器,最後由Reactor管理器調度和該事件相關的事件處理器來完成請求的服務。數據結構
在Reactor模式中,有5個關鍵的參與者。多線程
經過上述分析,咱們注意到,是Reactor管理器而不是應用程序負責等待事件、分離事件和調度事件。實際上,Reactor管理器並無被具體的 事件處理器調用,而是管理器調度具體的事件處理器,由事件處理器對發生的事件作出處理。這就是相似Hollywood原則的「反向控制」。應用程序要作的 僅僅是實現一個具體的事件處理器,而後把它註冊到Reactor管理器中。接下來的工做由管理器來完成。這些參與者的相互關係如圖2-1所示。架構
如今結合第1章分析的框架五元素來看一下Reactor構架模式的參與者與框架五元素之間的關係:Reactor構架模式的具體實現對應了元素1; 事件處理器接口對應元素2;具體的事件處理器對應元素3;Reactor管理器使用了Hollywood原則,能夠認爲和元素5對應;元素4的功能相對不 明顯,沒有明確的對應關係。
若是仍是沒有理解Reactor構架模式,沒有關係,源代碼會說明全部問題。此時可再分析一遍Reactor構架模式,而後繼續如下內容。
圖2-1 Reactor構架模式結構圖
從對Reactor構架模式的分析中咱們能夠看出,要設計和實現一個簡單Reactor框架以支持I/O事件,須要實現兩個組件:事件處理器接口和 Reactor管理器。至於其餘組件,如同步事件分離器可使用操做系統提供的select、poll或其餘相似的函數;而描述符可使用文件描述符或其 他能夠識別事件的數據結構,通常操做系統都會提供。事件處理器接口包含一系列模板函數,能夠根據實際處理的數據進行設計;Reactor管理器肩負着事件 的分離和調度,是整個框架設計的核心。
ACE的Reactor框架在Linux平臺下使用文件描述符做爲I/O事件的描述符,使用ACE_Event_Handler類做爲各種事件的處 理器接口。將同步事件分離函數放到Reactor管理器中,這樣使用不一樣的同步事件分離函數就須要實現不一樣的Reactor管理器。ACE使用 Bridge設計模式解決了這一問題,將與同步事件分離函數相關的操做放到Bridge設計模式的Implementor中。凡是ACE支持的同步事件分 離函數都會有一個具體的Implementor與之對應。
ACE的Reactor管理器還提供了用於實現Singleton設計模式的操做,使用這些操做時,一個進程只能有一個全局的Reactor管理 器。在調用Singleton設計模式接口時,Reactor管理器會在啓動時根據操做系統的配置選擇一個具體的Implementor。固然,若是你不 喜歡這個默認的Implementor,能夠經過函數進行更換。爲了提升整個系統對事件分離和調度的性能,ACE還容許應用程序建立多個Reactor管 理器實例。在這種狀況下,應用程序將不能調用用於Singleton設計模式的操做,只能直接使用Reactor管理器實例對象的方法實現對事件的分離和 調度。同時提供這兩種使用方法,能夠最大程度地知足應用程序的苛刻要求。
ACE實現的Reactor框架結構要比Reactor構架模式中分析的結構複雜得多。這是由於ACE的Reactor框架除了處理I/O事件之 外,還要處理定時器、信號量等常見的事件,而且全部的這些處理都必須知足跨平臺的要求。要將對這些事件的處理抽象出來,而且提供給應用程序一個統一的接 口,ACE的Reactor管理器的實現還採用了Facade設計模式。實際上,Reactor框架管理的I/O事件、信號量事件、定時器事件和 Notify事件在實現上都有一個小的組件與之對應,這樣能夠將Reactor管理器與具體的事件處理解耦。使用Facade設計模式,將這些小的組件的 接口封裝起來,使得應用程序沒法感知它們的存在,能夠減小應用程序處理對象的數目,而且使得這些小的組件使用起來更加方便。
以上分析的3種設計模式以及Factory設計模式,在ACE的框架管理器的實現中被頻繁使用。這些設計模式以及它們的使用,既爲咱們學習設計模式 提供了很是好的場景,又爲咱們實現軟件框架管理器提供了實用的方法。ACE的Reactor框架與框架五元素的對應關係很是密切,是一個典型的事件驅動型 框架,它爲咱們打開了ACE的框架之門,是學習其餘框架的基礎。
在深刻到框架代碼以前,咱們先來看一個Reactor框架的使用示例,示例雖然簡單,但卻提供了一個實實在在的應用程序,也爲咱們的分析提供了一些思路。
---------------------------------------------
本文節選自《ACE技術內幕:深刻解析ACE架構設計與實現原理》,做者:潘榮。
內容簡介:本書從構架模式、編程示例和源代碼3個維度系統地對經典網絡框架ACE(Adaptive Communication Environment)的架構設計和實現原理進行了深刻分析,它能解決4個方面的問題:第一,幫助框架設計者領略軟件框架設計的普適原則和思想,進而設 計出本身的軟件框架;第二,幫助ACE應用開發人員加深對ACE框架的理解,提高開發水平,更好地去定製和擴展ACE框架,以及解決C++網絡通訊中的難 題;第三,幫助C++開發人員加深C++語言功底,書中有大量對C++源代碼的分析,包括網絡編程、動態庫編程和異步編程等,還涉及10餘個經典的設計模 式的解析;第四,加強平臺開發人員和軟件架構師的技術修養,ACE的設計和實現都極其優秀,它的實現源碼和架構思想很是值得去學習和研究。
全書一共7章,詳細分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams等6個框架的架構設計與實現原理。每一個框 架的分析分爲3部分:第一,框架的設計分析,每一個框架(除Task框架)都有一個構架模式與之對應,構架模式闡述了框架的設計原理,給出了框架的整體結 構,是學習框架的理論基礎;第二,框架的應用分析,每一個框架都有一個應用實例與之對應,應用實例既幫助讀者瞭解框架的使用方法,又爲讀者提供了一個能夠調 試的應用程序,便於讀者使用調試器探索框架的內部祕密;第三,框架的實現分析,這是本書的重點,對框架的實現原理進行了詳細的分析,而且對重點的類和流程 給出了UML類圖和UML順序圖,可讓讀者在短期內掌握框架的實現技術。