D-Bus

컴퓨팅에서 D-Bus(데스크톱 버스, "Desktop Bus")는 같은 머신에서 동시에 실행 중인 여러 컴퓨터 프로그램(즉, 프로세스) 간의 통신을 가능케 하는 소프트웨어 버스, 프로세스 간 통신 (IPC), 원격 프로시저 호출 (RPC) 매커니즘이다. D-Bus는 레드햇의 하복 페닝튼이 그놈, KDE 등의 리눅스 데스크톱 환경이 제공하는 서비스들을 표준화하기 위해 발의된, Freedesktop.org 프로젝트의 일부로서 개발되었다.

또, freedesktop.org 프로젝트는 이 사양의 참조 구현체로서 libdbus라는 이름의 자유-오픈 소스 라이브러리를 개발하였다. 이 라이브러리는 D-Bus와는 구별된다. 실제로 다른 구현체의 D-Bus 클라이언트 라이브러리도 존재하는데, 이를테면 GDBus (GNOME), QtDBus (Qt/KDE), dbus-java, sd-bus (systemd의 일부) 등이 있다.

개요 
D-Bus는 원래 소프트웨어 구성 요소 통신 시스템을 대체하기 위해 설계된 IPC 패커니즘으로, 그놈 및 KDE 리눅스 데스크톱 환경(각각 CORBA, DCOP)에 의해 사용된다. 이 데스크톱 환경들의 구성 요소들은 일반적으로 수많은 프로세스에 배포되며, 제각기 몇몇의 서비스(보통은 하나의 서비스)를 제공한다. 이러한 서비스들은 자신들의 태스크를 수행하기 위해 일반적인 클라이언트 애플리케이션에 의해, 또는 데스크톱 환경의 다른 구성 요소들에 의해 사용될 수 있다.

수반되는 프로세스들의 수가 많은 까닭에 이들 간의 1대1 IPC 통신은 비효율적이고 꽤나 미덥지 못한 접근 방식이 된다. 대신, D-Bus는 소프트웨어 버스 추상화를 제공하여 단일 공유 가상 채널을 경유하여 일련의 프로세스들 간의 모든 통신을 수집한다. 버스에 연결된 프로세스들은 내부 구현 방식에 대해 알지 못하지만 D-Bus 사양은 버스에 연결된 모든 프로세스들이 이를 통해 서로 통신할 수 있음을 보증한다.

리눅스 데스크톱 환경은 하나의 버스뿐 아니라 수많은 버스들을 열거함으로써 D-Bus 기능을 활용한다:
 하나의 단일 시스템 버스: 시스템의 모든 사용자와 프로세스에 이용이 가능하며, 시스템 서비스에 대한 접근 권한을 제공한다. (예: 운영 체제와 데몬이 제공하는 서비스들)
 각 사용자 로그인 세션별 세션 버스: 데스크톱 서비스를 동일 데스크톱 세션의 사용자 애플리케이션에 제공하고 하나의 단위로 데스크톱 세션을 허용한다

프로세스가 버스들에 대한 접근 권한이 있다면 프로세스는 수많은 버스들에 연결할 수 있다. 즉, 어떠한 사용자 프로세스라도 시스템 버스와 현재 소속된 세션 버스에 연결할 수 있으나 다른 사용자의 세션 버스, 심지어는 동일 사용자가 소유한 다른 세션 버스에 연결할 수는 없음을 의미한다. 후자의 제한은 나중에 모든 사용자 세션이 하나의 사용자 버스로 병합되는 경우에는 변경될 수 있다.

D-Bus는 정보 공유, 모듈성, 권한 격리 등 애플리케이션에 대한 기존 기능을 추가하거나 단순화한다. 이를테면, 블루투스나 스카이프를 통해 들어온 음성 통화(voice call)의 정보는 현재 실행 중인 음악 플레이어에 의해 전파되고 해석될 수 있으며 통화가 끝날 때까지 음소거하거나 재생을 일시 중지시킴으로써 반응할 수 있다.

또, D-Bus는 각기 다른 사용자 애플리케이션의 구성 요소 연동을 위한 프레임워크로서 사용될 수 있다. 이를테면, 오피스 제품군은 워드 프로세서와 스프레드시트 간 데이터 공유를 위해 세션 버스를 통해 통신할 수 있다.

같이 보기 

 리눅스
 공통 언어 기반
 공통 객체 요구 매개자 구조
 컴포넌트 오브젝트 모델
 분산 컴포넌트 오브젝트 모델
 외부 함수 인터페이스
 자바 원격 함수 호출
 원격 프로시저 호출
 XPCOM

각주

외부 링크 
 D-Bus home page at Freedesktop.org
 D-Bus specification
 Introduction to D-Bus on the Freedesktop.org wiki
 D-Bus Tutorial
 DBus Overview

응용 계층 프로토콜
C++ 라이브러리
Freedesktop.org
프로세스 간 통신
원격 프로시저 호출