面试准备——Android进程间通信(Binder)
2021-04-24 本文已影响0人
So_ProbuING
大厂APP多进程
我们发现常用的大厂App例如微信、微博、今日头条等在后台查看的时候都会发现后台运行的好几个进程。为什么大厂的App会这么做呢
我们知道App是运行在Android的虚拟机上的,而Android的虚拟机是按照进程分配内存的
也就是说,一个进程占用的内存是由Android系统分配的,无论分配多少,所以一个App的内存是有限的。
那么如果一个App有多个进程的话,相当于App的内存变大了,避免了OOM出现
还有就是 当我们的App奔溃时,如果只有一个进程会导致整个App奔溃。但是如果我们如果有多个进程,当一个进程奔溃时还会有其他进程避免奔溃
进程之间是怎么通信的
进程之间的数据是不共享的,也就是说我们无法在一个进程中使用另一个进程中的数据,那么我们如何来进行通信呢?
![](https://img.haomeiwen.com/i6052465/4f87f14f240008fd.png)
在我们的系统中 不同进程之间的用户空间是互相独立的,进程间的通信机制就是靠内核调用的
Android为什么要使用Binder来进行进程间通信
![](https://img.haomeiwen.com/i6052465/1053c616e8a95158.png)
-
传统的IPC传输数据
传统的IPC传输数据
-
传统的IPC传输数据 在发送数据的时候通过系统调用copy from user()将数据从用户空间copy到内核缓存区,数据copy到内核缓存区后,在接收数据的时候通过系统调用copy.to_user()将数据从内核空间copy到用户空间
-
Binder传输数据
在Binder机制传输数据时,内核调用将要发送的数据copy到内核缓存区,然后在内核中通过MMAP 进行了一个数据映射,也就是说内核空间的copy数据和接收进程映射到了一起,所以可以直接获取到数据
Binder传输数据
-
共享内存
共享内存在进行跨进程数据通信时,将两个进程的数据同时映射在一个内核数据缓冲区。这样就不需要进行数据拷贝了。但是这样相当于2个进程操作一个内存,这样会导致易用性变差 而且存在数据安全问题
AIDL
AIDL是Android的接口定义语言。AIDL可以生成通过Binder实现跨进程通信的代码
![](https://img.haomeiwen.com/i6052465/ed1e779346dbb511.png)