IPC [Inter-Process Communication] 进程间通信,指至少两个进程或线程间传送数据或信号的一些技术或方法。在Linux/Unix中,提供了许多IPC。Unix七大IPC:
Pipe:无名管道,最基本的IPC,单向通信,仅在父/子进程之间,也就是将一个程序的输出直接交给另一个程序的输入。常见使用为 ps -ef|grep xxx
FIFO [(First in, First out)] 或 有名管道(named pipe):与Pipe不同,FIFO可以让两个不相关的进程可以使用FIFO。单向。
Socket 和 Unix Domain Socket:socket和Unix套接字,双向。适用于网络通信,但也可以在本地使用。适用于不同的协议。
消息队列 Message Queue: SysV 消息队列、POSIX 消息队列。
Signal: 信号,是发送到正在运行的进程通知以触发其事件的特定行为,是IPC的一种有限形式。
Semaphore:信号量,通常用于IPC或同一进程内的线程间通信。他们之间使用队列进行消息传递、控制或内容的传递。(常见SysV 信号量、POSIX 信号量)
Shared memory:(常见SysV 共享内存、POSIX 共享内存)。共享内存,是在进程(程序)之间传递数据的有效方式,目的是在其之间提供通信。
每种IPC都有不通的特点,每种方式对资源的使用及性能都是不通的
管道 I/O是最快的,但为单向通信,需要工作在 父/子 进程关系之间。
UNIX 套接字可以在本地连接不同的进程,并且具有更高的带宽,并且没有固有的消息边界。
TCP/IP套接字可以连接任何进程。并且可以通过网络连接,但是对资源会有更多的开销,同样的没有固定的消息边界。
Reference
comparsion Unix/Linux IPC
What is D-Bus提到,D-Bus就不能不提一下freedesktop,而 D-Bus 仅仅作为freedesktop.org的一部分。
D-Bus 桌面总线 (Desktop Bus),的简写,也是Linux- IPC机制,不同于Unix 7大基础IPC的是,D-Bus是在这些IPC类型之上实现的中间件IPC,D-Bus使用了基础IPC中一种过多种,其设计的目的是在Linux桌面环境,提供服务的标准化。但目前并没有合入主线内核中。
作为中间件IPC,D-Bus的性能较低与其他IPC模式,因为在通信过程中会进行很多上下文切换,如果通过Dbus来发送消息,会先将其发送到内核,然后将其送回D-Bus。AF_BUS 补丁是新的套接字类型,用来减少D-Bus上下文的切换。
更多可参考:https://en.wikipedia.org/wiki/D-Bus
D-Bus组成D-Bus是 一个IPC的实现方式,在架构上分位三层。
Layer 1 libdbus:freedesktop机构提供的一个免费开源的一个由C语言编写的 low-level API 。是提供dbus功能的库。是高级API绑定的低级API。
Layer 2 dbus daemon:dbus实现的IPC守护进行,随Linux启动,通过不通进程对其的连接,实现了多进程间消息的路由(包含内核、网络、桌面等)
Layer 3 Wapper libraries (high-level API): 对 low-level API libdbus的封装 ,例如 libdbus-qt libdbus-python github.com/godbus/dbus,这些不同编程语言实现的Wapper是不同开发者应该使用的lib,其简化了D-Bus的开发难度。
Reference
dbus-tutorial
dbus 基本概念 总线在 D-Bus 中,bus是一个核心概念。它是应用程序可以进行方法调用、发送信号和侦听信号的通道。有两种预定义的bus:会话总线和系统总线。
会话总线(Session Bus):普通进程创建,可同时存在多条。会话总线属于某个进程私有,它用于进程间传递消息。
系统总线(System Bus):在引导时就会启动,它由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。当然,如果一个应用程序需要接受来自系统总线的消息,他也可以直接连接到系统总线中,但是他能发送的消息是受限的。系统总线最常见的用途是在系统范围事件发生时发送系统范围的通知。添加新的存储设备、网络连接更改事件和关闭相关事件都是系统总线何时更适合通信总线的示例。
通常情况下只存在一个System Bus,但可以存在多个Session Bus(每个桌面会话一个)。
总线以dbus-daemon的形式存在与系统中,该进程专门将消息从一个进程传递到另一个进程。该守护进程还将向总线上的所有应用程序转发通知。
bus name总线名称 Bus Name,不能单单以字面意思 总线名称 来理解,官方对其解释为:Connections have one or more bus names associated with them. A connection has exactly one bus name that is a unique connection name.,可以出bus name其实是用来连接名称。主要是用来标识一个应用和消息总线的连接。总线名称主要分为两类:唯一名称与公共名称。