文章目录

  • 前言
  • 一、Binder是什么?
  • 二、传统IPC通信方式
  • 三、Binder的优点
  • 四、内存映射
  • 五、一次完整的Binder通信流程
  • 六、Binder通讯模型

前言

Binder,一个非常神奇的东西,普通开发过程中可能感觉根本见不到它的身影,但其实无处不在,例如contentProvider就是通过Binder实现


一、Binder是什么?

Binder,一个通过内存映射实现跨进程通信的东东,Android中一个进程空间分为用户空间内核空间,其中用户空间数据不可共享,内核空间数据可共享。
因此跨进程通信需要内核空间的支持,传统IPC通信例如管道,Socket等,它们是内核空间的一部分,可以直接拷贝,通过内容提供者进程copy_from_user()拷贝到内核空间,再通过copy_to_user()复制给内容接收方用户空间,实现的进程间通信。
但是Binder不属于Linux内核空间,不能直接进行内核空间的两次拷贝,所以需要借助Linux的动态内核可加载模块机制。

二、传统IPC通信方式

Linux现有的进程通信手段有以下几种:

  1. 管道:在创建时分配一个page大小的内存,缓存区大小比较有限; 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  2. 共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  3. 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
  4. 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段;
  5. 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

三、Binder的优点

既然有现有的IPC方式,为什么重新设计一套Binder机制呢。主要是出于以上三个方面的考量:

  • 高性能:从数据拷贝次数来看Binder只需要进行一次内存拷贝,而管道、消息队列、Socket都需要两次,共享内存不需要拷贝,Binder的性能仅次于共享内存。
  • 稳定性:上面说到共享内存的性能优于Binder,那为什么不适用共享内存呢,因为共享内存需要处理并发同步问题,控制负责,容易出现死锁和资源竞争,稳定性较差。而Binder基于C/S架构,客户端与服务端彼此独立,稳定性较好。
  • 安全性:我们知道Android为每个应用分配了UID,用来作为鉴别进程的重要标志,Android内部也依赖这个UID进行权限管理,包括6.0以前的固定权限和6.0以后的动态权限,传荣IPC只能由用户在数据包里填入UID/PID,这个标记完全是在用户空间控制的,没有放在内核空间,因此有被恶意篡改的可能,因此Binder的安全性更高。

四、内存映射

Binder涉及的内存映射通过mmap()实现,内存映射简单的讲,就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反映到内核空间,反之内核空间对这段区域的修改也能直接反映到用户空间。

五、一次完整的Binder通信流程

一次完整的Binder通信过程主要如下:

  • 首先Binder驱动在内核空间创建一个数据接收缓存区
  • 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区间的映射关系,并且建立内核中数据接收缓存区和接收进程用户空间地址的映射关系
  • 发送方通过copy_from_user()将数据拷贝到内核空间中的内核缓存区,由于建立了内存映射,就相当于把数据拷贝给了接收进程的用户空间,这样就完成了一次进程间的数据通信

完整的流程图如下(图片来源):

六、Binder通讯模型

Binder是基于C/S架构的,其中定义了4个模型:Client、Server、Binder驱动、ServiceManager

  • Binder驱动,负责将Client请求转发到具体的Server中处理,并将Server返回数据发送给Client,是Client、Server、serviceManager的中间人
  • ServiceManager,管理Server的注册与查询,负责将Client请求的Binder描述符转化为具体的Server地址,以便Binder驱动能转发给具体的Server
  • Server向serviceManager注册,Server通过Binder驱动向serviceManager申请注册,声明可以对外提供的服务;serviceManager中保留一份映射表
  • Client向ServiceManager请求Server的Binder引用;Client想要请求Server数据时,先要通过Binder驱动向serviceManager请求server的Binder引用
  • 向具体的server发送请求;Client拿到Binder的代理对象后,就可以通过Binder驱动,和具体的Server进行通信了
  • Server返回结果;Server响应请求后,需要通过Binder驱动再次将结果返回给Client
  • 注意Binder驱动 & ServiceManager进程 属于Android基础架构(即系统已经实现好了);而Client 进程Server 进程 属于Android应用层(需要开发者自己实现)

流程图如下(图片来源):

Binder到底是什么鬼东西相关推荐

  1. CTF---Web入门第一题 what a fuck!这是什么鬼东西?

    what a fuck!这是什么鬼东西?分值:10 来源: DUTCTF 难度:易 参与人数:7942人 Get Flag:3358人 答题人数:3475人 解题通过率:97% what a fuck ...

  2. Binder相关面试总结(二):Binder到底是什么?

    Binder单从字面上理解,它有活页夹,粘合剂的意思,活页夹可以用来把两个东西夹在一起.在我们的Android系统中,Binder主要用来实现进程之间的通信(IPC),它的主要作用就是把多个App夹在 ...

  3. 蛇哥开局两星机器人视频_7人口两星死歌?真脸白欧皇!蛇哥:这是什么鬼东西!...

    原标题:7人口两星死歌?真脸白欧皇!蛇哥:这是什么鬼东西! 在云顶之弈当中,死歌的强大是不需要被质疑的,还记得在远古版本的六法玩法中,死歌的一个死亡吟唱,可以使得全图的敌人全部阵亡,虽然如今死歌也被削 ...

  4. #Geek Talk# 庄明浩:直播到底是什么鬼?

    以下内容是基于 2016年4月14日 Geek Talk 录音整理 #Geek Talk# 016 直播到底是什么鬼? 主持人:非常荣幸请到庄老师,庄老师一般在北京出差都是当天来回的,为了今天的Gee ...

  5. ng build command not found(ng命令到底是什么鬼)

    为了编译坑爹的flink,猜了好久,这个ng到底是什么鬼? 从apt install ng-common到nginx都不是 最后发现原来是Angular的命令 sudo npm install -g ...

  6. DevOps到底是什么鬼?DevOps介绍及工具推荐

    转载自 DevOps到底是什么鬼?DevOps介绍及工具推荐 什么是DevOps DevOps是Development和Operations的组合,是一组过程.方法与系统的统称,用于促进开发(应用程序 ...

  7. euv光刻机有什么用_EUV到底是什么东西?光刻机上为何频频提到EUV

    原标题:EUV到底是什么东西?光刻机上为何频频提到EUV 光刻机是目前半导体芯片行业的核心设备,其技术含量.价值含量极高.光刻机设备涉及到系统集成.精密光学.精密运动.精密物料传输.高精度微环境控制等 ...

  8. rtx2060什么水平_我的GAMING之路 篇八:光追到底是什么鬼?—微星VENTUS RTX2060评测...

    我的GAMING之路 篇八:光追到底是什么鬼?-微星VENTUS RTX2060评测 2019-03-01 17:26:04 10点赞 22收藏 18评论 一.光追甜品 随着硬件的发展遇到瓶颈,缺乏了 ...

  9. mysql里hdr是什么的缩写_4kHDR是什么意思(4K HDR到底是什么鬼?)

    随着电视行业飞快的发展,各种成像技术和制作工艺都满含黑科技.甚至乎刚刚才了解完一种电视的新技术,然后隔天又有更新的技术运用在电视上面了.还记得以前电视的迭代一般都5-7年甚至更久,而现在处于一个属于科 ...

最新文章

  1. 华为轮值主席鸿蒙,鸿蒙2.0已开源 华为轮值董事长:今年至少3亿设备搭载鸿蒙系统...
  2. VTK:Utilities之GetDataRoot
  3. 05,pytorch_手写数字案例
  4. selenium java session_Selenium Java浏览器会话重用
  5. PyTorch实战福利从入门到精通之七——卷积神经网络(LeNet)
  6. 《Java程序员职场全攻略:从小工到专家》连载十五:我们不是爱加班
  7. 任正非谈鸿蒙系统06 新闻,任正非首谈华为鸿蒙操作系统:很有可能比安卓和苹果还要快!...
  8. 关于webuploader 在ie9上不能触发 input 的 change 事件
  9. Python 03-pyc、数据类型
  10. atitit .大数据的方法,技术.attilax总结 大数据包含哪些方面 v5 s09..docx 7. 三大核心技术:拿数据,处理转换,算数据 2 8. 大数据有5个部分。数据采集,数据存储,
  11. 12个优秀的 HTML5 网站设计案例欣赏
  12. 前台CSS颜色代码大全
  13. JavaScript截取分割字符串
  14. 网易云音乐服务器code521,网易云音乐显示scode502原因及解决办法_专题_53货源网...
  15. conda 查看现有虚拟环境 - 删除现有虚拟环境
  16. 如何恢复扩展属性为u的linux文件,chattr - 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性...
  17. 转载 测试开发岗--高频知识整理
  18. 一个简单的loding
  19. 最新最全论文合集——纵向联邦学习
  20. 微信小程序实现跳转到另外一个小程序的方法

热门文章

  1. 2021年10月视频行业用户洞察:平台积极拥抱变革探索新机遇
  2. Flutter 本地化l10n(多语言i18n)的支持
  3. ActiveMQ集群架构与原理解析
  4. 高通MSM8909 CAMERA TUNING 基础 ------ super Good
  5. 快学Big Data--Linux(八)
  6. 密码存储之PyQt5知识点储备
  7. String 字符串之遍历字符串
  8. Context.managedQuery()和context.getContentResolver()获取Cursor关闭注意事项
  9. 分享一下自己的收藏的网页资源
  10. pdf编辑器软件,分享一款考编用的pdf软件,挺合适的!