一 概述
IPC全称是Inter-Process Communication跨进程通信,因为Android系统是基于Linux内核,所以对于Android的IPC方式,除了我们最常听说的Binder之外,一些Linux的通信方式也是可以使用的
二 Android中的IPC通信方式
Android中的IPC方式有
- 管道Pipe
- Socket
- 共享内存
- 信号
- Binder(Android特有的)
除了Binder是Android特有的之外,其他几种通信方式都是Linux的,那么这些IPC通信方式之间又有什么区别呢,或者说,在选择IPC方式的时候,应该如何取舍呢
三 不同IPC的区别
管道Pipe
- 管道是Linux是一种IPC方式,在Android中也可以使用,
- 它是将进程A中的数据写到内核,然后在进程B中从内核中读出数据,因为它存在一个读和写的过程,所以它有两次文件拷贝
- 不论是对于读,还是写,都需要一个fd,并且它是半双工的,对于IPC的通信来说,一般一个fd写,一个fd读。
- 分为无名管道和有名管道
- 对于管道这种IPC方式,一遍用于父子进程
Socket
- socket也是一种IPC的方式,它是基于C/S架构
- 它也有两次拷贝
共享内存
- 两个进程可以访问同一块内存
- 可以直接读写,不需要拷贝
- 需要同步机制
信号
- 信号是一个比较特殊的IPC通信方式
- 它只能单向发送,但是可以一对多发
- 发信号时不能带参数
四 Binder
介绍完几种IPC方式,再来说说Android特有的Binder,既然已经有了那么多IPC方式,为什么还需要Binder呢?或者说Binder比起其他的IPC方式来说,要好在什么地方呢
- 首先是效率,上述的其他IPC方式中,大多数需要2次拷贝,而Binder只需要一次拷贝,从读写效率上来说,Binder更高
- 然后是安全,在Android中会有不同进程的通信,很多时候是哪个进程和我们通信,我们自己是没有办法知道的,或者说相关的通信信息是否可靠,是否安全我们也是不能确定的,而Binder则没有这个问题,它从驱动层面为我们解决了这个事情
- 最后是使用上,共享内存的效率不必Binder差,但是它在使用时需要处理各种同步的问题,而Binder不论是Java层,还是native层,我们使用上都非常方便,这也是Android选择BInder的一个原因
五 总结
说了这么多Binder的优势,但是在Android系统中,并不是所有的IPC通信方式都使用的Binder,那这又是基于什么考虑呢?
- 首先,Binder的优势是读写效率高,那么如果我们如果不需要传递太多数据,也可以选择其他的IPC方式
- 其次,BInder是基于多线程的,它有一个Binder线程,所以在一些单线程的情况下,我们也不能使用BInder
- 最后,BInder是一个比较重量级的IPC方式,很多时候我们一些很简单的IPC场景根本用不上Binder,毕竟杀鸡焉用牛刀