请你介绍一下Binder

一、什么是binder

binder是一种IPC(Inter-Process Communication,进程间通信)的通信机制。

二、什么时候要用到进程间通信

WebView的独立进程、推送、进程守护、资源下载以及一些系统服务的进程,例如电话、闹钟、AMS、PMS等等。

三、为什么要使用多进程?

1、减少主进程的内存压力,减少OOM,因为虚拟机给每个进程分配的内存是有限制的,不同的操作系统分配的内存大小不同。
2、还可以防止某个模块出现异常,导致整个应用崩溃。比如下载进程出错,不会影响主进程正常运行。

四、Linux中的IPC机制

Linux系统中内存被划分为两块,用户空间和内核空间,用户空间是用户代码运行的地方,内核空间是内核代码运行的地方。为了安全,它们是互相隔离的,即使用户的程序崩溃了,内核也不受影响。每个进程之间的用户空间也是相互隔离的,若想进行进程间通信,需要借助内核空间。
( 一般32位系统即2^32,总共可访问地址为4GB,内核空间1GB,用户空间3GB。)
Linux中传统的IPC机制有:共享内存、Soket、消息队列、管道等。

进程隔离.png

五、进程间通信为什么要用binder机制?

这个问题相当于问binder机制对比其他的IPC机制的优势。

首先性能方面,我们先看看传统IPC数据访问的方式:

Socket:数据需要拷贝两次,系统调用copy_from_user( ) 从进程A用户空间拷贝数据到内核缓冲区,再调用copy_to_user( )从内核缓冲区拷贝数据到进程B用户空间,完成数据的通信。

Socket通信.png

Binder : 第一步和Socket一样,系统调用copy_to_user将进程A数据拷贝到内核缓冲区,区别来了,binder机制中将内核缓冲区和进程B的接收区内存映射到同一块内存地址,相当于他们共享同一块物理内存,数据从第一步拷贝过来直接放在这块共享内存中,进程B直接从内存中取出数据,就无需二次拷贝的过程了。

Binder通信.png

共享内存: 这个更厉害了,直接把进程A的数据发送区、内核缓冲区、进程B的数据接收区三块内存直接映射到同一个物理地址,连上面第一步的拷贝都省去了,效率杠杠的。

为什么BInder不像共享内存这么干呢?这就要说到第二点易用性了,因为直接共享内存会带来数据同步的问题,如果一处修改了数据,就要保证其他的地方同时接收到这次修改,要做到数据同步需要加锁、处理死锁等等问题,操作难度就增加了,而且加锁的性能消耗也会随之增加。所以Binder在性能上做了取舍,选择一次拷贝的折中方案。

最后从安全性角度考虑,Binder机制为每个APP分配UID,支持通信双方进行身份校验,极大的保障了安全性,而传统的进程间通信对于通信双方的身份没有进行严格的验证。

总结起来就是:

1、性能好,只需要拷贝一次数据。
2、易用性高,减少处理数据同步操作。
3、安全性高,支持通信双方进行身份校验。

IPC对比.png

你可能感兴趣的:(请你介绍一下Binder)