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

1.  概述

1.1  DBUS概述

    DBUS是一种高级的进程间通信机制。DBUS支持进程间一对一和多对多的对等通信,在多对多的通讯时,需要DBUS后台进程的角色去分转消息,当一个进程发消息给另外一个进程时,先发消息到后台进程,再通过后台进程将消息转发到目的进程。DBUS后台进程充当着一个路由器的角色。

    DBUS中主要概念为总线,总线是一种特殊的后台进程。连接到总线的进程可通过总线接收或传递消息,总线收到消息时,根据不同的消息类型进行不同的处理。DBUS中消息分为四类:

    1.  Method call消息:触发一个函数调用 

    2.  Method return消息:触发函数调用返回的结果

    3.  Error消息:触发的函数调用返回一个异常 

    4.  Signal消息:通知,可以看作为事件消息

1.2  DBUS应用场景

    DBUS提供一种高效的进程间通信机制,根据DBUS消息类型可知,DBUS主要用于进程间函数调用以及进程间消息广播。

    进程间函数调用

    DBUS可以实现进程间函数调用,进程A发送函数调用的请求(Method call消息),经过总线转发至进程B,进程B将函数返回值(Method return消息)通过总线返回至进程A。若进程A在函数调用时,总线没有找到该函数,总线返回错误消息(Error消息)给进程A。

    消息广播

    进程间消息广播(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

 

 

转载于:https://my.oschina.net/u/3248596/blog/857940

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值