DBUS概述以及SylixOS下DBUS替換方案

1.  概述

1.1  DBUS概述

    DBUS是一種高級的進程間通訊機制。DBUS支持進程間一對一和多對多的對等通訊,在多對多的通信時,須要DBUS後臺進程的角色去分轉消息,當一個進程發消息給另一個進程時,先發消息到後臺進程,再經過後臺進程將消息轉發到目的進程。DBUS後臺進程充當着一個路由器的角色。html

    DBUS中主要概念爲總線,總線是一種特殊的後臺進程。鏈接到總線的進程可經過總線接收或傳遞消息,總線收到消息時,根據不一樣的消息類型進行不一樣的處理。DBUS中消息分爲四類:架構

    1.  Method call消息:觸發一個函數調用 框架

    2.  Method return消息:觸發函數調用返回的結果函數

    3.  Error消息:觸發的函數調用返回一個異常 spa

    4.  Signal消息:通知,能夠看做爲事件消息.net

1.2  DBUS應用場景

    DBUS提供一種高效的進程間通訊機制,根據DBUS消息類型可知,DBUS主要用於進程間函數調用以及進程間消息廣播。設計

    進程間函數調用htm

    DBUS能夠實現進程間函數調用,進程A發送函數調用的請求(Method call消息),通過總線轉發至進程B,進程B將函數返回值(Method return消息)經過總線返回至進程A。若進程A在函數調用時,總線沒有找到該函數,總線返回錯誤消息(Error消息)給進程A。blog

    消息廣播接口

    進程間消息廣播(Signal消息)不須要響應,接收方須要向總線註冊感興趣的消息類型,當總線接收到「Signal消息」類型的消息時,會將消息轉發至全部但願接收該消息的進程。

1.3  DBUS特色

    DBUS是一種低延遲、低開銷、高可用性的進程間通訊機制。其協議是二進制的,避免序列化的過程,通訊效率較高。DBUS能夠提供一些更高層的功能:

    1.  結構化的名字空間

    2.  獨立於架構的數據格式

    3.  支持消息中的大部分通用數據元素

    4.  帶有異常處理的通用遠程調用接口

    5.  支持廣播類型的通訊

    須要注意的是,DBUS通訊效率雖然很高,但不適合進程間大量數據的傳遞。

2.  實現原理

2.1  DBUS通訊原理

    DBUS是一種高級的IPC機制,通訊流程如圖 2-1所示。在DBUS通訊過程當中,存在一個後臺進程(BUS Daemon Process)。後臺進程和普通進程間信息交互是經過域套接字進行通訊。

圖 2-1 實現原理

    如圖 2-1所示,進程1(Process 1)需先鏈接到總線(dbus_bus_get),其次構造消息(dbus_message_new_signal),而後發送消息(dbus_connection_send)到後臺進程。後臺進程接收消息,而後根據消息類型對消息進行不一樣處理(bus_dispatch_matches)。

    進程2(Process 2)接收消息前須要鏈接到總線,並告知總線本身但願獲得的消息類型(dbus_bus_add_match),而後等待接收消息(dbus_connection_pop_message)。進程2(Process 2)收到總線轉發的消息時會根據消息類型,作不一樣的處理(如果信號類型則不須要發送返回值給總線)。

2.2  SylixOS下替換

    SylixOS有多種進程間通訊方法,能夠實現類DBUS的進程間通訊功能。根據圖 2-1所示DBUS通訊原理,SylixOS下可設計替換方案如圖 2-2所示。

圖 2-2 替換方案

    替換方案需先建立一個後臺進程,負責接收進程發送的消息,根據消息類型進行處理。若接收的消息是信號類型,則依次轉發至其餘進程,若消息類型是函數調用類型,則轉發至目標進程,等待函數調用的返回值。替換方案中進程間通訊經過UDP通訊實現,經過後臺進程的轉發,能夠實現DBUS函數調用以及信號廣播的功能,不一樣進程用不一樣的端口號區分。

    如圖 2-2所示,替換方案中後臺進程功能相似於DBUS中的總線功能,UDP通訊替代域套接字,由此實現類DBUS的進程間通訊功能。

    替換方案中消息類型可分爲:

    1.  請求鏈接消息

    2.  斷開鏈接消息

    3.  信號消息

    4.  函數調用消息

    5.  函數返回值消息

    6.  函數註冊消息

    7.  錯誤消息

    替換方案中需實現類DBUS功能,其中包括:

    1.  進程請求鏈接到後臺進程以及斷開鏈接

    2.  信號發送

    3.  信號接收

    4.  函數調用

    5.  等待函數調用

    6.  提供函數調用

3.  技術實現

3.1  鏈接到後臺進程

    進程間通訊前需鏈接到後臺進程,SylixOS實現替換方案中,須要通訊進程構造消息,向後臺進程發送請求鏈接類型的消息。

    如圖 3-1所示,後臺進程斷定消息爲請求鏈接消息時,把該進程端口號加入到進程管理鏈表中。程序執行結束時,進程須要斷開和後臺進程的鏈接,送請求斷開鏈接的消息至後臺進程,後臺進程把該進程對應的端口號從管理鏈表中刪除。

圖 3-1 請求鏈接、斷開

3.2  信號發送

    DBUS中信號能夠實現一種廣播的機制,進程發送信號前需構造信號類型消息,而後發送至後臺進程,且不須要等待響應消息。

    SylixOS下實現信號發送流程如圖 3-2所示,構造信號類型消息,經過UDP發送至後臺進程。

圖 3-2 信號發送

3.3  信號接收

    當後臺進程接收到信號類型的消息時,遍歷全部已經鏈接到後臺的進程,依次轉發信號,實現信號的廣播功能。

    已經鏈接到後臺的進程需告知本身感興趣的信號,而後等待消息,信號接收流程如圖 3-3所示。

圖 3-3 信號接收

3.4  函數調用

    函數調用同信號相似,進程調用函數前需構造消息,消息包括函數名、函數參數以及本進程端口號。而後發送消息至後臺進程,阻塞等待函數執行的返回值,流程如圖 3-4所示。

圖 3-4 函數調用

    後臺進程接收到函數調用類型的消息時,先檢查該調用函數是否存在,函數存在則轉發該消息至對應提供函數的進程,等待執行結果。若檢查該調用函數不存在,則返回錯誤消息到調用函數的進程。後臺進程處理流程如圖 3-5所示。

圖 3-5 後臺處理函數調用

3.5  等待函數調用

    等待函數調用,需等待調用消息。接收到後臺進程轉發的函數調用消息時,解析消息中的參數,而後執行函數,構造返回消息發送至後臺進程,執行流程如圖 3-6所示。

圖 3-6 等待函數調用

3.6  提供函數調用

    提供函數調用的進程須要把函數註冊到後臺進程,當其餘進程調用函數時,後臺進程會檢查該函數是否存在,若存在則發送消息至目標進程,不然回覆錯誤消息,執行流程如圖 3-7所示。後臺進程接收到該消息,把函數添加到管理鏈表中。

圖 3-7 提供函數調用

4.  小結

    DBUS是一種高效、易用的進程間通訊方式。本文檔介紹了DBUS的通訊原理,以及SylixOS下替換該通訊機制的實現方案。本文以信號收發和函數調用模塊爲框架,介紹了SylixOS下替換DBUS功能具體實現步驟。

5.  參考資料

網上兩篇博客資料:

1. http://blog.csdn.net/eastmoon502136/article/details/10044993

2. http://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html

相關文章
相關標籤/搜索