D-Bus

D-Bus是一个行程间通信远程过程调用机制,可以让多个不同的计算机进程(即行程)在同一台电脑上同时进行通信[4]。D-Bus作为freedesktop.org项目的一部份,其设计目的是使Linux桌面环境(如GNOMEKDE等)提供的服务标准化。

D-Bus
开发者红帽公司及社群
当前版本
  • 1.14.10 (2023年9月1日;稳定版本)[1]
  • 1.15.8 (2023年8月21日;不稳定版)[2]
源代码库
编程语言C
操作系统跨平台
类型
许可协议GNU通用公共许可证第二版或更新,或是AFL 2.1[3]
网站www.freedesktop.org/wiki/Software/dbus

freedesktop.org项目同时也开发了一个称为libdbus的自由及开放源代码软件函数库,作为规范的参考实作。这个函数库常与D-Bus本身混淆。也存在着其他的D-Bus实作,像是GDBus (GNOME)[5],QtDBus (Qt/KDE)[6],dbus-java[7]以及sd-bus(systemd的一部份)[8]

概观

没有D-Bus时进程间的通信
没有D-Bus时进程间的通信
使用D-Bus时进程间的通信
使用D-Bus时进程间的通信
没有D-Bus时,如果大量的进程需要彼此进行通信,其通信网络将会非常复杂及庞大(因为大部分进程使用一对一通信)。使用D-Bus则可以简化通信网络。

D-Bus可用于同一个桌面会话中不同桌面应用软件间的通信,能集成桌面会话,也解决了行程的生命周期的问题。它也允许桌面会话与操作系统间的通信,这通常包括了内核与任何的系统守护进程或一般行程间的通信。

当大量的进程进行通信时,由于进程跟进程之间必须创建起一对一的通信,则整体的通信网络将会非常复杂,而通信效率也会因此低下不可靠。D-Bus提供了一个软件汇流抽象层,能够汇整所有的消息到一个虚拟的通信频道[4]。连接到D-Bus的进程无法也无需知道D-Bus是如何实做,但是只要遵从D-Bus的标准,就能保证所有连接到D-Bus的进程能进行彼此间的交流。换句话说,D-Bus是一个消息总线系统,即行程间通信的媒介,让应用程序间可以通信并交换消息。因此,D-Bus为应用程序增加新的功能,简化已有功能,包含信息分享、模块化及权限分离。例如通过蓝牙Skype所接收到的通话可以传播到任何目前运行中的音乐播放器,并可使其静音或暂停播放,直到通话结束[9]

大多数的系统会实作一个具较高权限的系统频道,连同给每一个已登录的用户的专用频道,这就可以让D-Bus中可用的登录信息受到限制。因此,D-Bus服务同时包含了系统守护行程(给像是「添加硬件设备」或是「打印机队列变更」等事件使用)以及一个给每个用户的登录会话(给这个用户启动的行程间的一般通信使用)使用的独有守护进程。应用程序通过Unix域套接字与守护行程通信。消息总线是建基于通用的一对一消息传递框架,这让任意两个程序间可以不必通过消息总线守护行程而直接通信[10]

内部

dbus-daemon在现代的Linux图形化桌面环境中扮演相当重要的角色。上面同时也有出现的Binder则是在Android上的等价软件。

D-Bus有三个抽象层[9]

  • libdbus —— 让两个应用程序可以互相链接并交换消息的函数库
  • dbus-daemon —— 消息总线的可运行档,建基于libdbus,可链接到多个应用程序。这个守护行程可以将消息按特定路径转送给零个或更多个应用程序,从而实作发布/订阅模式。
  • 基于特定应用程序框架的封装函数库

接收到消息的D-Bus连接会被转送到一个特定的对象,而非行程。因此,客户端只知道它们是与对象交互,但并不知道另一侧是否真的有对象。

D-Bus为每个对象定义了一个名称,其看起来像是POSIX文件系统路径,但实际上并不是,例如/org/kde/kspread/sheets/3/cells/4/5。D-Bus对象的名称通常会使用命名空间以协助独立开发代码模块[11]。命名空间一般会以开发者的保留域名组件作为前缀(例如/org/kde)。

采用

KDE第二版与第三版使用的DCOP系统对D-Bus有深刻影响,后者在KDE 4中取代了前者。D-Bus的实作支持大多数的POSIX操作系统,也有一个Windows的移植。它也在Qt 4、GNOMEXfce中使用。在GNOME中,它已逐渐取代了早期的Bonobo机制。

D-Bus最初用于桌面环境,后来使用范围逐渐扩展,包含的系统服务越来越多。例如NetworkManager网络守护行程、BlueZ蓝牙堆栈及PulseAudio音频服务器都使用D-Bus来提供其部份或全部的服务,systemd也正促使传统的系统守护行程(如logind)转换到D-Bus服务。

它也用于AllJoyn协定在家庭自动化中的导线协定,为AllJoyn加入了探索、工作阶段管理、安全、标头压缩、嵌入式设备支持[12]

实作

libdbus
虽然已经有多个D-Bus的实作,但其中使用最广泛的参考实作是libdbus,开发者就是设计规范的freedesktop.org项目。不过libdbus是一个低级的实作,并不会直接被应用程序开发者所使用,但是可作为其他D-Bus实作(像是包含在桌面环境的标准函数库中或是在编程语言绑扎中的实作)的参考指南。freedesktop.org项目自身建议应用程序的作者「使用较高端的绑扎或是实作」来替代[13]
因为libdbus是最常被使用的D-Bus实作,术语"D-Bus"与"libdbus"经常互换使用,导致了混乱。
GDBus
GDBus[5]是一个基于包含在GLib中的GIO串流的D-Bus实作,其致力于让GTK+GNOME使用。GDBus并不是libdbus的封装,而是一个完整且独立的D-Bus规范与协定的重新实作[14]
QtDBus
QtDBus[6]是一个自4.2版开始,包含于Qt函数库的D-Bus实作。这个组件也被KDE的应用程序、函数库及组件用于访问在系统中所提供的D-Bus服务。
sd-bus
2013年时,systemd项目重写了libdbus,并努力简化代码[15],它也使得D-Bus的整体性能有所提升。在先前的测试中,BMW发现systemd的D-Bus函数库性能增长了360%[16]。 而到了221版本的systemd,sd-bus的应用进程接口英语:)已被声明为稳定[17]
kdbus
另外还有一个积极开发中的项目,称为kdbus,其致力于重新实作D-Bus为内核中介的点对点行程间通信机制。除了性能的提升,kdbus也受益于已经存在的Linux内核特性,像是命名空间、审核机制[18][19]、内核传递的安全特性、终止竞争条件等,并让D-Bus可以在开机与关机时使用(此时需要systemd)[20]。但kdbus在Linux内核的特性中造成了不寻常的争议[21],是以截至2015年6月 (2015-06)都尚未被合并[22]
语言绑扎
已经有多个编程语言的D-Bus绑扎被开发出来[23],像是 JavaC♯Ruby以及Python等的绑扎均已存在。

参见

参考数据

  1. .
  2. .
  3. havoc. . Havoc's Blog. 2007-07-17 [2015-08-27]. (原始内容存档于2015-09-07).
  4. Cocagne, Tom. . pythonhosted.org. [2015-05-23]. (原始内容存档于2015-06-08).
  5. . GNOME developer. GNOME project. [2015-01-04]. (原始内容存档于2015-01-05).
  6. . Qt项目. Qt项目. [2015-06-01]. (原始内容存档于2015-05-06).
  7. . FreeDesktop.org. [2015-01-04]. (原始内容存档于2014-12-23).
  8. . 2015-06-19 [2015-06-20]. (原始内容存档于2015-06-22).
  9. Robert Love. . Linux Journal. 2005-01-05 [2014-10-14]. (原始内容存档于2014-10-20).
  10. . freedesktop.org. 2014-01-20 [2014-10-14]. (原始内容存档于2014-10-18).
  11. . [2015-08-28]. (原始内容存档于2015-08-28).
  12. . Allseen Alliance. 2013-12-11 [2015-08-27]. (原始内容存档于2015-07-21).
  13. . FreeDesktop.org. [2015-01-05]. (原始内容存档于2015-01-05).
  14. . GNOME Developer. [2015-06-16]. (原始内容存档于2015-09-06).
  15. Poettering, Lennart. . systemd-devel mailing list. [2015-04-24]. (原始内容存档于2019-06-24).
  16. . LWN.net. 2013-05-30 [2013-11-13]. (原始内容存档于2013-11-13).
  17. . freedesktop.org. 2015-06-19 [2015-06-20]. (原始内容存档于2015-06-20).
  18. Jake Edge. . LWN.net. 2013-05-30 [2014-04-11]. (原始内容存档于2014-04-09).
  19. Jonathan Corbet. . LWN.net. 2014-01-13 [2014-04-11]. (原始内容存档于2014-04-09).
  20. Greg Kroah-Hartman. . 2015-04-13 [2015-08-28]. (原始内容存档于2015-07-01).
  21. Corbet, Jonathan. . LWN.Net. [2015-06-29]. (原始内容存档于2015-06-24).
  22. Michael Larabel. . Phoronix. 2015-04-26 [2015-08-28]. (原始内容存档于2015-09-05).
  23. . FreeDesktop.org. [2015-01-05]. (原始内容存档于2014-12-24).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.