三个方面回答:进程间通信机制,虚拟物理设备驱动;能发起通信的Java类;
很多一线大厂的APP就是多进程在运行。
- 推送就是一个单独进程,保持连接的稳定性。
- WebView退出不干净,单独进程,在退出WebView时直接杀掉该进程 就不会有内存泄漏了。
Application 的onCreate 会执行多次,初始化第三方库 避免重复初始化。
Linux本身是有进程间通信的,为何基于Linux的Android还要新搞出一个Binder呢?优势何在?
共享内存,Socket,管道(如handler实现原理),消息队列 都是进程间通信;
Socket 拷贝两次 性能最慢。
共享内存 易用性差,例如线程安全问题:例如死锁,线程不同步 何为线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
安全性:为每一个APP分配UID
- 实名:注册的是实名
- 匿名:未注册是匿名,接入支付宝SDK是匿名的
同一进程的不同线程 可以直接访问对象,对象在堆,JVM中方法区和堆都是线程共享的,而不同进程之间无法直接访问对象。 Binder 是如何做到一次拷贝的?
Binder处于进程的内核空间 所有进程的内核空间共享同一块物理内存
内存映射 虚拟内存–>物理内存 类似 地球仪 :地球
Binder优势在于 绕开系统调用(调用一次即拷贝一次),直接在用户空间和内核空间开辟一块共享区域(同一块物理内存,该区域由Binder驱动提供),
正常情况下,开辟虚拟内存,是无法拿到实际存储的物理内存的,是由系统分配存储的。 mmp 虚拟内存绑定了物理内存地址,例如写文件,可以绕开文件对象,直接对物理内存操作。该块物理内存由Binder驱动提供(Binder驱动就是个文件)。
|