面试题记录第二节——(Binder)

时间:2024-05-23 21:50:56

一、问:什么是binder?

答:

a、通常意义上,Binder指的是一种跨进程的通信机制。当然可也以跨线程,由于进程大于线程。所以用Binder来做线程通讯,是大材小用。

b、对于Server进程来说,Binder指的是Binder本地对象/对于Client来说,Binder指的是Binder代理对象。

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


二、问:Linux内核的基础知识?binder机制的出现的原因?

答:

1、进程隔离、虚拟地址空间。

答:我们知道在操作系统中,为了保护操作系统中的某些进程互不干扰,所以他设计了一个叫进程隔离的技术,这个技术就是为了避免进程A可以去操作进程B的情况下所实现的。进程隔离它用到了虚拟地址空间,进程A的虚拟地址空间和进程B的虚拟地址空间是不同的,这样就防止了进程A的数据会误写到进程B中。操作系统当中,不同的进程之间,数据是不共享的,所以对每个进程来说,它认为自己独享了操作系统,其实是一个虚拟的地址空间而已。如果要一个进程与另一个进程通讯,则需要某种进程之间的通讯机制才能完成。也就是Binder机制。在Linux内核当中,有一个特别重要的概念,叫做“系统调用”。

2、系统调用

答:我们对内核会有某些保护机制,来告诉应用程序,你只可以访问某些许可的资源,不许可的资源你是不可以被访问的。这也就是吧Linux的内核层和上层应用程序抽象分离开,也就是内核层和用户空间。 我们用户可以通过系统调用,在用户空间访问内核的某些程序。

3、binder驱动

答:在安卓系统当中,我们知道他是运行在内核空间当中的,它负责各个用户进程,通过binder驱动的内核,来进行交互的模块。驱动程序一般指的是设备的驱动程序,也可以理解为一个软件,操作系统可以通过这个接口可以控制硬件的设备。


三、问:Binder通讯机制介绍?

答:推荐博客:http://blog.****.net/luoshengyang/article/details/6618363/

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


四、问:linux内核拥有非常多的跨进程通讯机制,比如我们熟知的“管道”、Socket,为什么推荐使用binder?

答:这里主要有两点

a、性能:在移动设备上我们知道,广泛的使用跨进程通讯,肯定会对机制本身提出严格的要求,而binder相当于传统的socket方式更加的高效。

b、安全:由于传统的进程之间通讯,对于通讯双方的身份没有做出严格的验证,只有上层协议才会进行架构,也就是说我们socket通讯的话,ip地址是客户端手动填写的,你可以进行认为的伪造。而binder机制,从协议本身就支持通讯双方进行身份校验,这是binder在安全方面所做的努力。在此基础上binder大大的提高了安卓程序的安全性。这binder身份校验也是android的权限模型的基础。


五、问:binder通讯模型是什么?

答:两个运行在用户空间的进程要完成通讯,必须借助内核的帮助,而这个运行在内核中的程序就叫做binder驱动。它的功能,类似与我们现实中电话基站。


六、问:binder通讯机制原理,他是如何进行跨进程通讯的呢?

答:

面试题记录第二节——(Binder)

步骤:首先我们Client,需要调用Server中的add方法。

第一步:Server会到到SM中创建一张查找表,他会告诉SM,Server这里有一个object对象,他这里可以执行一个add方法操作。于是SystemManager就会创建好一张表。

第二步:这个时候Client端来Server端查询,他会查询Server端有没有一个object对象,object对象有没有一个add方法。我们知道进程之间的通讯,他的数据都是在内核空间里。

第三部:这个时候驱动会在数据流的时候做一些手脚,它并不比返回给Client进程一个真正的Server端的Object对象,因为这是无法操作的。他返回的只是一个Object代理对象,而这个代理对象里面包含了一个add方法。但是需要注意的是,这个add方法是一个空方法,它里面什么都没有,他没有办法做add方法的能力,他唯一能做的把这个参数包装好,交给内部驱动来实现。

注意:不过这一层(驱动层)对我们Client端是透明的,这就是分层协议的好处。他不知道驱动所做的,他只知道他拿到了代理对象add方法,就调用这个add方法。我们知道这个add方法是空方法,什么操作都不做。你调用的时候,add方法必然会调用给你binder驱动,而这个时候驱动收到了Client发给他的object对象的add方法,驱动一看就明白了,这在我的SM当中有一张表,这个object的代理对象替换了object对象。所以我们访问的是Server中的object对象中的add方法。于是Binder驱动就会通知Server端来调用Server端的add方法,然后把结果返回给驱动。最后驱动吧数据返回Client。就这样驱动作为Client端和服务端的一个中介,进行了一个进程之间的交互机制。

  • 举例子:比如买火车票,你去车站买票,你就是客户端、售票员就是Binder驱动,电脑是SM,而火车票系统程序就是服务器Server。

第一步:票务系统(Server)中有很多票,我们都可以在电脑(SM)中查找到。

第二步:当你去买票,你会去找售票员(Binder驱动),你不可能直接自己从系统里编出来。

第三部:售票员(Binder驱动)去电脑(SM)中查询有没有你需要的票

第四步:如果有售票员(Binder驱动)就会调用票务系统(Server)来获取这张票的信息。

第五步:售票员(Binder驱动)拿着打印好的车票交给你,注意给你的只是纸张打印的一张票,而不是票务系统(Server)的虚拟数据。这也就是说,你拿到的只是一个代表票务系统(Server)某张信息的票,也就是返回的只是一个Object代理对象。

  • 总结

(1):Server会到到SM中创注册一张表

(2):如果客户端想调用服务端的某个方法,他回到SystemManager中进行查询,是否存在所需要的方法。
(3):Server端会返回给客户端一个代理对象的方法,这个代理对象存在着一个add方法。只不过这个方法不做任何操作。

(4):这个代理对象的add方法的作用,就是当客户端调用这个add方法的时候,他会返回给内部驱动。内部驱动接收到代理对象传递过来的add方法。内部驱动就会知道,他其实想要调用的是服务端的object对象的add方法。此时内部驱动就会调用服务端的object对象的add方法。

(5):调用服务端的add方法获取到结果,结果会返回给内部驱动层,内部驱动从就会把结果返回给客户端。这就是一个完成的跨进程Binder机制原理