Binder面试详解

2017-10-20  本文已影响79人  程序猿BOSS

我们知道,Android系统是基于Linux内核的。而Linux的进程又遵循进程隔离机制,导致进程之间不能进行互相通信。 但是,Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制。Binder是一种进程间通信机制,其实是提供远程过程调用(RPC)功能。

在Android系统的Binder机制中,由一系统组件组成,分别是Client、Server、Service Manager和Binder驱动程序,其中Client、Server和Service Manager运行在用户空间,Binder驱动程序运行内核空间。Binder就是一种把这四个组件粘合在一起的粘结剂了,其中,核心组件便是Binder驱动程序了,Service Manager提供了辅助管理的功能,Client和Server正是在Binder驱动和Service Manager提供的基础设施上,进行Client-Server之间的通信。

Service Manager和Binder驱动已经在Android平台中实现好,开发者只要按照规范实现自己的Client和Server组件就可以了。

1、什么是Binder

1.1通常Binder就是一种跨进程的通信机制

1.2对于Server进行来说,Binder指的是Binder本地对象。对于Client来说Binder指的是Binder的代理对象。

1.3对于传输过程而言,Binder是可以进行跨进程传递的对象。

2、Binder通信模型

2.1、ServiceManager的建立,首先有一个进程向驱动提出申请为ServiceManager。而内核驱动同意后ServiceManager就负责管理所以的进程服务

2.2、Server1启动以后就会向ServiceManager进行注册,然后ServiceManager会分配给Server1一个虚拟地址。ServiceManager有一个表对应这个各个服务的名称和地址

2.3、Client和Server1进行通信,首先它会向ServiceManager查询Server1服务,然后ServiceManager会返回Server1代理对象。然后Client通过Binder和Server1进行通信

3、Binder是如何进行跨进程通信

假设Client想要调用Server端返回值是Object的add方法,这就是跨进程通信的机制

3.1Server会向ServiceManager进行注册,告诉ServiceManager我这里有一个返回值是Object的add方法。ServiceManager并把它记录在表里。

3.2Client向ServiceManager进行查询,Server有没有一个返回值是Object的add方法。进程间的通信数据都是在内核空间里,这时候驱动会在数据流的时候做一些封装。ServiceManager并不会真正返回Client端一个真正的Server Object对象,因为它是无法进行操作的(进程的隔离机制)。而是返回一个Server端的代理对象,而这个代理对象中包含了一个add方法。这个add方法是一个空方法这里面什么都没有,它没有进行计算的能力。而这个代理对象要做的就是把数据包装好交给内部驱动来实现。

3.3驱动收到了Client发给他的代理对象add方法,然后去ServiceManager的表里进行查询。这个代理对象替换了Server的add方法,查询到之后驱动会调用Server的add进行计算。Server会把计算结果返回给驱动,然后驱动返回给Client端。

3.4Binder驱动作为Client端和Server端的中介,进行了一个进程间通信的机制。

总结:客户端进程只不过是持有了一个服务端的代理,通过代理对象协助驱动实现了跨进程通信。具体的跨进程通信都是通过代理对象来协助完成的。

上一篇下一篇

猜你喜欢

热点阅读