本文为作者学习笔记,如有误,请各位大佬指点
什么是binder?
中文即 粘合剂,意思为粘合了两个不同的进程。
-
从机制、模型角度来说:
- binder是一种Android 实现跨进程通信(IPC)的方式,即Binder机制模型
- 作用是实现跨进程通信。
-
从模型的结构、组成来说:
- 是一种虚拟的物理设备驱动,即binder驱动
- 作用是连接service进程、client进程、service manager进程
-
从Android代码的实现角度来说:
-
是一个类,实现了IBinder接口,即Binder类
-
作用是将binder机制模型以代码的形式实现
-
基础知识
进程空间划分
- 一个进程空间分为 用户空间 & 内核空间(
Kernel
),即把进程内 用户 & 内核 隔离开来,所有进程共用1个内核空间
- 进程间,用户空间的数据不可共享,所以用户空间 = 不可共享空间
- 进程间,内核空间的数据可共享,所以内核空间 = 可共享空间
- 进程内 用户空间 & 内核空间 进行交互 需通过 系统调用,主要通过函数:
-
copy_from_user():将用户空间的数据拷贝到内核空间
-
copy_to_user():将内核空间的数据拷贝到用户空间
进程隔离 & 跨进程通信( IPC )
- 进程隔离
为了保证 安全性 & 独立性,一个进程不能直接操作或者访问另一个进程,即Android的进程是相互独立、隔离的 - 跨进程通信( IPC )
即进程间需进行数据交互、通信
传统的跨进程通信的基本原理
- 流程
- 发送进程通过系统调用copy_from_user(),将需要发送的数据拷贝到内核空间中的缓存区
- 内核服务程序唤醒接收进程的接收线程,通过系统调用copy_to_user()将数据发送到接收进程的用户空间
- 缺点
- 效率低,因为要做两次数据拷贝
- 接收数据的缓存需要接收方提供,它不知道需要多大的缓存,
- 可以开辟尽量大的空间,但是浪费空间。
- 可以先调用API接收消息头获得消息体大小,再开辟适当的空间接收消息头,但浪费时间。
a. 而*
Binder
的作用则是:连接 两个进程,实现了mmap()系统调用,主要负责 创建数据接收的缓存空间 & 管理数据接收缓存
b. 注:传统的跨进程通信需拷贝数据2次,但Binder
*机制只需1次,主要是使用到了内存映射
Binder 跨进程通信机制 模型
模型原理
Binder跨进程通信机制模型基于 Client - Server
模式
-
注册服务(此时,service manager进程就可以拥有service进程的信息)
- service进程向binder驱动发起服务注册请求
- binder驱动将注册请求转发给service manager进程
- service manager进程添加该service进程
Server进程 创建 一个 Binder 对象 1、Binder 实体是 Server进程 在 Binder 驱动中的存在形式 2、该对象保存 Server 和 ServiceManager 的信息(保存在内核空间中) 3、Binder 驱动通过 内核空间的Binder 实体 找到用户空间的Server对象
-
获取服务(client进程就与service进程建立连接)
- client向binder发起获取服务的请求,传递要获取的服务名称
- binder将请求转发给service manager
- service manager查找到client需要的service对应的服务信息
- 通过binder将服务信息返回给client进程
-
使用服务
-
binder为跨进程通信做准备,实现内存映射(调用mmap()函数)
-
client将参数数据发送到service进程
-
service根据client要求调用目标方法
-
service将目标方法的结果返回给client
-
Binder驱动的作用&原理
定义:是一种虚拟设备驱动
作用:连接service进程、client进程、service manager进程的桥梁
具体实现原理:内存映射(即内部调用了mmap()函数)
实际用途:创建数据接收的缓存空间、地址映射
Binder跨进程通信的核心原理
- 流程
- Binder驱动创建一块 接收缓存区
- 实现地址映射关系:根据需要映射的接收进程信息,实现
内核缓存区
和接收进程用户空间地址
同时映射到一个共享接收缓存区。 - 发送进程通过系统调用copy_from_user()发送数据到虚拟内存区
- 由于内存缓冲区、接收进程的用户空间存在映射关系,所以相当于也发送到了接收进程的用户空间地址。
- 优点
- 传输效率高:数据拷贝只有一次、用户空间和内核空间可以直接通过共享对象直接交互
- 为接收进程分配了不确定大小的接收缓存区
优点
对比 Linux
(Android
基于Linux
)上的其他进程通信方式(管道、消息队列、共享内存、
信号量、Socket
),Binder
机制的优点有:
Binder的优点:
- 高性能:能够快速地进行进程间通信。
- 支持多种数据类型:Binder能够支持多种不同类型的数据传输,包括基本数据类型、复杂对象和文件描述符等。
- 低延迟:Binder的通信延迟相对较低,能够满足实时性要求较高的应用场景。
Binder的缺点:
- 复杂性:Binder的实现相对复杂,需要深入了解Android系统和底层通信机制。
- 仅限于Android:Binder是Android系统特有的进程间通信机制,无法直接在其他操作系统或平台上使用。
Socket的优点:
- 跨平台性:Socket是一种通用的网络编程接口,可以跨平台使用,适用于各种操作系统和设备。
- 灵活性:Socket可以用于不同类型的网络通信,包括TCP、UDP等,具有较高的灵活性和通用性。
- 开放性:Socket的标准接口和协议开放,可以自由选择实现方式和扩展功能。
Socket的缺点:
- 需要处理网络细节:使用Socket需要处理网络通信的细节,包括连接管理、数据传输、错误处理等,相对复杂。
- 需要网络支持:Socket需要基于网络连接进行通信,无法在没有网络支持的环境下使用。