1 Binder介绍
粘合剂,意思为粘合了两个不同的进程。
- Binder机制模型:Binder是Android中的跨进程通信(IPC)方式
- 虚拟的物理设备驱动:Binder驱动:连接Client进程、Server进程、ServiceManager进程
- Binder类:实现IBinder接口
2 知识储备
2.1 进程空间划分
一个进程空间分为 用户空间 & 内核空间(Kernel),用户空间不可共享,内核空间可共享(所有进程共用1个内核空间)
进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
- copy_from_user():将用户空间的数据拷贝到内核空间
- copy_to_user():将内核空间的数据拷贝到用户空间
2.2 进程隔离 & 跨进程通信( IPC )
进程隔离
为了保证 安全性 & 独立性,一个进程 不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的
跨进程通信( IPC )
即进程间需进行数据交互、通信
跨进程通信的基本原理

- Binder的作用则是:连接 两个进程,实现了
mmap()系统调用,主要负责 创建数据接收的缓存空间 & 管理数据接收缓存- 注:传统的跨进程通信需拷贝数据2次,但Binder机制只需1次,主要是使用到了内存映射,具体下面会详细说明
2.3 内存映射
关联 进程中的1个虚拟内存区域 & 1个磁盘上的对象,使得二者存在映射关系
在多个进程的虚拟内存区域 已和同1个共享对象 建立映射关系的前提下
若 其中1个进程对该虚拟区域进行写操作
那么,对于 也把该共享对象映射到其自身虚拟内存区域的进程 也是可见的
/**
* 函数原型
*/
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个进程对虚拟内存写入数据时,则真正实现了数据的可见
*/
内存映射的特点:
- 提高数据的读、写 & 传输的时间性能
- 减少了数据拷贝次数
- 用户空间 & 内核空间的高效交互(通过映射的区域 直接交互)
- 用内存读写 代替 I/O读写
- 提高内存利用率:通过虚拟内存 & 共享对象
应用场景:
- 实现内存共享:如 跨进程通信
- 提高数据读 / 写效率 :如 文件读 / 写操作
3 Binder 跨进程通信机制 模型
3.1 模型原理图
Binder 跨进程通信机制 模型 基于 Client - Server 模式

各角色说明:

3.2 Binder驱动
是一种虚拟设备驱动
作用:连接Server进程、Client进程、ServiceManager进程
具体实现原理:内存映射 内部调用了mmap()
实际用途:
- 创建数据接收缓存区
- 地址映射

3.3 模型原理步骤说明

3.4 额外说明
说明1:Client进程、Server进程 & Service Manager 进程之间的交互 都必须通过Binder驱动(使用 open 和 ioctl文件操作函数),而非直接交互

说明2: Binder驱动 & Service Manager进程 属于 Android基础架构(即系统已经实现好了);而Client 进程 和 Server 进程 属于Android应用层(需要开发者自己实现)
所以,在进行跨进程通信时,开发者只需自定义Client & Server 进程 并 显式使用上述3个步骤,最终借助 Android的基本架构功能就可完成进程间通信
说明3:Binder请求的线程管理
- Server进程会创建很多线程来处理Binder请求
- Binder模型的线程管理 采用Binder驱动的线程池,并由Binder驱动自身进行管理 而不是由Server进程来管理的
一个进程的Binder线程数默认最大是16,超过的请求会被阻塞等待空闲的Binder线程。
所以,在进程间通信时处理并发问题时,如使用ContentProvider时,它的CRUD(创建、检索、更新和删除)方法只能同时有16个线程同时工作
4 Binder机制 在Android中的具体实现原理
Binder机制在 Android中的实现主要依靠 Binder类,其实现了IBinder 接口
实例说明:Client进程 需要调用 Server进程的加法函数(将整数a和b相加)
即:
- Client进程 需要传两个整数给 Server进程
- Server进程 需要把相加后的结果 返回给Client进程
步骤1:注册服务
-
过程描述
Server进程 通过Binder驱动向Service Manager进程注册服务 -
代码实现
Server进程 创建 一个Binder 对象
1.
Binder 实体是Server进程 在Binder 驱动中的存在形式
2. 该对象保存Server和ServiceManager的信息(保存在内核空间中)
3.Binder 驱动通过 内核空间的Binder 实体找到用户空间的Server对象
注册服务的代码:


4035

被折叠的 条评论
为什么被折叠?



