D-Bus,kdbus和Binder
http://blog.sina.com.cn/s/blog_4af327e10101irie.html
材料来自:The unveiling of kdbus 和 Kdbus 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的更多相关文章
- !!! FAILED BINDER TRANSACTION !!! TransactionTooLargeException
- ::): !!! FAILED BINDER TRANSACTION !!! xxxRecorder 运行40多分钟,崩溃,捕获日志 03-12 14:50:12.353: E/JavaBinde ...
- springCloud的使用07-----消息总线(spring cloud bus)
spring cloud bus 将分布式的节点用轻量的消息代理连接起来.可用于广播配置文件的更改或服务之间的通讯,也可以用于监控. spring cloud bus 默认只支持rabbitmq和ka ...
- 【微服务】- SpringCloud中Config、Bus和Stream
文章目录 SpringCloud中Config 1.Config的简介 官网 分布式系统面临的问题 config是什么 如何使用 能做什么 与git的配合使用 2.Config服务端的配置和测试 准备 ...
- 笔记:Binder通信机制
TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...
- Binder in Java
Android在Native层实现了进程间的Binder通信,但是上层应用程序的开发及Framework的实现都是Java,用Java层再实现一次肯定是不合理的,Java可以通过JNI调用Native ...
- Binder In Native
关于Binder的设计思想与Driver层实现细节可以看这个:Android Binder设计与实现 - 设计篇,这里首先简要概括一下. Service的每个Binder实体位于Service所属的进 ...
- [转]Android Binder设计与实现 - 设计篇
摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...
- 设备模型(device-model)之平台总线(bus),驱动(driver),设备(device)
关于关于驱动设备模型相关概念请参考<Linux Device Drivers>等相关书籍,和内核源码目录...\Documentation\driver-model 简单来说总线(bus) ...
- 用C++开发Binder服务
用C++来实现Binder服务比较麻烦,原因是没有AIDL的辅助,必须手工来写中间的代码. 首先写一个服务类ExampleServer的代码: class ExampleServer : public ...
随机推荐
- 【MINA】用protobuf做编解码协议
SOCKET协议 支持java serial 与 AMF3的混合协议,目前没有基于xml 与 json的实现. 协议说明: * 9个字节协议头+协议体. * * 协议头1-4字节表示协议长度 =协议体 ...
- C#学习笔记1:正则表达式和数据库连接
1.using System.Text.RegularExpressions; 只有导入该命名空间,才能引入Regex对象,IsMatch是Regex中的一个方法,作用是来判断(输入)内容是否满足正则 ...
- js中的null与undefined
null undefined
- SQL Server调优系列进阶篇 - 深入剖析统计信息
前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...
- sql 更新重复数据只取一条记录
select s.* from ( select *, row_number() over (partition by PersonnelAccount order BY Personnel ...
- C# 打印多页tif
注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...
- 比之前那个版本更简单的C语言实现的比较大小
之前那个是输入一堆数据,找最大那个,这次是更简单的版本,求两个数的最大值. #include "stdafx.h" #include <stdio.h> int Get ...
- 九度OJ 1534 数组中第K小的数字 -- 二分查找
题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...
- 观【史上最牛linux视频教程】整理笔记,持续更新……
//文件处理命令 命令格式:命令 [-参数] [参数] 例:ls -la /etc -a等于--all //目录处理命令:ls 英文原意:list 所在路径:/bin/ls 语法:ls 选项[-ald ...
- jquery鼠标样式
浏览器是有自带的鼠标样式的,如果某些时候为了保持鼠标样式的统一,或者想指定特定的鼠标样式该怎么办呢?那就要使用自定义了,下面有个不错的示例,喜欢的朋友可以参考下 1.浏览器自带的鼠标样式: 2. ...