Binder 原理讲解

423 阅读2分钟

Binder 到底是什么?

  • binder 是一种进程通信机制
  • binder 是一个驱动设备 u=1994414780,1418570804&fm=253&app=138&f=JPEG&fmt=auto&q=75.jpeg
  • 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次数据拷贝

微信图片_20220116104353.png

共享内存怎么实现无需拷贝的

发送方、内核和接收方映射相同物理地址,Binder 不使用共享内存方案是因为共享内存控制流程复杂

Binder 是怎么通信?

  • 通过 mmap 使接收进程和内核空间映射了相同的物理地址

微信图片_20220116113243.png

  • mmap的原理 Linux 通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。 mmap 能够让虚拟内存和指定物理内存直接联系起来