D-Bus,kdbus和Binder

http://blog.sina.com.cn/s/blog_4af327e10101irie.html

材料来自:The unveiling of kdbusKdbus Details 。后一篇文章里很多链接的内容也很有价值。

D-Bus的优缺点

Linux没有一个很好的IPC机制。Windows、Mac
OS有;Android也有"binder"子系统。Linux有socket、FIFO、共享内存等机制,这些对于应用层来说不是很好。Kdbus试图为Linux创建一个和其它系统相仿的机制。

D-Bus是Linux上最接近这个标准的方案。优点:提供不错的事务处理机制(支持发送消息并等待回应)和给其它子系统发送信号;可以知晓D-Bus上
还有哪些子系统在运作、提供哪些服务等。D-Bus还提供对安全策略的支持、在初次使用是启动服务、数据结构的类型安全组织、在总线上传递凭据和文件描述
符。此外,很多编程语言有D-Bus的绑定接口,还有网络传输透明等。

缺限:D-Bus适合于控制任务,但并不适合传输大量的数据。例如,D-Bus能通知音频服务程序改变音量(D-Bus著名的例子,呵呵),却不适合传送
音频数据。因为D-Bus在用户空间实现,效率很低:一个调用-返回消息需要10次消息拷贝,4次消息验证,4次上下文切换。此外,凭据传递能力有限,消
息没有时间戳,boot时D-Bus不可用(此时D-Bus还没启动),和安全框架(如SELinux)的连接在用户空间,激活服务时可能有竞态条件等。
D-Bus在实现上也过于复杂,且严重依赖于XML。

移入内核

kdbus是在内核里实现D-Bus。可传输大块数据,用于GB级的消息流。可以做到消息传递的零拷贝,在最坏情况下,一条消息及其回复过程不超过2次拷
贝操作,2次验证,2次上下文切换。全部的凭据信息(用户ID,进程ID,SELinux标签,cgroup信息,权限等)随每个消息传递,而且所有消息
都有时间戳。kdbus随时可用,不需要等待D-Bus守护进程启动,Linux安全模块可以直接与其挂钩,可避免竞态条件,API也得到简化。

kdbus在内核中作为一个字符设备;要连接的进程open设备,再调用mmap()将一个消息传递区域映射到自己的地址空间。消息在这个区域组装后交给
内核传输;内核简单地将消息从一个进程映射的区域拷贝到另一个进程的区域。消息可以携带对收到回复的时间限制(“方法调用窗口”)。有一个和D-Bus类
似的名字记录表。

kdbus通过memfd机制实现消息传递的零拷贝。memfd是一块带有文件描述符的内存区域,有点类似于内存映射的临时文件(差别其实很大)。一个
memfd可以被“密封”——拥有它的进程不能再改变其内容。要传递一条消息,进程先在memfd区域构造消息,密封,然后交给kdbus传输。内核可以
把相应的内存页面映射到接收进程的地址空间,从而避免拷贝数据,这取决于消息的大小。消息比较小时(大约512KB以下)内存映射的开销比较大,这时是直
接拷贝数据。

信号广播机制采用Bloom过滤器来选择接受者。这一改动提高了广播机制的效率。

目前计划是在2014年把代码合并到内核的主干上。不过此前两次把D-Bus功能移入内核的努力失败了,这次也不能保证成功(看上去希望很大,Redhat已经在systemd里采用了kdbus)。

kdbus和binder的差别——CPU中心和RAM中心

binder在Android中提供从一个任务到另一个任务里的线程的同步调用(CPU)。这个过程中调用线程挂起直到应答线程返回,不需要消息队列。
RAM只是用来在不同的调用者间共享数据。Android里binder库的关键是调用进程把自己的CPU时间片让给应答进程。这就像mutex系统调
用。相互通信的进程之间有直接的联系。在系统里能同时使用binder的进程数有个上限,大部分系统估计在16个左右。

D-Bus是异步的,它把消息有序排入队列(RAM),接收者从队列里取消息。CPU的任务是在RAM里搬运数据。这类似于网络通信协议。属于进程间“无连接”的通信方式。其上限大约是每个连接8Mb,一个消息通常在200-800字节。

Binder是为微内核类设备创建的。功能有限,缺乏灵活性,但开销低、速度快。Binder保证CPU时间片从调用进程传给被调用进程的线程,工作完成后再返回给调用进程。其中几乎不需要进程调度,非常适合RAM和CPU配置很低的设备。

D-Bus是创建-存储-转发,构建回复,再创建-存储-转发的消息模型。比bind复杂得多,也更灵活、通用、网络透明、易于管理,且可以容易的管理不
被信任的对端参加的通信(不要让binder面对这种情况,否则...)D-Bus可以处理大块的数据,在kdbus实现里可以将GB级别的数据传送给总
线上的每个连接。从CPU的角度看,D-Bus没有biander有效率,但是通用性更好。

在D-Bus里可以实现类似binder的功能。D-Bus以后是否会替代binder现在还不好说。

时间: 2024-08-15 12:10:46

D-Bus,kdbus和Binder的相关文章

Kdbus Details

转发自: http://www.kroah.com/log/blog/2014/01/15/kdbus-details/ dbus一直有不适合传输大数据的问题,但是没有去改进, 还是binder先有的改进, 然后 dbus再开始追随. Now that linux.conf.au is over, there has been a bunch of information running around about the status of kdbus and the integration o

为什么Android要采用Binder作为IPC机制?

作者:Gityuan链接:https://www.zhihu.com/question/39440766/answer/89210950来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 在开始回答 前,先简单概括性地说说Linux现有的所有进程间IPC方式: 1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限:2. 消息队列:信息复制两次,额外的CPU消耗:不合适频繁或信息量大的通信:3. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,

Bus System 【dijkstra算法】

Because of the huge population of China, public transportation is very important. Bus is an important transportation method in traditional public transportation system. And it's still playing an important role even now.The bus system of City X is qui

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

hdu 5163 Taking Bus(模拟)

hdu 5163 Taking Bus 问题描述 Bestland有一条非常长的马路,马路上设有n个公交汽车站.公交汽车站从左到右标号为1到n.有m个人想要乘公交.你的任务是找出每个人到终点为止所需要的时间.注意:你需要用来解决这道题目的信息在Input里面,请仔细阅读. 输入描述 输入的第一行包含一个整数T (1≤T≤60),表示测试数据的组数.对于每组测试数据:第一行包含两个整数n和m (2≤n,m≤105),表示公交车站的数目和乘客的数目. 接下来一行包含n?1个整数, d1,d2,-,d

Binder的工作机制浅析

在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. 一.在Android Studio中建立AIDL 首先,我们需要建立一个AIDL 1.在建立了对应的实现Parcelable接口的实体类和AIDL接口后,文件结构如下: 2.点击clean Project/reBuild Project,出现如下错误:提示无法找到Book实体类. 3.解决方案 这

转:轻松理解 Android Binder,只需要读这一篇

转自http://www.jianshu.com/p/bdef9e3178c9 在 Android 系统中,Binder 起着非常重要的作用,它是整个系统 IPC 的基石.网上已经有很多文章讲述 Binder 的原理,有的讲的比较浅显,没有触及到关键,有的讲的太过于深入底层,难以理解,本文会比较全面,以一个比较轻松的方式,从面到点,大处着眼,小处着手的形式去讲述 Binder 在 Android 中是如何使用的.理解 Binder 的基本原理,对学习 Android 也有很大的帮助,很多问题也能

Android 中基于 Binder的进程间通信

摘要:对  Binder 工作机制进行了分析. 首先简述 Android 中 Binder 机制与传统的 Linux 进程间的通信比较,接着对基于 Binder 进程间通信的过程分析 最后结合开发实例 (AIDL),了解 基于 Binder的进程间通信. 1.Android 采用 Binder 作为 IPC (Internet Process Connection) 机制的优势     Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道

对Binder的浅显分析及AIDL的使用

通常情况下,作为一个android开发者不会直接接触到Binder,但Binder作为ipc机制最关键的一个环节,我们很有必要去了解他.其实在不知不觉中,大家肯定和Binder打过交道,比如我们bindService的时候,客户端会获取到一个远程服务器发送回来的Binder对象,通过操作这个对象我们可以获取服务端的数据或者执行某些服务端的操作.再比如,我么在获取各种系统服务的时候,Binder是作为serviceManager连接各种manager(windowManager.....)的桥梁.