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现在还不好说。

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

  1. !!! FAILED BINDER TRANSACTION !!! TransactionTooLargeException

    - ::): !!! FAILED BINDER TRANSACTION !!! xxxRecorder 运行40多分钟,崩溃,捕获日志 03-12 14:50:12.353: E/JavaBinde ...

  2. springCloud的使用07-----消息总线(spring cloud bus)

    spring cloud bus 将分布式的节点用轻量的消息代理连接起来.可用于广播配置文件的更改或服务之间的通讯,也可以用于监控. spring cloud bus 默认只支持rabbitmq和ka ...

  3. 【微服务】- SpringCloud中Config、Bus和Stream

    文章目录 SpringCloud中Config 1.Config的简介 官网 分布式系统面临的问题 config是什么 如何使用 能做什么 与git的配合使用 2.Config服务端的配置和测试 准备 ...

  4. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  5. Binder in Java

    Android在Native层实现了进程间的Binder通信,但是上层应用程序的开发及Framework的实现都是Java,用Java层再实现一次肯定是不合理的,Java可以通过JNI调用Native ...

  6. Binder In Native

    关于Binder的设计思想与Driver层实现细节可以看这个:Android Binder设计与实现 - 设计篇,这里首先简要概括一下. Service的每个Binder实体位于Service所属的进 ...

  7. [转]Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  8. 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)

    关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...

  9. 用C++开发Binder服务

    用C++来实现Binder服务比较麻烦,原因是没有AIDL的辅助,必须手工来写中间的代码. 首先写一个服务类ExampleServer的代码: class ExampleServer : public ...

随机推荐

  1. ASP.NET笔记之 ListView 与 DropDownList的使用(解决杨中科视频中的问题)

    1.Repeater用来显示数据.ListView用来操作数据 InsertItemTemplate和updateItemTemplate**Eval(显示数据)和Bind(双向绑定:不仅是需要展现, ...

  2. 利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽、高等)

    利用FSO取得BMP,JPG,PNG,GIF文件信息(大小,宽.高等) 程序代码 <% ':::BMP, GIF, JPG and PNG ':::This function gets a sp ...

  3. python出现Non-ASCII character '\xe7' in file ex6.py on line 1, but no encoding declare错误

    http://www.cnblogs.com/qi09/archive/2012/02/06/2340712.html python中出现Non-ASCII character '\xe7' in f ...

  4. android开发 锁屏 真正的锁屏,是go锁屏那种。

    想做个锁屏界面很久了,最近一周,历经千辛万苦,越过种种挫折,终于完美实现了这一要求,在此将锁屏思路分享出来. 注意:这不是什么一键锁屏,是类似“go锁屏”那样的锁屏界面. 准备:本程序共需要 两个ac ...

  5. asp:手机扫描二维码跳转手机版

    如果想手机扫描用pc版网站生成的二维码跳转到对应的手机版的话,请在pc端的首页的<head></head>标签里面加入下面内容:   <script src=" ...

  6. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  7. Java实战之02Hibernate-02映射、一级缓存、实体对象状态

    五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...

  8. EL表达式 入门

    为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression L ...

  9. ImageButton如何让图片按比例缩放不被拉伸

    了解 在安卓的界面XML中,ImageButton有这样一个属性android:scaleType,他干嘛的? ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例 ...

  10. mysql 之权限介绍

    转自:http://tech.it168.com/a2010/0114/837/000000837456_all.shtml 一.MySQL授权表概述首先从全局开始,如果全局的是允许的,即在 user ...