D-Bus

D-Bus是一個行程間通訊远程过程调用機制,可以讓多個不同的计算机程序(即行程)在同一臺電腦上同時進行通訊[4]。D-Bus作為freedesktop.org專案的一部份,其設計目的是使Linux桌面环境(如GNOMEKDE等)提供的服務標準化。

D-Bus
開發者紅帽公司及社群
穩定版本
1.12.20[1]
(2020年7月2日2020-07-02
預覽版本
1.13.18[2]
(2020年7月2日2020-07-02
源代码库
编程语言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提供了一個軟體匯流抽象層,能夠匯整所有的訊息到一個虛擬的通訊頻道[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. Simon McVittie. . 2020-07-02 [2020-07-02]. (原始内容存档于2020-08-19).
  2. Simon McVittie. . 2020-07-02 [2020-07-02]. (原始内容存档于2020-08-19).
  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.