Binder机制

binder
https://www.jianshu.com/p/4ee3fd07da14
https://juejin.cn/post/6844903589635162126
1 binder 是什么☆?
机制:Binder是一种进程间通信机制,在android中实现跨进程通信
驱动:Binder是一个虚拟物理设备驱动,也就是Binder驱动,连接客户端,服务端和ServiceManager进程
应用层:Binder是一个能发起通信的Binder java类实现了IBinder接口,AIDL
2 为什么要用Binder?
大厂大都是多进程的,多进程优势?
进程的运行内存是有限制的。优先回收对系统资源占用多的进程。
突破进程内存的限制
功能稳定性,独立的通信进程保持长链接的稳定性
隔离风险,不稳定的功能放到独立进程,避免主进程崩溃。

进程内存的大小?
getprop dalvik.vm.heapsize

3 进程空间划分
一个进程分为 用户空间 / 内核空间。进程间用户空间数据不可共享,内核空间数据可以共享。
Android 进程间是相互独立隔离的,保证安全,进程间交互是通过系统调用进行的
画图。
那跨进程通信的基本原理是?
发送进程通过系统调用,将需要发送的数据copy到linux进程的内核空间中的缓存区中(copy_from_user,copy一次)
内核服务进程唤醒接收线程,通过系统调用将数据发送到接收进程的用户空间中,(copy_to_user,又copy一次)
缺点:效率低,copy两次;接受数据的缓存要由接收方提供,但是接收方不知道到底多大满足要求,尽可能大。
浪费内存空间,还有就是通过调取api获取消息头信息体大小,浪费时间。

4 Binder的实现:
模型图:注册服务,获取服务,使用服务。
mmap(memory mappin) 内存映射:关联进程中一个虚拟内存和物理内存的对象关联起来,使二者存在映射关系。
如果多进程情况下,虚拟内存和物理内存的共享对象存在映射关系,如果其中一个进程对该对象进程修改,
那其他进程的虚拟内存该对象对应的变化。
对文件进行mmap,会在进程的虚拟内存分配地址空间,创建映射关系。
实现这样的映射关系后,就可以采用指针的方式读写操作这一段内存,而系统会自动回写到对应的文件磁盘
所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。
用户空间通过系统调用让内核空间完成这些功能 提高数据的读写传输时间性能,减少了数据copy次数。用户空间内核空间直接交互。内存读写代替I/O读写,提高内存利用效率,通过共享内存。
Binder核心原理
注册服务:
Service进程向Binder驱动发起服务注册请求
Binder驱动将注册请求转发给ServiceManager
ServiceManager进程添加该Service进程。
ServiceManager 中有Service进程的信息
获取服务:
Client向Binder驱动发起获取服务的请求,传递要获取服务的名称
Binder驱动将该请求转发给ServiceManager进程
ServiceManager进程查找到Client需要的Service对应的服务信息
通过Binder驱动将获取的服务信息返回给Client进程
使用服务:
首先 Binder 驱动在内核空间创建一个数据接收缓存区;
接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,
以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
发送方进程通过系统调用 copy_from_user() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,
因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

3 Binder 有什么优势?
性能:copy 一次,基于C/S架构易用性高,安全性高,每个App分配UID。
4

Binder是如何做到一次copy?
进程:用户空间3G,内核空间1G
2的32次方 4G
虚拟内存,物理内存(内存条)
所有的内核空间都是映射在同一块物理内存,共享的。
用户空间映射在不同的物理内存
虚拟内存和真实内存的联系是通过一种映射
调用copy_from_user copy_to_user 用户空间(用户态),内核空间(内核态)
bindler 客户端一次copy 服务端用copy。
mmap(memory mapping) 内存映射 原理


版权声明:本文为zhangleixman原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。