首先是我为什么要写这篇文章,有几点原因:其一,市面上能讲清楚Binder的文章很少,而且很多文章会让人看的云里雾里,不知所云;其二,很多同学对这一块也不是很理解,尽管很多人已经工作了很多年。

我特地去查了一下Binder的英文翻译:

Binder机制其实是用于进程间通信的,可以理解为进程之间的粘合剂。

Binder到底是什么?

从机制,模型角度来说:Binder是一种Android中实现跨进程通信(IPC)的方式,用于实现Android中跨进程通信。【Binder机制】

从模型,结构组成来说:Binder是一种虚拟的物理设备驱动,链接Service进程,Client进程和Service Manager进程。【Binder驱动】

从Android代码实现角度来说:Binder是一个类,实现了IBinder接口,是Binder机制的在Android代码中的实现。【Binder类】

本文也将从Binder机制到Binder驱动,再到Binder类来层层深入。

在讲解Binder前,先普及一下linux的一些基础知识:

进程空间划分为用户空间和内核空间,进程之间用户空间的数据不可共享,内核空间数据可以共享。

来看一张图:

进程内用户空间 & 内核空间进行交互需通过 系统调用,主要通过函数:

copy_from_user和copy_to_user。

进程隔离为了保证安全性&独立性,一个进程不能直接操作或者访问另一个进程,即 Android 的进程是相互独立、隔离的。跨进程通信(IPC )即进程间需进行数据交互、通信。
跨进程通信的基本原理:

IPC其中一种方式就是通过共享内存的方式,但是这种方式需要拷贝两次数据,很明显效率低下。而且接受进程也不知道所需要接受的数据大小,不知道需要多大的缓存,一般是开辟尽量大的空间,很明显会浪费空间。

而 Binder 的作用则是:连接两个进程,实现了mmap()系统调用,主要负责创建数据接收的缓存空间 & 管理数据接收缓存 。传统的跨进程通信需拷贝数据2次,但 Binder 机制只需1次,主要是使用到了内存映射。
什么是内存映射?

内存映射在linux操作系统中非常重要,涉及到高效率的跨进程通信和文件操作。

/*** 函数原型*/
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);/*** 具体使用(用户进程调用mmap())* 下述代码即常见了一片大小 = MAP_SIZE的接收缓存区 & 关联到共享对象中(即建立映射)*/mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);/*** 内部原理* 步骤1:创建虚拟内存区域* 步骤2:实现地址映射关系,即:进程的虚拟地址空间 ->> 共享对象* 注: *    a. 此时,该虚拟地址并没有任何数据关联到文件中,仅仅只是建立映射关系*    b. 当其中1个进程对虚拟内存写入数据时,则真正实现了数据的可见*/

Linux系统下,根据内存映射的本质原理 & 特点,其应用场景在于:

  1. 实现内存共享:如 跨进程通信
  2. 提高数据读 / 写效率 :如 文件读 / 写操作

文件读/写操作:

传统linux操作系统文件操作流程:

使用内存映射文件读/写操作:

使用了内存映射的跨进程通信:

Binder跨进程通信的核心原理:

模型原理步骤说明:

深刻理解Binder机制相关推荐

  1. 从mediaserver入手快速理解binder机制(最简单理解binder)

    (一) 概述    Android的binder机制提供一种进程间通信的方法,使一个进程可以以类似远程过程调用的形式调用另一个进程所提供的功能.binder机制在Java环境和C/C++环境都有提供. ...

  2. 深入理解Binder机制4-bindService过程分析

    一.概述 1.1 Binder架构 Android内核基于Linux系统,而Linux系统进程间通信方式有很多,如管道,共g享内存,信号,信号量,消息队列,套接字.而Android为什么要用binde ...

  3. 一文分析Binder机制和AIDL的理解

    为什么要去理解Android的进程间通信机制 对于Android开发工程师来说,如果不去理解进程间通信机制也可以使用系统提供的API完成应用开发,但如果想要达到更高的层级,那么就不能简单只会调用API ...

  4. 理解 Android 的 Binder 机制

    Binder机制的工作流程 1.客户端获取服务端的代理对象(proxy).我们需要明确的是客户端进程并不能直接操作服务端中的方法,如果要操作服务端中的方法,那么有一个可行的解决方法就是在客户端建立一个 ...

  5. aidl使用_借助 AIDL 理解 Android Binder 机制——Binder 来龙去脉

    AIDL 是 Android Interface Definition Language(Android 接口定义语言)的缩写,它是 Android 进程间通信的接口语言.由于 Android 系统的 ...

  6. 理解Android Binder机制(3/3):Java层

    本文是Android Binder机制解析的第三篇,也是最后一篇文章.本文会讲解Binder Framework Java部分的逻辑. Binder机制分析的前面两篇文章,请移步这里: 理解Andro ...

  7. 理解Android Binder机制(1/3):驱动篇

    Binder的实现是比较复杂的,想要完全弄明白是怎么一回事,并不是一件容易的事情. 这里面牵涉到好几个层次,每一层都有一些模块和机制需要理解.这部分内容预计会分为三篇文章来讲解.本文是第一篇,首先会对 ...

  8. 通过配置ssh深刻理解puppet的语法及工作机制

    通过配置ssh深刻理解puppet的语法及工作机制 需求分析 1).要求openssh-server处于被安装状态 2).要求在配置文件/etc/ssh/sshd_config正确的情况下,sshd服 ...

  9. Android之最好理解的Binder机制

    转载:http://weishu.me/2016/01/12/binder-index-for-newer/ Binder学习指南 发表于 2016-01-12   |   92条评论   |   3 ...

  10. 细读《深入理解 Android 内核设计思想》(四)Binder 机制 [中]

    对冗余挑拣重点,对重点深入补充,输出结构清晰的精简版 智能指针 binder 驱动中的结构体 ProcessState IPCThreadState BpBinder BinderProxy Serv ...

最新文章

  1. javascript实现的一个带下拉框功能的文本框
  2. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  3. 数据挖掘具体技术——分类
  4. SAP License:Query传输的相关操作
  5. 飞翔 nyoj195(贪心or 动态)
  6. python opencv 中文路径_解决python cv2.imread 读取中文路径的图片返回为None的问题
  7. SDN 技术介绍整理 学习网站 - (持续更新)
  8. 手机总是显示服务器太忙,手机总提示服务器太忙请稍后重试
  9. WorldFirst如何注册?WorldFirst收款账号注册流程!
  10. CentOS 7中yum安装java
  11. 在vue中_this和this的区别
  12. 机器学习之 各种熵详解
  13. KB,Kb单位换算,网络带宽中的Kbps和KB/s到底是什么意思?
  14. multisim 14.2 添加模型
  15. 编译器工具链(二)——交叉编译
  16. Android 分析ANR和死锁(1)
  17. 高德地图-web端根据地理编码和逆地理编码
  18. t20天正插件5.0怎么安装
  19. cifar10数据读取
  20. opencv 几种不同遍历图像像素的方法详解

热门文章

  1. MATLAB_图形学_形态学课程_5个车牌扣出车牌照片
  2. C语言全局变量和局部变量同名时的使用
  3. windows U盘分区方法
  4. 抛弃手册,开启TongWeb+TongLINK/Q的开发方式
  5. dlib疲劳检测_用Dlib和OpenCV还能做什么?这个开源项目实现了驾驶员疲劳检测
  6. python3爬取网易云歌单数据清洗_网易云音乐爬虫 数据可视化分析
  7. 断面测量数据格式转换
  8. vb6.0企业版id_国网公司十八项反措(2018版)开关设备专题解读
  9. UR5 UR10 ------六自由度机械臂
  10. 【Java3D】Java3D的Demo