Equalizer中eq::Server/eq::Node的代碼分析

        在Equalizer中,server作爲一個獨立運行的進程,負責整個並行繪製系統的管理與調度,其主要任務包括加載配置腳本,監聽並與各節點建立連接,響應來自其它節點的消息等。由於eq::Server是eq::Node的子類,因此在很多方面與後者比較相似。
 
1.加載配置腳本
        在eq::Server的初始化階段,eq::Server::Loader及其多個重載函數可以從命令行中的字符串或腳本文件(*.cfg)中加載關於應用的配置,並據此創建eq::Server以及eq::Config對象。無論是採用那種配置方式,都以字符串形式加載並由server/parser.cpp中的函數實現解析,該過程是採用Bison-Flex自動生成的。事實上,這裏的eq::Config就是要在收到其它應用節點的連接請求後,需要向其發送的配置參數。
 
2.網絡通訊
        eq::Server繼承自eq::net::Node,初始化過程直接採用父類的操作,其中的關鍵在於啓動監聽功能。缺省的監聽採用TCP/IP協議對指定端口進行監聽,也可以在命令行參數中輸入由“--eq-listener”參數指定的網絡協議與監聽端口,可用的協議包括TCP/IPSDPPIPE三種。
        eq::net::Node的初始化時,可以在命令行參數中輸入“--eq-client”,並在其後的參數中標明要運行的客戶端指令,從而創建作爲客戶端的節點對象,也就是所謂的“alone”運行模式。

        eq::net::Node中的數據發送、接收,都是由其中的成員對象_connect完成。該對象爲eq::net::Connection的對象指針,在win32下實例化爲socketConnectionWin32對象,它採用WinSockoverlapped模型進行數據的發送接收。其實質是以多線程形式的阻塞模式,實現數據的異步傳輸。同時,Connection類也提供了直接面對數據緩存與Packet結構體的傳輸接口,從而簡化了其在eq::net::Node中的應用。

    eq::net::Connection中,send/recv是高級接口,由應用對象,如eq::net::Node調用,而read/write是底層接口,用於直接處理數據傳輸的socket操作。高層接口內部通過底層接口執行網絡操作,其接口與底層操作無關,因此由eq::net::Connection類直接實現。而底層的read/write所使用的接口與運行的平臺相關,例如在windows中使用WinSock,在有的環境下會採取共享緩存方式,所以由不同的子類實現,如下圖。

 

 

3.消息響應

        eq::net::Node在初始化監聽後會啓動兩個線程,分別用於接收監聽到的數據以及處理數據中的指令,所有的數據都以消息的形式進程處理。其中_receiverThread用於將接收到的消息放入node的消息隊列,而_commandThread則從消息隊列中依次獲取消息並根據消息執行操作。eq::Server在完成初始化後,會進入消息處理循環,不斷從消息隊列中獲得新的消息並進行處理。

        eq::net::Node中利用eq::net::ConnectionSet實現異步的網絡通訊,並根據所接收到的消息進行簡單響應。需要注意的是,這裏通過異步接收到的消息並不是有效的應用消息。除了必要的異常消息外,Event_Data是其中最主要的消息,該消息中還包括收到該消息的connector,以及相應的數據大小。在_receiveThread線程中就是首先查詢eq::net::ConnectionSet,當出現Event_Data消息後,即根據該消息的參數進行同步的數據接收真正有效的消息數據。(這種方式下,首先通過簡單的異步消息避免了接收線程中不斷的主動查詢端口,然後只有在明確有有效數據到達時纔讀取端口,效率相對較高

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