Binder 到底是什么?
- binder 是一种进程通信机制
- binder 是一个驱动设备
- Binder.java 实现 IBinder 接口,继承 Binder 类可获得跨进程的能力
为什么要使用多进程?
- 开辟更多的内存:虚拟机可以内存是固定的,创建多个进程可以开辟更多的内存空间
// 获取虚拟机可用内存大小
getprop dalvik.vm.headsize
- 风险隔离
每一个进程理解为一个单独的 APP,一个进程崩溃不会影响其他进程
- Linux 进程通信机制有哪些?
管道、信号量、 socket 、共享内存
Binder 相对于其他进程通信有什么优缺点?
| Binder | 共享内存 | Socket | |
|---|---|---|---|
| 性能 | 需要拷贝一次 | 无需拷贝 | 需要拷贝二次 |
| 特点 | 基于 C/S 架构易用性高 | 控制复杂,易用性差 | 基于 C/S 架构作为一款通用接口,传输效率低,开销大 |
| 安全性 | 为每个 APP 分配 UID 同时支持实名和匿名 | 依赖上层协议访问接入点是开放的不安全 | 依赖上层协议访问接入点是开放的不安全 |
传统进程是怎么通信的?
- 内存划分 内存被操作系统划分成两块,用户空间和内核空间,用户空间是用户程序运行的地方,内核空间是内核代码运行的地方,为了安全,他们是隔离的,即使用户程序崩溃,内核也不受影响。每一个 APP 都会被分配内核空间,不同 APP 的内核空间是共享的,他们的内核空间映射的区域是一样的
- 进程1 A 类怎么调用进程2 B 类的 test 方法? new B().test() ?这样是错的,进程间的内存是隔离的无法这样调用,只有线程间的内存才能共享。
- 传统 IPC 2次数据拷贝
共享内存怎么实现无需拷贝的
发送方、内核和接收方映射相同物理地址,Binder 不使用共享内存方案是因为共享内存控制流程复杂
Binder 是怎么通信?
- 通过 mmap 使接收进程和内核空间映射了相同的物理地址
- mmap的原理 Linux 通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。 mmap 能够让虚拟内存和指定物理内存直接联系起来