Android中的Binder机制到底是什么?

2017-12-06  本文已影响0人  kexinJiao

为何Android使用Binder机制来实现进程间的通信???

1.可靠性:在移动设备上,通常采用基于Client-Server的通信方式来实现互联网与设备间的内部通信。目前linux支持的IPC方式包括传统的管道、消息队列、共享内存、信号量,以及socket,其中只有socket支持Client-Server的通信方式。Android系统为开发者提供了丰富进程间通信的功能接口,媒体播放,传感器,无线传输。这些功能都由不同的server来管理。开发都只关心将自己应用程序的client与server的通信建立起来便可以使用这个服务。毫无疑问,如若在底层架设一套协议来实现Client-Server通信,增加了系统的复杂性。在资源有限的手机 上来实现这种复杂的环境,可靠性难以保证。

2.传输性能:socket主要用于跨网络的进程间通信和本机上进程间的通信,但传输效率低,开销大。消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷贝到内核开辟的一块缓存区中,然后从内核缓存区拷贝到接收方缓存区,其过程至少有两次拷贝。虽然共享内存无需拷贝,但控制复杂。比较各种IPC方式的数据拷贝次数。共享内存:0次。Binder:1次。Socket/管道/消息队列:2次。

3.安全性:Android是一个开放式的平台,所以确保应用程序安全是很重要的。Android对每一个安装应用都分配了UID/PID,其中进程的UID是可用来鉴别进程身份。传统的只能由用户在数据包里填写UID/PID,这样不可靠,容易被恶意程序利用。而我们要求由内核来添加可靠的UID。 所以,出于可靠性、传输性、安全性。android建立了一套新的进程间通信方式。

另外:

对比Linux(Android基于Linux)上的其他进程通信方式(管道/消息队列/共享内存/信号量/Socket),Binder机制的优点有:

高效

Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次

通过驱动在内核空间拷贝数据,不需要额外的同步处理

安全性高

Binder机制为每个进程分配了UID/PID来作为鉴别身份的标示,并且在Binder通信时会根据UID/PID进行有效性检测

传统的进程通信方式对于通信双方的身份并没有做出严格的验证

如,Socket通信ip地址是客户端手动填入,容易出现伪造

使用简单

采用Client/Server架构

实现 面向对象 的调用方式,即在使用Binder时就和调用一个本地对象实例一样

具体实现细节:

Android中的Binder机制由一系列系统组件构成:Client、Server、Service Manager和Binder驱动程序

首先Binder是Android系统进程间通信(IPC)方式之一。

为什么Binder只进行了一次数据拷贝?

Linux内核实际上没有从一个用户空间到另一个用户空间直接拷贝的函数,需要先用copy_from_user()拷贝到内核空间,再用copy_to_user()拷贝到另一个用户空间。为了实现用户空间到用户空间的拷贝,mmap()分配的内存除了映射进了接收方进程里,还映射进了内核空间。所以调用copy_from_user()将数据拷贝进内核空间也相当于拷贝进了接收方的用户空间,这就是Binder只需一次拷贝的‘秘密’。

上一篇下一篇

猜你喜欢

热点阅读